Gcc 版本脚本和隐藏可见性
使用Gcc 版本脚本和隐藏可见性,gcc,shared-libraries,ld,Gcc,Shared Libraries,Ld,使用gcc构建共享库时,可以使用-fvisibility=hidden限制符号的可见性。我还了解到,您可以使用版本脚本选项将可见性限制为ld 现在我想知道是否有可能把这些结合起来。假设我有一个包含以下内容的程序: void foobar() {} void say_hello() {} 然后,我有一个版本脚本文件,其中包含: { global: foobar; } 我用以下方法来编译: gcc -fvisibility=hidden -Wl,--version-script=&l
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
gcc-fvisibility=hidden-Wl,--version script=test.c-shared-o libtest.so
之后,当我在此上运行
nm
时,我发现没有导出任何符号。我是否可以将默认可见性设置为“隐藏”,并使用版本脚本(或其他内容)导出符号?您的问题毫无意义:当您可以使用链接器脚本导出所需内容并隐藏所有其他内容时,为什么要与链接器脚本进行斗争
{
global: foobar;
local: *;
};
更新:
因为我需要在其上使用的代码使用了
\uuuuuu属性((可见性(“默认”))
链接器脚本可以很好地处理标记的符号。例如:
// 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
因为我需要在其上使用的代码有时在代码中使用_属性_((可见性(“默认”))来标记可见性,但有时它依赖于链接器脚本。现在处理这件事的方式只是一个巨大的漏洞,我正试图找出是否有更好的方法。你的问题仍然没有任何意义。您可能希望尝试更好地解释您真正的问题是什么。可见性注释优于链接器脚本,因为它们允许编译器进行更积极的优化。脚本仍然需要完全修整外部库接口,因为这里有一些问题。在这里,它说“有些人可能建议GNU链接器版本脚本也能做到。也许对于C程序来说,这是真的,但是对于C++来说,它不能是真的…”,似乎没有建议使用这个。