2010-01-14 64 views
2

是否可以鏈接到非外部符號,或將它們轉換爲外部符號?可能鏈接到非外部符號?

我只問,因爲我想要使用的(大)庫有一個夜間構建,但有剝離的符號。我寧願每晚使用,而不是花半天編譯它。

回答

1

剝離庫僅意味着調試符號被剝離。圖書館的其他部分已經到位。鏈接到這樣的庫可能遇到的問題是關於缺少調試符號的鏈接器警告。如果沒有適當的調試符號,可能會遇到另一個問題,那就是沒有適當的調試符號,這很有趣。

對於外部/非外部(你的意思是出口?)符號的問題,如果你鏈接到靜態庫,它不需要定義任何'出口',因爲它被鏈接到你的代碼只是作爲一個大對象文件。鏈接到動態庫,根據您感興趣的平臺而略有不同。在Windows上,您的dll需要聲明您想要使用的函數爲(declspec) __dllexport。在linux上,如果內存爲我服務,則不需要聲明任何類似的內容,並且可以使用.so文件中的函數,就好像它們在代碼中一樣,與靜態庫類似。

更新:

亞歷克斯,我不是100%肯定,但我相信,我寫的關於Linux適用於OS X在這種情況下。只要你有一個帶有函數聲明的頭文件,你應該可以很好地使用它們。如果您在提供的頭文件中沒有某些功能,但有權訪問源,則可以創建自己的頭文件。然而,這是一個非常糟糕的想法,因爲SDK的作者不想讓你訪問這些功能,也不會將它們添加到公共頭文件中,因此它們可以隨時隨意修改它們的功能,可能會讓你留下非工作的代碼,並需要重新編寫/重新設計某些東西。同樣的情況也適用於所有「無證」功能,它們可能會被修改或刪除,如果它導致您的問題,您是唯一有罪的人,也是唯一關心的人。謹慎行事。

+0

對不起,我也不是很具體的。這是一個OSX框架(所以是一個動態庫)。圖書館只出口某些符號 - 其中大多數是「非外部」的。我想知道我是否可以訪問這些非外部符號。 – 2010-01-14 15:00:39

0

不可以鏈接到非外部符號。

根據定義,非外部符號不會從編譯器/彙編器/鏈接器導出。那些符號消失了,從宇宙中消失了,只有連接器看到模塊被鏈接的時候纔會記憶消失。

早在早期的鐵器時代,當計算機仍然由分立晶體管制造時,編譯器和彙編器可以被命令爲每個模塊打印符號表。今天,我們稱之爲「調試信息」,它通常不會被打印,但存儲在調試工具可以在加載模塊中找到的地方。而且正是你的夜晚構建中被剝奪的東西。

你試圖做什麼?如果您試圖訪問庫中顯式非外部的例程(或變量),那麼可能有一個非外部原因。與圖書館的維護人員交談,解釋你爲什麼要訪問這些例程(或變量),並聽他們解釋爲什麼他們不提供這種訪問。

+2

但是符號依然存在 - 如果我做'nm -m WebCore',我可以看到它們,但我不能鏈接到它們(因爲它們是非外部的)。它們之所以是私有的,是因爲WebCore是WebKit的一個傘式框架,而WebKit爲WebCore提供了一個公共API。不幸的是,API只是Objective C,而不是C++,因此我想繞過它。我擔心不可能。 – 2010-01-14 17:07:29

0

我傾向於說不,只要問題是這個將軍。

鏈接器可能會對內部函數執行調用者/被調用者優化,而不能用於外部函數。例如。它可以檢測到呼叫者沒有關心某個寄存器的保存,並且優化了被呼叫者的序列碼中的寄存器的保存。