c++ - 从静态库中隐藏符号
问题描述
我有一个 c++ 共享库 - libA.so
. -fvisibility=hidden
我使用标志隐藏符号。应该可见的符号具有以下属性:__attribute__ ((visibility ("default")))
. 该库链接到静态库 - libB.a
. 该静态库 ( ) 中的所有符号libB.a
应仅对共享库 ( libA.so
) 可见。我也用 flag 编译了静态库-fvisibility=hidden
。我得到了想要的结果 - 来自的符号libB.a
只对外界可见libA.so
但对外界隐藏,例如以下命令nm -C libA.so
不显示来自libB.a
.
您能解释一下-fvisibility=hidden
在上述场景中标志如何在内部与静态库一起工作吗?
解决方案
添加了可见性功能以支持共享库的限制接口,即减少导出函数的数量。默认情况下(不带-fvisibility=hidden
)链接器将导出库中的所有函数,在大多数情况下,这不是您想要的。
在静态库链接期间,可见性被忽略,即当libB.a
从它链接和拉取函数时,链接器根本不会查看可见性注释。另一方面,在函数被(从libB.a
)拉入最终共享库(libA.so
)之后,它们将被导出并污染 libA 的接口,除非您-fvisibility=hidden
在编译静态库本身时隐藏了它们。
推荐阅读
- java - 谁能告诉我为什么这些方法在第一次方法调用后没有运行?- 爪哇
- android - 从 Arraylist 中获取索引为 0 的数据
- netsuite - 使用 SuiteScript 填充转移订单
- angular - 如何避免 NPM EACCES:权限被拒绝?
- multithreading - 使用 Powershell 作业更新 WPF GUI
- scala - Spark Scala - 当前日期和最大值(天)之间的差异
- sql - 上个月的 SQL 结转
- netflix-zuul - zuul java.io.EOFException:在套接字上读取了意外的 EOF
- python - AWS:包含的无服务器解决方案
- api - 嵌套关系 wagtail api