2012-01-12 30 views
5

我在我的x86 Linux上爲嵌入式系統(mipsel)提供了一個交叉編譯工具鏈。我知道如何建立一個定製的內核(我們稱之爲形象「的vmlinux」),它和如何通過確定加載地址和剝離的Linux內核映像的入口點

objcopy -S -O binary vmlinux vmlinux.bin 

作進一步處理我還需要圖像的加載地址和切入點剝離的形象。 之前剝離就沒有問題通過scripts/mksysmap,或者更明確地確定它們,通過

nm -n vmlinux | grep -v '\([aNUw] \)\|\(__crc_\)\|\(\$[adt]\)' > System.map 

然後我能確定通過

awk '/A _text/ { print "0x"$1; }' < _System.map 
awk '/T kernel_entry/ { print "0x"$1; }' < System.map 

加載地址和切入點,現在的挑戰是,有時我不是自己構建內核,而是在之後通過objcopy獲取預構建的內核。任何人都可以告訴我如何做到這一點?我不擅長內核構建和工具鏈使用。既納米objdump的不喜歡剝離圖像,稱

vmlinux.bin: File format not recognized 

回答

1

objcopy manual page

objcopy把可以用來生成通過使用的二進制輸出對象(例如一個原始的二進制文件,使用-O二進制)。當objcopy生成一個原始的二進制文件時,它本質上會產生輸入目標文件內容的內存轉儲。所有符號和重定位信息將被丟棄。內存轉儲將從複製到輸出文件中的最低部分的虛擬地址開始。

下面是可以在PowerPC架構一起使用的示例:文件

原始的vmlinux

bash-3.2$ file vmlinux 
vmlinux: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, not stripped 

剝離vmlinux的被認爲是 「數據」

bash-3.2$ file vmlinux.bin 
vmlinux.bin: data 

將二進制轉換爲Powe的ELF格式vmlinux中的RPC

bash-3.2$ powerpc-440fp-linux-objcopy -I binary vmlinux.bin -B powerpc -O elf32-powerpc vmlinux.bin.x 

輸出現在被認爲是一個ELF文件

bash-3.2$ file vmlinux.bin.x 
vmlinux.bin.x: ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped 

您必須通過-I-B-O參數。你可以從objcopy文檔中獲得這個參數。

但是由於你的二進制文件已經被剝離了,所以試圖反編譯它可能是不值得的,因爲該章節信息不可用。文件中的所有數據都將被轉儲到.data部分。

+0

遲到謝謝你的回答。不幸的是,我沒有通過電子郵件得到有關答案的通知,抱歉。實際上,我設法找到另一種方法來找出加載地址和入口點,但我的解決方案是針對特定情況的,不能一般適用,所以我在此不引用它。 我只想說你提出的解決方案確實會創建一個ELF文件,但該文件不包含所需的重定位信息。因此,信息不能通過'nm -n'從中提取。 無論如何感謝您的回答。 – kriegaex 2012-06-12 12:19:02