我有一个链接到共享库的程序libfoo
。我想从我的程序内部覆盖其中一个函数,以便从libfoo
内部对该函数的内部调用libfoo
解析为我的程序中的定义。(对于上下文,我的意图是模拟库函数进行测试。)
这个问题与这个问题有点相关:共享库中的符号查找。这是该问题的示例:
// foo.c
void dispatch_write_hello(void) {
fprintf(stderr, "hello\n");
}
void print_hello(void) {
dispatch_write_hello();
}
// main.c
extern void print_hello(void);
void dispatch_write_hello(void) {
fprintf(stderr, "overridden\n");
}
int main(int argc, char **argv) {
print_hello();
return 0;
}
这是它在 linux 上的作用:
$ clang -shared -fPIC foo.c -o libfoo.so
$ clang main.c -L. -lfoo
$ LD_LIBRARY_PATH=. ./a.out
overridden
这是我想要的行为,但在 macOS 上我得到了这个:
$ clang -dynamiclib -fPIC foo.c -o libfoo.dylib
$ clang main.c -L. -lfoo
$ ./a.out
hello
如何在 macOS 上实现 linux 示例的行为?最好我想要一种适用于 linux 和 macOS 的方法,但我想如果我需要使用 macOS 特定的构建标志和/或环境变量也没关系。