2016-12-29 426 views
4

據說linux loader是/ usr/bin/ld,但通常我們使用gcc/g ++來鏈接庫和可執行文件,我們幾乎不使用「ld」。「gcc鏈接」和「ld鏈接」之間有什麼關係?

我最後一次用「LD」當我學習linux裝配手動爲,以生成可執行的唯一方法是LD .o文件生成可執行的情況下直接任意庫。

我的問題是,是包含「LD」的一些功能包裝GCC/G ++,因爲原始的「LD」是太難用?或者我們不應該明確地使用「ld」作爲c/C++程序鏈接,因爲blablabla?

非常感謝。

+0

另請參閱[當我應該使用ld而不是gcc?](http://stackoverflow.com/q/36680470),[將C++代碼與'gcc'(不含g ++)](http:// stackoverflow。 com/q/1001535)和朋友。 – jww

回答

6

gcc提供了幾個默認選項ld

ld不知道C++,或其他任何語言的任何東西。 ld不知道你的代碼需要鏈接什麼庫。如果您嘗試直接將編譯後的C++代碼與ld鏈接起來,它將會幫助您,因爲ld本身並不知道它在哪裏可以找到gcc的C++運行時庫libstdc++。你使用字符串嗎?引導?其中大部分是作爲對象模塊的一部分進行編譯的模板代碼。但是還有一些預編譯位在libstdc++之內,需要與之鏈接。

當你給gcc編譯的代碼鏈接時,gcc會有禮貌地把你的所有文件一起傳遞給ld,並告訴ld除了你明確指定的那些庫之外,哪些庫。

你可以直接鏈接ld,如果你願意,只要你指定相同的庫和鏈接選項gcc使用。但你爲什麼要這麼做?只需使用gcc鏈接你的gcc編譯的代碼。

2

我的問題是,是包含 「LD」

這是正確的一些功能包裝GCC/G ++。

,因爲原始的 「LD」 是太難用?

嗯,不是真的;你可以自己使用它,但也不會太麻煩,但是通過一個可執行文件,一組標誌以及一個命令來管理整個構建過程是很方便的。

如果你繞過了包裝器(儘管我沒有測試過),你也可能必須自己提供一些運行時庫(例如libstdC++。a)的絕對路徑。

或者我們不應該明確地使用「ld」作爲c/C++程序鏈接,因爲blablabla?

你可以自由地做,如果你想要的。人們可能會揚眉吐氣的唯一原因是問你爲什麼不按傳統方式做。如果您有充分的理由直接調用ld,而不是通過g++並通過任何鏈接器標誌,那就馬上行動吧!

2

您不應該嘗試直接使用ld來鏈接C++程序,因爲您需要知道C++運行時庫靜態部分所在位置的實現細節。 g++知道這些實現細節,例如在哪裏可以找到文件libstdc++.a。如果您試圖直接使用ld,則必須提供所有這些「缺失」的靜態庫。

+0

你的意思是,即使我們默認使用libstdC++,那麼libstdC++裏面仍然有一些內容被靜態鏈接到我們的可執行文件中?這些內容在做什麼?謝謝。 – Troskyvs