Linux ELF - 为什么普通链接的运行速度比'ldd -r'快?

时间:2015-06-14 19:11:17

标签: linux linker shared-libraries ld elf

我有一个exe,其中没有任何代码更改,但我担心它链接到其共享对象上不再存在的符号。我找到了两种测试方法:

  • 运行ldd -r
  • 重新链接exe

在某些情况下,似乎重新连接比运行ldd -r更快是什么原因?

1 个答案:

答案 0 :(得分:0)

  

在某些情况下,似乎重新连接比运行ldd -r更快是什么原因?

考虑一个简单的案例:main.ofoo()调用libfoo.so,并且链接如下:

gcc main.o -L. -lfoo

工作量ld必须做的事情:发现正在调用foo,发现它已在libfoo.so中定义,已完成。工作不是很多。

现在假设libfoo.so本身已与libbar.so相关联,并从中调用了10000000个不同的符号。

ldd -r必须做什么?它将首先在a.out中查找任何未解析的符号(只有一个:foo),并在libfoo.so(简单)中找到它的定义。接下来,它必须考虑libfoo.so中的每个未定义符号,并找到所有这些符号的定义(在libbar.so中)。那大约是100万倍。重复libbar.so,并将其他所有库链接到其中。

因此,在上述条件下ld所需时间明显少于ldd -r,这一点不应该令人惊讶。