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