Я хотел бы написать тесты для библиотеки 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
, но решение вышеуказанного случая было бы еще лучше.
РЕДАКТИРОВАТЬ: Этокажется безнадежным, но вот идея: предположим, что я компилирую с -O0 -g
, поэтому маловероятно, что square
будет встроенным, и у меня должны быть символы, показывающие, где был разрешен вызов.Есть ли способ проникнуть в объектный файл и обменяться разрешенной ссылкой?