【问题标题】:Linux ELF - Why does normal linking run faster than 'ldd -r'?Linux ELF - 为什么正常链接运行速度比“ldd -r”快?
【发布时间】:2015-06-14 19:11:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux linker shared-libraries ld elf


    【解决方案1】:

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

    考虑一个简单的案例:main.olibfoo.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 也会检查从libfoolibbar 的调用,不是吗?
    猜你喜欢
    • 2015-10-27
    • 2011-04-11
    • 2011-08-27
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2017-02-03
    相关资源
    最近更新 更多