SOGO論壇
  登入   註冊   找回密碼
查看: 937|回覆: 0
列印 上一主題 下一主題

[技術文章] 目的檔修改工具 - objcopy [複製連結]

Rank: 11Rank: 11Rank: 11Rank: 11

熱心參予論壇活動及用心回覆主題勳章 數位硬體勳章

狀態︰ 離線
跳轉到指定樓層
1
發表於 2012-7-10 10:11:24 |只看該作者 |倒序瀏覽
工具objcopy 的用法很多樣,舉例而言,假如我們想把目的檔 code.o 中的目的碼從 ELF 中抽取出來,並且去除註解欄位後存入 code.bin 中,那就可以使用下列指令。

    $ objcopy -O binary -S -R .comment -R .note code.o code.bin

如果只想將 code.o 中的取程式段 (.text) 抽取出來,存入 code.bin 中,就可以使用下列指令。

    $ objcopy -O binary -j .text code.o code.bin

有時,專業的系統程式人員在使用objcopy 時,會有一些令人意想不到的用法,舉例而言,如果要將一個 JPEG 圖片檔 image.jpg,轉換成 image.o 的目的檔,以便在另一個程式內以陣列的方式存取這個影像,就可以用下列指令進行轉換。

    objcopy -I binary -O elf32-i386 -B i386 image.jpg image.o

範例:使用 objcopy 把影像檔轉換為目的檔

$ objcopy --readonly-text -I binary -O elf32-i386 -B i386 ccc.jpg ccc.o

$ ls -all
total 8
drwxrwxrwx+ 2 ccc None    0 May 15 13:11 .
drwxrwxrwx+ 8 ccc None    0 May 15 13:07 ..
-rwxrwxrwx  1 ccc None 3183 Jul  3  2008 ccc.jpg
-rw-r--r--  1 ccc None 3612 May 15 13:11 ccc.o

$ objdump -x ccc.o | grep ccc
ccc.o:     file format elf32-i386
ccc.o
00000000 g       .data  00000000 _binary_ccc_jpg_start
00000c6f g       .data  00000000 _binary_ccc_jpg_end
00000c6f g       *ABS*  00000000 _binary_ccc_jpg_size

然後,就可以在程式中透過外部變數引用的方式,直接引用這些記憶體標記,如以下範例所示。

範例:使用外部變數引用目的檔中的影像區塊

extern char *_binary_ccc_jpg_start;
extern char *_binary_ccc_jpg_end;
extern char *_binary_ccc_jpg_size;

上述範例的作法,在嵌入式系統中相當常見,因為嵌入式系統當中很可能沒有檔案系統,因此無法使用像 fopen() 這種檔案函數。此時,如果要顯示影像,就可以直接將影像放入記憶體,然後取得其記憶體區塊,直接在程式中使用。

除了 objcopy 之外,strip 工具也可以用來去除符號資訊,例如: strip a.o 就可以將 a.o 檔案的符號資訊去除。關於 objcopy、strip 等指令的詳細用法,請參考 GNU Binary Utility 的說明文件。
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2025-2-6 19:25

© 2004-2025 SOGO論壇 OURSOGO.COM
回頂部