2015-06-14 40 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

相關問題