2012-03-27 203 views
3

我正在使用Linux 2.6.35的ARM系統上運行預鏈接。我正在使用Glibc 2.12.2。我想預先鏈接我的庫和應用程序可執行文件。但是,我似乎無法鏈接任何直接依賴glibc的東西。當預鏈接試圖與/lib,它錯誤用完:預鏈接錯誤:佈局錯誤:數據段大小太小

Could not write /lib/libc-2.12.2.so: Layout error: section size too small for data 

有我的方式來解決這個問題或者是說服預鏈接預鏈接除了什麼駐留在/lib一切嗎?我知道/etc/prelink.conf中的黑名單功能,但之後prelink會出錯,因爲它無法找到位於該目錄中的依賴項。

編輯:

這裏是我的prelink.conf

 
~ # cat /etc/prelink.conf 
-h /usr/local/Qt-4.7.4/lib 
-h /usr/lib 
-h /lib 
-h /usr/local/dbus/lib 
-h /usr/local/sqlite/lib 
-h /usr/local/ncurses/lib 
-h /usr/local/expat/lib 
-h /usr/local/ssl/lib 

我是通過飛思卡爾的i.MX51的平臺上。它是一個ARM Cortex-8。因爲我已經使用開發工具包附帶的GCC/G ++版本編譯了所有內容,所以我假定ELF二進制文件是32位的。

編輯:

我改變了-h標誌,以-l的和移動的系統庫到列表的前面。我仍然得到同樣的錯誤。

我在設備上運行預鏈接,而不是在我的交叉構建機器上運行。

LD_LIBRARY_PATH包含/ lib和/ usr/lib目錄

試圖運行預鏈接爲: 預鏈接-a 預鏈接-amR

,得到了相同的結果是雙向的。

我正在運行gcc 4.4.6交叉編譯器。 我正在運行ld 1.12.1 ld。

+2

雖然從源代碼構建軟件是話題在這裏,你就更有可能找到[所以專家],特別是當你建立自己的程序時。所以我正在標記這個問題的遷移(不要轉貼)。 – Gilles 2012-03-27 21:39:07

+0

好的,沒問題。由於這個問題實際上並不涉及編寫任何代碼,我認爲SO MOD將會在這裏重新定位它。我想我在那裏有更好的機會,但想按規則發揮。謝謝您的幫助。 – 2012-03-27 23:45:56

回答

2

錯誤Layout error: section size too small for data在以下行中的libelf中調用https://github.com/path64/compiler/blob/master/src/libelf/lib/update.c#L230

這得到由預鏈接在write_dso

if (elf_update (dso->elf, ELF_C_WRITE) == -1) 
    return 2; 

write_dso叫得到由update_dso其獲取預鏈接的main.c與其他一些地方一起被稱爲調用。

發生這種情況是因爲要重新定位的部分數據的大小大於要重定位到的部分大小。

你正在運行什麼prelink命令?

你的prelink.cache是​​什麼?

你的二進制文件/庫ELF32或ELF64?

文件實用程序會告訴你。

什麼是gcc版本,binutil版本,libelf和prelink版本?

gcc -V會告訴你。隨着ld -Vprelink -V

什麼是您的LD_LIBRARY_PATH

setenv命令會告訴你。

glibc編譯了哪些選項?特別關於-fPIC?

您是否在設備上運行預鏈接?或者在交叉編譯環境中?

爲什麼您的預鏈接配置沒有-l行? -h行跟隨符號鏈接可能不是你想要的,如果你的編譯根在庫目錄中有符號鏈接?通常,/ lib和/ usr/lib條目首先在prelink.conf中,例如here

您是否正在使用-m開關運行prelink以交換虛擬內存? 如果你將/ lib中的所有內容列入黑名單,那麼我相信你不能預先鏈接任何鏈接到/ lib庫中的庫或二進制文件,類似地,如果你將黑名單/lib/libc-2.12.2.so列入黑名單,那麼你不能預鏈接對任何鏈接到它的東西,作爲一個預先鏈接的文件需要它的圖書館以及鏈接。

至於一個可能的修復,沒有更多的信息,很難說,但它可能與傳遞給預鏈接的不正確開關或在預鏈接緩存或配置文件中的相同目錄中混合32位或64位庫有關。

的鏈接和預鏈接的更多信息,avaliable

+0

謝謝。當我幾天後回到開發機器時,我可以回答這個問題。 – 2012-03-31 22:08:30

+0

我已經更新了我的問題,並提供了大部分要求提供的信息。我沒有爲這個平臺構建glibc。它出現在我刻錄到閃存的​​根文件系統上。我如何確定它所編譯的-fPIC選項? – 2012-04-02 12:14:51

+0

抱歉,系統未通知編輯,因此我沒有注意到您已更新。我會在稍後查看並回復你。 – 2012-04-04 18:13:32