- 註冊時間
- 2006-10-8
- 最後登錄
- 2019-6-20
- 主題
- 查看
- 積分
- 1306
- 閱讀權限
- 110
- 文章
- 1393
- 相冊
- 0
- 日誌
- 1
![Rank: 11](static/image/common/star_level3.gif) ![Rank: 11](static/image/common/star_level3.gif) ![Rank: 11](static/image/common/star_level2.gif) ![Rank: 11](static/image/common/star_level1.gif)
狀態︰
離線
|
工具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 的說明文件。 |
|