使用gcc mingwembedded二进制blob
我正在尝试将二进制blobembedded到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
有谁知道我在做什么错?
在你的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
名称前加了一个下划线。 我不完全确定这是为什么 – 我认为这个维基百科文章的说法有一些事实
C编译器通常会在所有外部作用域程序标识符前面加下划线,以避免与运行时语言支持的影响相冲突
但是,如果下划线被所有的外部实体所占用,那么我们就会觉得这样做并不是真的把命名空间划分得非常紧密。 无论如何,这是另一天的问题,事实是,下划线确实被添加了。
我在Linux(Ubuntu 10.10)中testing了它。
-
资源文件:
input.txt中 -
gcc(Ubuntu / Linaro 4.4.4-14ubuntu5)4.4.5 [生成ELF可执行文件,用于Linux]
生成符号_binary__input_txt_start
。
接受符号_binary__input_txt_start
(带下划线)。 -
i586-mingw32msvc-gcc(GCC)4.2.1-sjlj(mingw32-2)[为Windows生成PE可执行文件]
生成符号_binary__input_txt_start
。
接受符号binary__input_txt_start
(不带下划线)。
从ld手册页 :
-全国领先下划线
–no领先的下划线
对于大多数目标,默认的symbol-prefix是一个下划线,在目标描述中定义。 通过这个选项,可以禁用/启用默认的下划线符号前缀。
所以
ld -r -b binary -o binary.o input.txt --leading-underscore
应该是解决scheme。
显然这个特性在OSX的ld中不存在,所以你必须完全不同于它们添加的自定义gcc标志,而且你不能直接引用数据,但是必须做一些运行时初始化来获得地址。
因此,在构build时将自己制作为包含二进制文件的汇编源代码文件可能更具可移植性。