0
我有一个exe文件,其中没有任何代码改变,但我担心它会链接到不再存在于其共享对象上的符号。我发现两种方法来测试:Linux ELF - 为什么正常链接比'ldd -r'运行速度快?
- 运行
ldd -r
- 重新链接的exe
在某些情况下,它似乎是重新链接比运行ldd -r
究竟是什么原因得更快?
我有一个exe文件,其中没有任何代码改变,但我担心它会链接到不再存在于其共享对象上的符号。我发现两种方法来测试:Linux ELF - 为什么正常链接比'ldd -r'运行速度快?
ldd -r
在某些情况下,它似乎是重新链接比运行ldd -r
究竟是什么原因得更快?
在某些情况下,重新链接似乎比运行ldd -r更快,这是什么原因?
考虑一个简单的例子:main.o
呼吁从libfoo.so
foo()
,并链接如下:
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
花费的时间要少得多。
但'ld'也检查从'libfoo'到'libbar'的调用,不是吗? – tohava