簡述:
城市中有時會用到一大塊的二進位資料, 有幾種方法可以處理. 或是把它轉成 C 的原始檔, 不過這樣會犧牲處存空間及編譯的時間. 在 Linux 上, 可以用 ld 搭配程式中使用巨集, 可以做到二進位資料的直接鏈結, 不需要先轉成原始碼再編譯.
二進位檔轉成原始檔:
$ xxd –i image_src.jpg > image_src.h
範例:
以下以 image_src.jpg 作為 二進位資料檔
二進位資料處理:
$ ld –r –b binary –o image_src.o image_src.jpg
這時就會把 image_src.jpg 的內容, 放到 image_src.o 裡面, 如果有好幾個輸入檔, 可以連續輸入
$ ld –r –b binary –o image_src.o image_src_1.jpg image_src_2.jpg
檢視目的檔 (*.o) 中的二進位資料符號:
$ objdump –t image_src.o
可以看到如下的資料, 這些就是在資料連結階段所參考到的符號
SYMBOL TABLE:
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 g .data 0000000000000000 _binary_image_src_jpg_start
000000000000c815 g .data 0000000000000000 _binary_image_src_jpg_end
000000000000c815 g *ABS* 0000000000000000 _binary_image_src_jpg_size
參考用巨集 :
#define EXT_SYMBOL(NAME) \
extern const unsigned char _binary_ ## NAME ## _start[]; \
extern const unsigned char _binary_ ## NAME ## _end[];
#define EXT_VARIABLE(NAME) \
_binary_ ## NAME ## _start
#define EXT_LENGTH(NAME) \
((_binary_ ## NAME ## _end) - (_binary_ ## NAME ## _start))