SOGO論壇

標題: 目的檔修改工具 - objcopy [列印本頁]

作者: mm117777    時間: 2012-7-10 10:11:24     標題: 目的檔修改工具 - objcopy

工具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 的說明文件。




歡迎光臨 SOGO論壇 (https://oursogo.com/) Powered by OURSOGO.COM