c - 让 dyld 链接到可执行文件本身的函数?

标签 c linker clang dynamic-linking dyld

我有一个专门的共享库,它在可执行文件的执行期间动态加载。该库提供函数 b()。此函数依次调用函数 a()

a 函数是在可执行文件中定义的,而不是库本身,因此我希望能够从库中调用一些可执行文件的代码。我已经设法使用 -undefined dynamic_lookup 标志让 clang 保留这些符号用于延迟绑定(bind),但是当我尝试运行可执行文件时 dyld 仍然提示:

dyld: lazy symbol binding failed: Symbol not found: _a
  Referenced from: /usr/local/lib/myLib.dylib
  Expected in: flat namespace

如何链接这个符号?

最佳答案

事实证明,这是由于 Xcode 默认不导出符号造成的。您可以通过更改 LLVM 代码生成build设置下的“默认隐藏的符号”选项来解决此问题。如果您不使用 Xcode,这将控制是否在命令行上使用 -fvisiblity=hidden 标志。

或者,您可以将此选项保持打开状态,并通过将 __attribute__((visibility("default"))) 属性添加到您要导出的函数来选择性地导出符号。

关于c - 让 dyld 链接到可执行文件本身的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14671295/

相关文章:

c - 在 C 中的扫描字符上运行 isdigit()

c - NEON 内在,使用 vshr_n_u32 时编译错误 "argument must be a constant"

c++ - 为什么在这种情况下 g++ 不遵守一项定义规则 (ODR)? 。

makefile - 将 $ORIGIN 添加到 LDFLAGS 时遇到困难

gcc - 我怎么知道 .data 部分需要从哪里获取 init 数据? (gcc 链接器)

clang - clang 命令选项 -lm 是什么意思?

c - 遍历奇数和 2

python - 将几行 C 语言翻译成 Python

c - 为什么 Clang 的汇编器输出是有条件跳转到无条件跳转?

c - 在 C89 的数组声明中使用 sizeof()