使用gcc
构建共享库时,可以使用-fvisibility=hidden
限制符号的可见性。我还刚刚了解到可以使用ld
的version-script选项来限制可见性。
现在,我想知道是否可以将它们组合在一起。说我有一个包含以下内容的程序:
void foobar() {}
void say_hello() {}
然后,我有了以下版本的脚本文件:
{
global:
foobar;
}
我用以下代码进行编译:
gcc -fvisibility=hidden -Wl,--version-script=<version-script> test.c -shared -o libtest.so
之后,我对此运行
nm
时,发现没有导出任何符号。无论如何,我可以将默认可见性设置为隐藏,并使用版本脚本(或其他方式)导出符号吗?
最佳答案
您的问题毫无道理:当可以使用链接描述文件来精确导出所需内容并隐藏其他所有内容时,为什么要使用链接描述文件来与-fvisibility
对抗?
{
global: foobar;
local: *;
};
更新:
Because the code I need to use this on uses
__attribute__((visibility("default")))
...
链接器脚本可以很好地与带有这样标记的符号一起使用。例子:
// t.c
int __attribute__((visibility("default"))) foo() { return 1; }
int bar() { return 2; }
int __attribute__((visibility("default"))) exported() { return 3; }
// t.lds
{
global: exported;
local: *;
};
gcc t.c -Wl,--version-script=t.lds -fPIC -shared -o t.so && nm -D t.so
w _Jv_RegisterClasses
w __cxa_finalize
w __gmon_start__
00000000000004f2 T exported
关于gcc - 版本脚本和隐藏可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8129782/