优化弱符号查找 如果你曾经尝试在任何C++程序上使用NM工具,你可能注意到许多符号被标识为“V”或“W”。两者都是不同类型的弱符号
现在,在一个可执行文件中有大量弱符号是不好的,因为在运行时,动态链接器将尝试解析所有弱符号。我在想,通过在链接可执行文件时强制执行一个简单的约定,可以节省大量时间:优化弱符号查找 如果你曾经尝试在任何C++程序上使用NM工具,你可能注意到许多符号被标识为“V”或“W”。两者都是不同类型的弱符号,c++,linux,gcc,llvm,binutils,C++,Linux,Gcc,Llvm,Binutils,现在,在一个可执行文件中有大量弱符号是不好的,因为在运行时,动态链接器将尝试解析所有弱符号。我在想,通过在链接可执行文件时强制执行一个简单的约定,可以节省大量时间: 每当在可执行文件中创建弱符号时,如果该符号具有默认值,则将其升级为常规符号 对我来说,这项技术似乎很安全,因为: 如果任何库定义了具有相同名称的弱符号,它将被提升的弱符号覆盖,这很好,因为对于弱符号,我们可以自由选择任何定义 如果没有库实际定义这样的符号。。。没有什么特别的事情发生 如果库定义了可执行文件中未定义的弱符号,则一
- 每当在可执行文件中创建弱符号时,如果该符号具有默认值,则将其升级为常规符号
- 如果任何库定义了具有相同名称的弱符号,它将被提升的弱符号覆盖,这很好,因为对于弱符号,我们可以自由选择任何定义
- 如果没有库实际定义这样的符号。。。没有什么特别的事情发生
- 如果库定义了可执行文件中未定义的弱符号,则一切正常
在我尝试与binutils开发人员讨论这个问题之前,我是否遗漏了一个巨大的错误?我没有看到任何东西会阻止您所描述的工作 然而,我不知道这是否值得做。我很确定这也是你的“binutils开发者”所想知道的 因此,我建议您看几件事:在典型情况下,同一符号在可执行文件和动态库中定义的频率有多高 由于很可能仍然会留下大量未在可执行文件中定义的弱符号,您实际节省了多少时间 现有程序的一些示例得到了改进,或者至少回答了“对于应用程序X来说,这么多时间平均花在查找弱符号上,这就是潜在收益?”
这就是我作为一名binutils开发人员所期待的(我不是其中之一,但如果我是的话)实际上,我的观点是典型的大规模C++应用程序(我通过研究CLAN编译器的性能来开始研究),大量的弱符号来自可执行文件本身。从可执行文件中提升符号的优点是它们不会被查找,但它们仍然能够覆盖链接库中的最终弱符号,因为这是C++ ODR规则所要求的。我的观点是,你需要证明这是值得做的——对弱符号的引用的数量和节省的时间需要足够大,以便产生明显的不同。我没有看过,但我怀疑“查找”部分在加载过程中并不是很大的一部分,它会带来巨大的节省-但我没有研究细节,我只是建议如果你想这样做,你应该准备好解释在一个真正的[更受欢迎的]应用程序中节省了什么-可能是FireFox或Chrome?