1

如果您曾经尝试在任何 C++ 程序上使用nm实用程序,您可能已经注意到许多符号被标识为“V”或“W”。两者都是不同类型的符号。

现在,在可执行文件中包含大量弱符号是不好的,因为在运行时动态链接器会尝试将它们全部解析。我在想,通过在链接可执行文件时强制执行一个简单的约定,可以节省大量时间:

  • 每当在可执行文件中创建弱符号时,如果此类符号具有默认值,则将其提升为常规符号。

这个 hack 对我来说似乎很安全,因为:

  • 如果任何库定义了同名的弱符号,它将被提升的符号覆盖,这很好,因为对于弱符号,我们可以自由选择任何定义
  • 如果没有库实际上定义了这样的符号......没有什么特别的事情发生
  • 如果库定义了可执行文件中未定义的弱符号,则一切正常。

在我尝试与 binutils 开发人员讨论这个问题之前,我是否遗漏了一个巨大的错误?

4

1 回答 1

0

我没有看到任何可以阻止您所描述的工作的东西。

然而,我确实想知道这是否值得做。而且我很确定您的“binutils 开发人员”也会对此感到疑惑。

所以我建议你看几件事:在典型情况下,在可执行文件和动态库中定义相同符号的频率是多少?

由于很可能仍然存在大量未在可执行文件中定义的弱符号,因此您实际上节省了多少时间?

现有程序的一些改进示例或至少是“对于应用程序 X,平均花费大量时间查找弱符号,这就是潜在收益?”的答案。

这就是我作为 binutils 开发人员所要寻找的 [我不是其中之一,但如果我是的话]。

于 2013-03-04T00:15:23.213 回答