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