我想弄清楚我是否可以构建一个隐藏其所有内部对象和函数等的静态库,除了我要导出的接口.我正在尝试使用Xcode(gcc 4.2).
我__attribute__((visibility("hidden")))根据这个文档在一些C++类上使用了该属性.我还将小辅助C函数定义为文件本地(静态)等.
但是,当我运行strings生成的.a库文件时,即使在Release配置中编译,我仍然会看到表面上隐藏的类的名称,以及它们的方法名称,甚至是那里散布的文件本地函数的名称同样.
我已经添加了-fvisibility=hidden甚至-fno-rtti是gcc标志.虽然这减少了一些字符串,但类名,方法名和静态函数名仍然以简单或错误但可读的形式存在.
是否有一种可靠的方法让编译器构建这些东西而不必将所有内部内容的字符串名称发送到二进制文件中?没有必要为任何外部客户端链接.
(澄清一下:我问的是内部命名的混淆,以及文字导出绑定的需要.我很遗憾所有内部工作都可以通过strings命令看到,无论这些符号是否正式导出.)
谢谢.
我有一个共享库项目,它由4个静态库(.a)和一个object(.o)文件构成.我正在尝试添加-fvisibility=hidden选项以将输出中的符号限制为仅使用__attribute__在源中标记的符号.
我已经-fvisibility=hidden为.so项目的编译选项(包括.o文件)和项目添加了选项.a.
目标文件中的符号将按照预期从最终中删除.so.但是,.a项目中的符号仍然在最终.so文件中.将-fvisibility=hidden选项添加到.solink命令无效.
我究竟做错了什么?
我的目的是从.so除了接口函数之外的所有符号中删除库.
编辑:我实际上使用版本地图来解决这个问题.但是,随着外部符号的更改,它需要继续维护版本脚本.接受的答案有更好的主意.