【问题标题】:Symbol interposition on macOSmacOS 上的符号插入
【发布时间】:2023-03-28 21:40:02
【问题描述】:

我有一个链接到共享库libfoo 的程序。我想在我的程序中覆盖来自libfoo 的函数之一,以便从libfoo 中对该函数的内部调用解析为我的程序中的定义。 (对于上下文,我的意图是模拟库函数进行测试。)

这个问题与这个问题有点相关:symbol lookup in shared libraries。这是该问题的示例:

// 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 特定的构建标志和/或环境变量也没关系。

【问题讨论】:

    标签: c gcc clang function-interposition library-interposition


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-10-19
      • 2017-12-23
      • 2018-10-17
      • 2013-01-11
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多