更改 OS X 上隐藏符号的可见性

Changing visibility of hidden symbols on OS X

我在我的应用程序中使用了第 3 方静态库(这意味着我无法重新编译它)。 这个库是使用 -stdlib=libstdc++ 构建的,即与 macOS 版本 < 10.9 的兼容性:从这个版本开始,默认情况下 stdlib=libc++。 但这意味着我的所有应用程序代码都必须使用 -stdlib=libstdc++ 构建,这使我无法使用某些 C++11 功能。

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

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

我设法仅使用 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

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