2010-04-13 93 views
40

我想嵌入二進制blob到exe文件。我正在使用mingw gcc。使用gcc嵌入二進制blob mingw

我作出這樣的對象文件:

ld -r -b binary -o binary.o input.txt 

我再看看objdump的輸出,以獲得符號:

objdump -x binary.o 

,並讓符號命名:

_binary_input_txt_start 
_binary_input_txt_end 
_binary_input_txt_size 

我然後嘗試在我的C程序中訪問它們:

#include <stdlib.h> 
#include <stdio.h> 

extern char _binary_input_txt_start[]; 

int main (int argc, char *argv[]) 
{ 
    char *p; 
    p = _binary_input_txt_start; 

    return 0; 
} 

然後我編譯如下:

gcc -o test.exe test.c binary.o 

但我總是得到:

undefined reference to _binary_input_txt_start 

有誰知道我做錯了嗎?

+7

順便說一句,我不知道拉的任意數據轉換成可執行的這種方法的 - 很不錯。 – 2010-04-13 05:48:35

+0

這種方法提供的文件不是'.rc'文件提供的嗎? – rubenvb 2011-10-20 09:36:04

+0

@rubenvb更容易訪問contntent。它不需要調用任何資源API:s – user877329 2012-03-15 09:16:55

回答

27

在C程序中刪除前面的下劃線:經常

#include <stdlib.h> 
#include <stdio.h> 

extern char binary_input_txt_start[]; 

int main (int argc, char *argv[]) 
{ 
    char *p; 
    p = binary_input_txt_start; 

    return 0; 
} 

C編譯器(?總是)似乎前面加上一個下劃線extern名。我不能完全肯定這是爲什麼 - 我認爲有一定的道理this wikipedia article's聲稱

這是常見的做法C編譯器前面加上一個前導下劃線所有外部範圍的節目標識符,以避免與貢獻衝突運行時語言支持

但它讓我感到如果下劃線被預置在所有extern中,那麼你並沒有真正對命名空間進行非常多的分區。無論如何,這是另一天的問題,事實是下劃線確實會被添加。

+0

哇...非常感謝。這讓我發瘋。我知道它一定是簡單的。我剛纔調試它,發現它被更改爲__binary_input_txt_start – myforwik 2010-04-13 06:11:58

+0

@myforwik:萬一你有興趣,我已經張貼問題問爲什麼C不用這樣的:http://stackoverflow.com/questions/2627511/why -DO-C編譯器,前置突顯了對外部名稱 – 2010-04-13 06:47:05

+0

@邁克爾:這篇文章的說法是真實的。運行時間是用匯編寫的,這是免費的沒有前置下劃線中使用的名稱,並可能因此而無法保證與C代碼中定義的所有符號發生衝突,相反C代碼沒有辦法從ASM運行時代碼訪問符號。 – 2011-08-06 23:24:38

4

我在Linux(Ubuntu 10.10)中測試過它。

  1. 種源的文件:
    input.txt中

  2. GCC(Ubuntu的/ Linaro的4.4.4-14ubuntu5)4.4.5 [產生ELF可執行,用於Linux]
    生成符號_binary__input_txt_start
    接受符號_binary__input_txt_start(帶下劃線)。

  3. i586的-mingw32msvc-GCC(GCC)4.2.1-sjlj(mingw32-2)生成PE可執行,用於Windows]
    生成符號_binary__input_txt_start
    接受符號binary__input_txt_start(不帶下劃線)。

+0

使用tdm-gcc 4.8.1,我必須使用下劃線引用變量。 – hauzer 2013-10-03 01:01:55

3

ld man page

- 全國領先下劃線

--no領先的下劃線

對於大多數目標默認符號前綴是一個下劃線並在目標描述中定義。通過該選項,可以禁用/啓用默認的下劃線符號前綴。

所以

ld -r -b binary -o binary.o input.txt --leading-underscore 

應溶液。

0

顯然這個功能在OSX的ld中不存在,所以你必須使用它們添加的自定義gcc標誌來做totally differently,並且你不能直接引用數據,但必須做一些運行時初始化來獲取地址。

所以它可能是更輕便,使自己的彙編源文件,其中包括在構建時的二,一拉this answer