使用gcc mingw嵌入二进制Blob

我正在尝试将二进制Blob嵌入到exe文件中。我正在使用mingw gcc。


我制作目标文件是这样的:


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

有人知道我在做什么错吗?


江户川乱折腾
浏览 543回答 3
3回答

青春有我

在您的C程序中,删除前划线:#include <stdlib.h>#include <stdio.h>extern char binary_input_txt_start[];int main (int argc, char *argv[]){&nbsp; &nbsp; char *p;&nbsp; &nbsp; p = binary_input_txt_start;&nbsp; &nbsp; return 0;}C编译器经常(总是?)似乎在extern名称前加下划线。我不完全确定为什么会这样-我认为这个Wikipedia文章声称存在某些道理,对于C编译器,通常的做法是在所有外部作用域程序标识符前加一个下划线,以免与运行时语言支持产生的冲突但是让我感到震惊的是,如果在所有externs之前都加了下划线,那么您实际上并没有对分区进行太多分区。无论如何,这又是一个问题,事实是下划线确实被添加了。

交互式爱情

我在Linux(Ubuntu 10.10)上进行了测试。资源文件:input.txtgcc(Ubuntu / Linaro 4.4.4-14ubuntu5)4.4.5 [生成用于Linux的ELF可执行文件]生成symbol&nbsp;_binary__input_txt_start。接受符号_binary__input_txt_start(带下划线)。i586-mingw32msvc-gcc(GCC)4.2.1-sjlj(mingw32-2)[为Windows生成PE可执行文件]生成symbol&nbsp;_binary__input_txt_start。接受符号binary__input_txt_start(不带下划线)。
打开App,查看更多内容
随时随地看视频慕课网APP