版本脚本和隐藏的可见性

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)

  • 可见性注释优于链接描述文件,因为它们允许编译器进行更积极的优化。由于 [libgcc](https://gcc.gnu.org/ml/gcc-help/2018-04/msg00097.html) 和 [ld](https: //sourceware.org/ml/binutils/2018-04/msg00326.html)。 (2认同)