为了账号安全,请及时绑定邮箱和手机立即绑定

使用gcc mingw嵌入二进制Blob

使用gcc mingw嵌入二进制Blob

C
江户川乱折腾 2019-11-27 11:17:55
我正在尝试将二进制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有人知道我在做什么错吗?
查看完整描述

3 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

在您的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名称前加下划线。我不完全确定为什么会这样-我认为这个Wikipedia文章声称存在某些道理,


对于C编译器,通常的做法是在所有外部作用域程序标识符前加一个下划线,以免与运行时语言支持产生的冲突


但是让我感到震惊的是,如果在所有externs之前都加了下划线,那么您实际上并没有对分区进行太多分区。无论如何,这又是一个问题,事实是下划线确实被添加了。


查看完整回答
反对 回复 2019-11-27
?
交互式爱情

TA贡献1712条经验 获得超3个赞

我在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(不带下划线)。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 542 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信