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