我有一个exe,其中没有任何代码更改,但我担心它链接到其共享对象上不再存在的符号。我找到了两种测试方法:
ldd -r
在某些情况下,似乎重新连接比运行ldd -r
更快是什么原因?
答案 0 :(得分:0)
在某些情况下,似乎重新连接比运行ldd -r更快是什么原因?
考虑一个简单的案例:main.o
从foo()
调用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
,这一点不应该令人惊讶。