Я хотел бы написать тесты для библиотеки 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, и у меня должны быть символы, показывающие, где был разрешен вызов. Есть ли способ проникнуть в объектный файл и заменить найденную ссылку?