gcc - 版本脚本和隐藏可见性

标签 gcc shared-libraries ld

使用gcc构建共享库时,可以使用-fvisibility=hidden限制符号的可见性。我还刚刚了解到可以使用ld的version-script选项来限制可见性。

现在,我想知道是否可以将它们组合在一起。说我有一个包含以下内容的程序:

void foobar() {}
void say_hello() {}

然后,我有了以下版本的脚本文件:
{
  global:
    foobar;
}

我用以下代码进行编译:
gcc -fvisibility=hidden -Wl,--version-script=<version-script> test.c -shared -o libtest.so

之后,我对此运行nm时,发现没有导出任何符号。无论如何,我可以将默认可见性设置为隐藏,并使用版本脚本(或其他方式)导出符号吗?

最佳答案

您的问题毫无道理:当可以使用链接描述文件来精确导出所需内容并隐藏其他所有内容时,为什么要使用链接描述文件来与-fvisibility对抗?

{
  global: foobar;
  local: *;
};

更新:

Because the code I need to use this on uses __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

关于gcc - 版本脚本和隐藏可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8129782/

相关文章:

c++ - 为什么我需要在 main 里面写 std::ios::sync_with_stdio?

c++ - GCC非法指令

macos - 使用 i386 arch 而非 x86_64 在 OSX 上构建 libFLAC

gcc - 链接共享库绝对与相对路径

linux - 生成文件 NASM 错误 : more than one input file specified

C++11/14/17,GCC 7 与 GCC 8 : Name lookup for friend class templates

c++ - 库中所有符号的显式名称修改(也称为名称修饰)

opengl - 如何在可执行文件和DLL之间使用OpenGL函数指针?

gcc - 在这些情况下,隐藏的 GCC 可见性会做什么?

c - 根据条件执行或跳过 ld.so.preload 共享库代码