Joh*_*itb 22 linker visibility elf dynamic-library
我最近在GNU ld中发现了链接器选项"-Bsymbolic-functions":
-Bsymbolic
When creating a shared library, bind references to global symbols to the
definition within the shared library, if any. Normally, it is possible
for a program linked against a shared library to override the definition
within the shared library.
This option is only meaningful on ELF platforms which support shared libraries.
-Bsymbolic-functions
When creating a shared library, bind references to global function symbols
to the definition within the shared library, if any.
This option is only meaningful on ELF platforms which support shared libraries.
Run Code Online (Sandbox Code Playgroud)
这似乎是GCC选项的反转,因为-fvisibility=hidden它不会阻止将引用的函数导出到其他共享对象,而是防止对该函数的库内部引用绑定到不同共享对象的导出函数.我告诉自己,这-Bsymbolic-functions将阻止为函数创建PLT条目,这是一个很好的副作用.
但我想知道是否可能对此进行更精细的控制,例如覆盖-Bsymbolic库的各个函数定义.
我应该知道使用的任何陷阱-Bsymbolic-functions吗?我打算只使用,因为-Bsymbolic会打破例外,我认为(这将让这个引用所属类别的对象不统一,我认为).
谢谢!
Joh*_*itb 22
回答我自己的问题因为我刚刚获得了Tumbleweed徽章......后来我发现了
但我想知道是否可能对此进行更精细的控制,例如覆盖
-Bsymbolic库的各个函数定义.
是的,有一个选项--dynamic-list可以做到这一点
我应该知道使用的任何陷阱
-Bsymbolic-functions吗?我打算只使用它,因为-Bsymbolic会破坏异常,我认为(它会使我们认为对typeinfo对象的引用不统一).
我更加注重它,似乎没有问题.libstdc ++库显然是这样做的,或者至少考虑过它并且它们只需要添加--dynamic-list-cpp-new到仍然operator new统一(以防止多个分配器/解除分配器在程序中混淆的问题,但我认为这样的程序无论如何都会被破坏).Ubuntu使用它或默认使用它,它似乎导致与某些包冲突.但总的来说,我应该很好地工作.
我最近与 SUSE 的一位工具链专家讨论了这个问题。以下是他的言论:
“-Bsymbolic-functions是来自旧世界的东西,现在已经不存在了。它完全绕过了 ELF 可以提供的一切,包括可见性。当你使用它时,一切都在本地绑定。IOW:不要使用它:) 没有人应该使用-Bsymbolic-functions,对于大多数用途来说,它太大了。”
-Bsymbolic-functions与库版本控制 ( )有何关系--version-script?
"-Bsymbolic-functions覆盖任何内容,从链接器脚本、GCC 属性或任何地方,关于符号可见性或任何内容。它使所有内容始终绑定在本地,无论您可能在命令行、额外文件或目标文件上添加了任何其他内容。(是的,--dynamic-list=这是一个错误的尝试来修复其中的一些问题并使其变得-Bsymbolic*更加友好)。所以,是的,它优先于链接器脚本。这是一个大锤子:)“
“更准确地说:-Bsymbolic-functions与链接描述文件全局/本地不太一样,这可能是人们有时仍然使用它的原因。虽然确实将引用-Bsymbolic-functions绑定到本地定义(就像local:在链接描述文件中一样),但它也使它们保持导出(像global:那些)。用 ELF 来说,这有点像受保护的可见性。不幸的是,现在不能用符号版本脚本来表达,只能通过 GCC 来表达__attribute__(visibility)。所以,当人们试图获得本地绑定的速度优势时(更少在库加载时进行符号查找),同时仍然从共享库中导出所有函数,不幸的是,他们常常最终首先发现
-Bsymbolic-functions“做我想要的”,而没有意识到它会产生问题。