版本脚本和隐藏的可见性

时间:2011-11-14 23:44:11

标签: gcc shared-libraries ld

使用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时,我发现没有导出符号。无论如何我可以将默认可见性设置为隐藏并使用版本脚本(或其他东西)导出符号吗?

1 个答案:

答案 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