2015-06-14 45 views
0

我有一个exe文件,其中没有任何代码改变,但我担心它会链接到不再存在于其共享对象上的符号。我发现两种方法来测试:Linux ELF - 为什么正常链接比'ldd -r'运行速度快?

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

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

回答

0

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

考虑一个简单的例子:main.o呼吁从libfoo.sofoo(),并链接如下:

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,并链接到它的每个其他库。

因此,在上述条件下ldldd -r花费的时间要少得多。

+0

但'ld'也检查从'libfoo'到'libbar'的调用,不是吗? – tohava

相关问题