我有一个专门的共享库,在执行可执行文件时动态加载。该库提供函数b()
。反过来,此函数调用函数a()
。
a
函数是在可执行文件中定义的,而不是库本身,因此我希望能够从库中调用我的一些可执行代码。我设法使用-undefined dynamic_lookup
标志使clang离开这些符号进行延迟绑定,但是当我尝试运行可执行文件时,dyld仍然会抱怨:
dyld: lazy symbol binding failed: Symbol not found: _a
Referenced from: /usr/local/lib/myLib.dylib
Expected in: flat namespace
如何将此符号链接起来?
答案 0 :(得分:0)
事实证明,这是由Xcode默认导出符号引起的。您可以通过更改LLVM代码生成构建设置下的“默认隐藏的符号”选项来解决此问题。如果您不使用Xcode,则控制是否在命令行上使用-fvisiblity=hidden
标志。
或者,您可以启用此选项,并通过将__attribute__((visibility("default")))
属性添加到要导出的函数中来选择性地导出符号。