我正在通过Cmake使用g++
编译C ++静态库。我想删除与内部实现相关的符号,因此它们不会显示在nm
中。 (有关共享库的信息,请参阅here和here。)
This answer告诉你如何在iOS上做这件事,我试图了解幕后发生的事情,以便我可以在Linux上进行复制。他们使用:
调用ld
-r
/ --relocatable
生成可重定位输出---即生成一个输出文件,该文件又可以作为ld的输入。-x
/ --discard-all
:删除所有本地符号。 AFAICS -r
将所有模块粘合到一个模块中,然后-x
删除仅在该模块内使用的符号。是吗?
目前尚不清楚链接器如何“知道”哪些符号将从外部导出?它是否依赖于__attribute__((visibility("hidden/default")))
案例中的.so
?
编辑:显然我很困惑......我认为cmake调用ld
将.o
链接到.a
。谷歌搜索+澄清上面。
问题仍然存在:如何修改构建过程以排除大多数符号?