【发布时间】:2015-06-14 19:11:17
【问题描述】:
我有一个 exe,其中没有任何代码更改,但我担心它链接到其共享对象上不再存在的符号。我找到了两种测试方法:
- 运行
ldd -r - 重新链接 exe
在某些情况下,重新链接似乎比运行ldd -r 更快,这是什么原因?
【问题讨论】:
标签: linux linker shared-libraries ld elf
我有一个 exe,其中没有任何代码更改,但我担心它链接到其共享对象上不再存在的符号。我找到了两种测试方法:
ldd -r
在某些情况下,重新链接似乎比运行ldd -r 更快,这是什么原因?
【问题讨论】:
标签: linux linker shared-libraries ld elf
在某些情况下,重新链接似乎比运行 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 中)。这大约是困难的 1000000 倍。对 libbar.so 以及链接到其中的所有其他库重复此操作。
那么在上述条件下ld 将花费比ldd -r 更少的时间也就不足为奇了。
【讨论】:
ld 也会检查从libfoo 到libbar 的调用,不是吗?