我想弄清楚我是否可以构建一个隐藏其所有内部对象和函数等的静态库,除了我要导出的接口.我正在尝试使用Xcode(gcc 4.2).
我__attribute__((visibility("hidden")))根据这个文档在一些C++类上使用了该属性.我还将小辅助C函数定义为文件本地(静态)等.
但是,当我运行strings生成的.a库文件时,即使在Release配置中编译,我仍然会看到表面上隐藏的类的名称,以及它们的方法名称,甚至是那里散布的文件本地函数的名称同样.
我已经添加了-fvisibility=hidden甚至-fno-rtti是gcc标志.虽然这减少了一些字符串,但类名,方法名和静态函数名仍然以简单或错误但可读的形式存在.
是否有一种可靠的方法让编译器构建这些东西而不必将所有内部内容的字符串名称发送到二进制文件中?没有必要为任何外部客户端链接.
(澄清一下:我问的是内部命名的混淆,以及文字导出绑定的需要.我很遗憾所有内部工作都可以通过strings命令看到,无论这些符号是否正式导出.)
谢谢.
我们最近被要求发布我们的一个库的Linux版本,以前我们在Linux下开发并发布用于Windows,其中部署库通常要容易得多.我们遇到的问题是将导出的符号剥离到只有暴露界面中的符号.想要这样做有三个很好的理由
举一个简单的例子:
TEST.CPP
#include <cmath>
float private_function(float f)
{
return std::abs(f);
}
extern "C" float public_function(float f)
{
return private_function(f);
}
Run Code Online (Sandbox Code Playgroud)
用(g ++ 4.3.2,ld 2.18.93.20081009)编译
g++ -shared -o libtest.so test.cpp -s
Run Code Online (Sandbox Code Playgroud)
用符号检查符号
nm -DC libtest.so
Run Code Online (Sandbox Code Playgroud)
给
w _Jv_RegisterClasses
0000047c T private_function(float)
000004ba W std::abs(float)
0000200c A __bss_start
w __cxa_finalize
w __gmon_start__
0000200c A _edata
00002014 A _end
00000508 T _fini
00000358 T _init
0000049b T public_function
Run Code Online (Sandbox Code Playgroud)
显然不足.接下来我们重新宣布公共职能为
extern "C" float __attribute__ ((visibility ("default")))
public_function(float f)
Run Code Online (Sandbox Code Playgroud)
并编译
g++ …Run Code Online (Sandbox Code Playgroud) 我正在寻找限制导出到Linux静态库(存档)的C符号数量的方法.我想将这些仅限于那些属于该库官方API的符号.我已经使用'static'将大多数函数声明为static,但是这会将它们限制为文件范围.我正在寻找一种限制图书馆范围的方法.
我可以使用Ulrich Drepper的" 如何编写共享库"中的技术为共享库执行此操作,但我无法将这些技术应用于静态存档.在他早期的图书馆设计良好实践论文中,他写道:
唯一的可能性是使用'ld -r'将需要某些内部资源的所有目标文件合并为一个,然后限制由此组合目标文件导出的符号.GNU链接器可以选择执行此操作.
谁能帮助我发现这些选项可能是什么?我使用'strip -w -K prefix_*'取得了一些成功,但这感觉很野蛮.理想情况下,我想要一个适用于GCC 3和4的解决方案.
谢谢!
我想使用GNU LD版本脚本来隐藏c ++共享库中不需要的符号。说我的头文件看起来像这样:
int a();
int a(int);
class B {
B(){}
~B(){}
int x(int);
};
std::ostream& operator<< (std::ostream& out, const B& b );
Run Code Online (Sandbox Code Playgroud)
我想隐藏所有未在头文件中说明的内容。
版本脚本的外观如何?