2009-10-19 68 views
9

從文檔的描述,他們似乎做同樣的事情,除了支持共享的說:「不是所有的系統」和「只有一些系統」支持符號(現在還不清楚,如果這些是同一套系統):-symbolic和-shared GCC標誌有什麼區別?

共享 生成一個共享對象,然後可以將其與其他對象鏈接到 形式的可執行文件。並非所有系統 都支持此選項。對於可預測的 結果,當您指定此 選項時,還必須指定 用於生成代碼(-fpic,-fPIC或型號 子選項)的相同選項集合。

-symbolic 在構建共享對象時綁定對全局符號的引用。警告 關於任何未解決的引用 (除非被鏈接編輯器 選項-Xlinker -z -Xlinker defs覆蓋)。 只有少數系統支持此 選項。

我懷疑不同的是在「生產,然後可以與其它對象以形成可執行的鏈接的共享對象」的一部分,但是這聽起來像的東西,是任何庫的真。這是否意味着生成的共享對象也可以靜態鏈接?

回答

6

總結:-symbolic防止幀內共享對象函數插入

與共享對象鏈接允許一種稱爲符號插入功能。這個想法是,你可以'設置'全局符號的新定義,以便它被調用,而不是'常規'定義。

一個典型的例子是malloc()。在最常見的情況下,malloc()在libc中定義。但是您可以在加載libc之前加載定義該符號的庫來介入自己的malloc版本(大多數運行時鏈接程序允許您將LD_PRELOAD用於在可執行文件之前加載特定的庫)。

默認情況下,非靜態共享對象內的任何函數都是全局符號。因此,可以在共享對象內插入任何函數。考慮一個共享對象具有函數high_level()和low_level()和high_level()作爲其實現的一部分調用low_level()的方案,並且high_level()和low_level()都不是靜態函數。

可能會設置low_level(),使high_level()從另一個共享對象調用low_level()。

這是-symbolic進來的地方。當創建你的共享對象時,鏈接器將看到low_level()在與high_level()相同的共享對象中定義並綁定調用,使得它不能插入。這樣,您就知道從共享對象中的一個函數到同一個共享對象中的另一個函數的任何調用都不會被插入。

+0

不要像valgrind(也許gprof?)的工具通過插入工作?如果我做了一個符號構建,他們不會工作嗎? – 2009-10-20 15:21:31

+0

Valgrind仍然應該作爲-symbolic來防止共享內部對象,並且不會影響共享內部對象的插入。也就是說,真正重要的是象徵性綁定的符號是Valgrind想要插入的符號。 – 2009-10-20 16:46:18

+1

如果有人再次發生這種情況:這樣做的一個重要結果是,外部變量不再可以跨共享庫邊界工作。 – 2009-10-31 18:53:26

相關問題