【问题标题】:version-script and hidden visibility版本脚本和隐藏可见性
【发布时间】:2011-12-29 02:38:16
【问题描述】:

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

【问题讨论】:

  • 在这里gcc.gnu.org/wiki/Visibility,它说“有些人可能会建议GNU链接器版本的脚本也可以做到这一点。也许对于C程序这是真的,但对于C++它不可能是真的...... ",似乎不建议使用这个。

标签: gcc shared-libraries ld


【解决方案1】:

您的问题毫无意义:当您可以使用链接器脚本准确地导出您需要的内容并隐藏其他所有内容时,为什么要使用链接器脚本来对抗-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

【讨论】:

  • 因为我需要使用它的代码有时在代码中使用 __attribute__((visibility("default"))) 来标记可见性,但它有时依赖于链接描述文件。现在的处理方式只是一个巨大的黑客攻击,我正在尝试找出是否有更好的方法来做到这一点。
  • 你的问题仍然没有任何意义。您可能想尝试解释您的真正问题更好。
  • 可见性注释优于链接器脚本,因为它们允许编译器进行更积极的优化。由于libgccld 中的问题,仍然需要脚本来完全修剪外部库接口。
猜你喜欢
  • 1970-01-01
  • 2012-05-10
  • 2015-05-25
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多