Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 版本脚本和隐藏可见性_Gcc_Shared Libraries_Ld - Fatal编程技术网

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++来说,它不能是真的…”,似乎没有建议使用这个。