2015-04-01 95 views
7

我能找到的最好的解釋是從官方文檔:什麼是GNU鏈接器中的部分鏈接?

-r --relocateable生成重定位輸出 - 即,生成輸出文件,可以反過來作爲輸入到ld。這通常稱爲 部分鏈接。作爲副作用,在支持標準Unix幻數的環境中,該選項還會將輸出文件的 幻數設置爲OMAGIC。如果未指定此選項,則會生成絕對 文件。當鏈接C++程序時,該選項不會解析對構造函數的引用;要做到這一點,請使用-Ur。此選項 與`-i'的功能相同。

我特別感興趣的是知道鏈接器輸入中出現的符號會發生什麼。當我有一個靜態庫libstatic.a,其中包含一個單一的目標文件component.o。 現在,我想創建另一個靜態庫libfinal.a它將作爲接口工作到libstatic.a。我用這個命令來創建它:

ld -r -o libfinal.a wrapper.o -L. -lstatic

wrapper.o提供專屬API來調用libstatic.a定義的函數

請問libfinal.a只是組合存檔具有wrapper.ocomponent.o或所有可以在wrapper.o之間解析的參考component.o被解析(鏈接),然後放入libfinal.a

Edit_1:更新基於所取得的進展的問題: 的objdump的組件庫libstatic.aobjdump -D libstatic.a)的顯示.text部分分別爲每個功能(如預期)。而在已通過部分鏈接(-r標誌)創建的組合庫libfinal.a中,只有一個.text部分。我想這意味着一個內部鏈接已經發生,它不僅僅是創建一個普通的檔案。

回答

1

ld創建可執行文件和共享庫,而不是目標文件檔案(.a文件)。

ar創建並修改目標文件歸檔。當你想解決.so的某些(未解決)符號,併產生另一個.so


-r, --relocateable選項很有用。

+2

好像'-r'標誌也可以用於部分鏈接。請在問題中查看我的** Edit_1 **。至於驗證,我可以將使用'-r'標誌創建的最終庫鏈接到我的應用程序。 – govind 2015-04-06 11:50:05