【发布时间】:2020-08-22 04:30:05
【问题描述】:
我有一个带有 C API 的 C++ 库,并且我设置了 -fvisibility=hidden 编译器标志,
然后我在 C API 方法上设置了__attribute__ ((visibility ("default")))。
但是,我仍然看到可见的 C++ 符号。当我为我的库创建一个 debian 包时, 我得到以下symbols file
为什么这些符号仍然可见?
【问题讨论】:
-
它们是进口符号吗?你不能隐藏这样的符号
-
谢谢,我在库中有一个静态 C++ 11 线程池,这些符号似乎在引用该线程池。
-
您应该通过
c++filt运行您的符号文件,它将“损坏的”符号名称转换为可读的名称[在c++意义上]。如果这样做,您会发现三分之二的符号是std::whatever,而不是your 符号。因此,由于 STL,他们被拉进来。你可能无法控制它们。如果有帮助,其他符号是grk_*。 -
啊啊啊,好的。那么,我应该将过滤后的符号文件作为 lib*.symbols 文件吗?这是脚本:
sed 's/ \(_.*\) \(.*\)/ (c++)"\1" \2/' libgrokj2k.symbols | c++filt -
有一些目标文件实用程序(例如
readelf、objdump、objcopy等)可以让您编辑/修补您的目标文件。或者,您可以使用链接描述文件。或者,您可以使用-S进行编译以获取.s文件。然后,您可以编写一个 [perl/python] 脚本来修改 asm 源并添加/更改您需要更改可见性的任何属性。然后,只需:c++ -c modified.s
标签: c++ c gcc clang shared-libraries