使用gcc mingw嵌入二进制blob

myf*_*wik 45 c binary gcc mingw

我试图将二进制blob嵌入到exe文件中.我正在使用mingw gcc.

我像这样制作目标文件:

ld -r -b binary -o binary.o input.txt
Run Code Online (Sandbox Code Playgroud)

然后我看objdump输出来获取符号:

objdump -x binary.o
Run Code Online (Sandbox Code Playgroud)

它给出了符号:

_binary_input_txt_start
_binary_input_txt_end
_binary_input_txt_size
Run Code Online (Sandbox Code Playgroud)

然后我尝试在我的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;
}
Run Code Online (Sandbox Code Playgroud)

然后我这样编译:

gcc -o test.exe test.c binary.o
Run Code Online (Sandbox Code Playgroud)

但我总是得到:

undefined reference to _binary_input_txt_start
Run Code Online (Sandbox Code Playgroud)

有谁知道我做错了什么?

Mic*_*urr 31

在你的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;
}
Run Code Online (Sandbox Code Playgroud)

C编译器经常(总是?)似乎在extern名称前加下划线.我不完全确定为什么会这样 - 我认为这篇维基百科文章声称有一些道理

C编译器的常见做法是在所有外部作用域程序标识符之前加上前导下划线,以避免与运行时语言支持的贡献发生冲突

但令我感到震惊的是,如果将下划线添加到所有外部,那么你并没有真正对命名空间进行分区.无论如何,这是另一天的问题,事实是下划线确实得到了补充.


use*_*529 5

我在Linux(Ubuntu 10.10)上进行了测试。

  1. 资源文件:
    input.txt

  2. gcc(Ubuntu / Linaro 4.4.4-14ubuntu5)4.4.5 [生成用于Linux的ELF可执行文件]
    生成symbol _binary__input_txt_start
    接受符号_binary__input_txt_start(带下划线)。

  3. i586-mingw32msvc-gcc(GCC)4.2.1-sjlj(mingw32-2)[为Windows生成PE可执行文件]
    生成symbol _binary__input_txt_start
    接受符号binary__input_txt_start(不带下划线)。


Mat*_*rný 5

ld手册页

--leading-underscore

-无领导下划线

对于大多数目标,默认符号前缀是下划线,并在目标的说明中定义。通过此选项,可以禁用/启用默认的下划线符号前缀。

所以

ld -r -b binary -o binary.o input.txt --leading-underscore
Run Code Online (Sandbox Code Playgroud)

应该是解决方案。