0

我有一个链接到共享库的程序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 特定的构建标志和/或环境变量也没关系。

4

1 回答 1

0

我能够通过-Wl,-flat_namespace在构建库时添加来实现这一点。

(我还尝试了一些来自互联网的其他民间传说,包括-Wl,-force_flat_namespace链接程序时,或使用 运行程序DYLD_FORCE_FLAT_NAMESPACE=1,但似乎都不起作用。)

于 2021-04-25T05:29:41.110 回答