Я хотел бы написать тесты для библиотеки C, в C. Я хотел бы издеваться над некоторыми функциями для теста.
Предположим, что моя библиотека скомпилирована из следующего источника:
/* foo.h */
int myfunction(int x, int y);
/* foo.c */
#include "foo.h"
static int square(int x) { return x * x; }
int myfunction(int x, int y) {
return square(x) + square(y);
}
Я хочу написать тест следующим образом:
/* foo_test.c */
#include "foo.h"
static int square(int x) { return x + 1; }
int main(void) {
assert(myfunction(0, 0) == 2);
return 0;
}
Можно ли каким-либо образом скомпилировать, чтобы myfunction
использовал определение square
в foo_test.c
вместо имени в foo.c
только при связывании исполняемого файла foo_test
? То есть, я хочу скомпилировать foo.c
в библиотеку (пусть ее называют libfoo.so
), а затем скомпилировать foo_test.c
с помощью libfoo.so
и некоторой магией, чтобы получить исполняемый файл foo_test
, который использует разные реализация square
.
Было бы полезно услышать решения, если square
не объявлен static
, но решение вышеприведенного случая было бы еще лучше.
EDIT: кажется безнадежным, но вот идея: предположим, что я скомпилирую с -O0 -g
, поэтому маловероятно, что square
получит inline, и у меня должны быть символы, показывающие, где был разрешен вызов. Есть ли способ проникнуть в объектный файл и заменить найденную ссылку?