【问题标题】:Changing visibility of hidden symbols on OS X更改 OS X 上隐藏符号的可见性
【发布时间】:2018-03-20 14:47:20
【问题描述】:

我在我的应用程序中使用了第 3 方静态库(这意味着我无法重新编译它)。 该库是使用 -stdlib=libstdc++ 构建的,即为了与 macOS 版本 stdlib=libc++。 但这意味着我的所有应用程序代码都必须使用 -stdlib=libstdc++ 构建,这使我无法使用某些 C++11 功能。

所以我尝试将此静态库转换为共享库,但随后符号不可见。 实际上,使用 nm 我可以看到它们被标记为 t 而不是 T,这在静态链接时似乎没问题,但在动态链接时却不行。

我想将我需要的符号的可见性更改为全局。 我不确定如何在 macOS 上实现它,因为 objcopy 在这里不可用(它作为一个名为--globalize-symbol 的选项似乎可以满足我的需求,根据this SO answer

【问题讨论】:

  • objcopybinutils 的一部分,[AFAICT] 可用于 macOS。来自源代码或:macappstore.org/binutils 在“binutils mac OS”上进行网络搜索会产生其他链接

标签: c++ c macos shared-libraries visibility


【解决方案1】:

我设法仅使用 ld 解决了这个问题。

ld -r lib.a -o new_lib.a -alias _old_function_name _new_function_name

以这种方式导出的符号被标记为全局。 不可能在一次调用中重用相同的名称,但这是在这样做两次时,即 _function(t) -> function(T) -> _function(T)

然后我只是使用类似的东西构建了我的共享库: g++ -fpic -shared -Wl,-force_load new_lib.a -stdlib=libstdc++ -o lib.dylib

唯一困扰我的是,在创建新的全局符号时,我没有找到如何删除旧符号,但这似乎没有造成任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-27
    • 2010-11-02
    • 2013-12-01
    • 2012-05-10
    • 1970-01-01
    • 2014-12-07
    • 2013-06-01
    • 2013-12-28
    相关资源
    最近更新 更多