使用gcc
构建共享库时,可以使用-fvisibility=hidden
限制符号的可见性。我还了解到,您可以使用ld
的版本脚本选项限制可见性。
现在我想知道是否可以将这些结合起来。假设我有一个包含以下内容的程序:
void foobar() {}
void say_hello() {}
然后我有版本脚本文件:
{
global:
foobar;
}
我用以下内容编译:
gcc -fvisibility=hidden -Wl,--version-script=<version-script> test.c -shared -o libtest.so
当我在此之后运行nm
时,我发现没有导出符号。无论如何我可以将默认可见性设置为隐藏并使用版本脚本(或其他东西)导出符号吗?
答案 0 :(得分:9)
你的问题毫无意义:为什么要用链接描述文件来对抗-fvisibility
,当你可以使用链接描述文件完全你需要的东西,并隐藏其他一切:
{
global: foobar;
local: *;
};
更新
因为我需要使用此代码的代码使用
__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