2012-09-15 14 views
2

是否有可能預加載靜態鏈接的符號?預加載靜態鏈接的C符號

在linux中,我可以使用

LD_PRELOAD=libSomeLibrary.so ./anExecutableLinkedToAnOtherLibrary

但是這隻能當符號動態鏈接。現在,我需要將一些符號注入可執行文件,其中符號靜態鏈接到其他庫。

我知道在一般情況下,這在理論上是不可能的,因爲靜態符號甚至可能已經內聯。但是如果我們有一個沒有優化和全面調試符號的調試版本,理論上應該可以在正確的位置注入我們的符號。

我對Linux和Windows世界的答案都很感興趣,但即使只是在linux下解決這個問題也足夠了。

+0

這是有點不清楚你想要做什麼。你想加載一個對象文件/靜態庫嗎?你可以隨時構建一個.so。 –

+0

我想要做的是這樣的:我有一個可執行文件,它調用一些庫函數,並且它們是靜態鏈接的。我想以某種方式重寫這些函數而不重新編譯可執行文件。 – enobayram

+0

靜態鏈接一個函數是什麼意思?你有這些函數的靜態庫嗎?如果是這樣,它們根本就沒有鏈接,只是存儲在庫中以便以後連接。 –

回答

2

靜態符號沒有預加載機制,因爲ld.so沒有用於它們。操作系統只是將文件映射到內存中並開始執行它。

您可能可以修改二進制文件以包含庫的新版本。一種方法是使用objcopy去掉舊符號,然後用ld去鏈接新符號。

+1

感謝您的回答,我已經嘗試了您的建議,但不起作用。我已經成功地刪除了符號(readelf -s不顯示它們),但重新鏈接不起作用。我認爲這些符號不是內部使用的。 – enobayram