2012-10-12 32 views
3

我正在使用嵌入式powerpc(e500v2)平臺。我正在交叉編譯用gcc 4.6.3和eglibc 2.13編譯。有一個swig庫被編譯並加載到目標上。當其在python加載我在回溯收到此錯誤:R_PPC_REL24重新安置超出範圍

ImportError: /opt/load/lib/libISSDcn.so: R_PPC_REL24 relocation at 0x0ddc99c0 for symbol `longjmp' out of range 

我以前有這個庫的鬥爭,我從Python 2.5的遷移對我們的目標2.7。當我最初試圖編譯這個庫時,在編譯時我得到了重定位錯誤或操作數超出範圍錯誤,這取決於我使用的標誌。我切換到gcc 4.6.3,現在它建立,但我得到這個錯誤時,它的加載。

我想了解錯誤,但到目前爲止,我在黑暗中的確切含義以及如何解決它。由於某種原因我找不到符號,但我不明白爲什麼,或者如何解決它。

回答

4

R_PPC_REL24重定位用於24位相對偏移量。這種類型的重定位不應出現在動態重定位表中(這些表示用於可加載對象內的引用,而不是在它們之間,因爲庫可以加載到超過16 MiB的地址)。

默認情況下,編譯器會盡可能生成這些reloc,因爲它比使用完整的32位地址小得多,代碼速度更快,但對於動態鏈接,需要使用完整地址用於外部可見符號和PIC/GOT條目產生。

檢查-fPIC標誌是否用於構建庫,並且鏈接器還被通知它正在構建共享對象(通常通過-shared-Bshared)。

+0

好的,謝謝我在其他地方看過的。我被告知這個圖書館是用fPIC編譯的,但它當然可能不是。如果圖書館是或不是PIC,有沒有辦法告訴事實呢? –

+0

或者我可以問的另一個問題是,如果我做了readelf -r我應該期望在共享對象中看到R_PPC_REL24嗎?我看到很多人。或者這個列表是否包含非外部符號? –

+0

PIC庫不應該將動態重定位應用於除PIC和GOT區域之外的任何其他應用,並且所有這些重定位應該能夠覆蓋整個地址空間。 –