我正在try 将二进制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

然后我try 在我的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个名字前面加了下划线.我不完全确定这是为什么-我认为this wikipedia article's个人声称这是有一定道理的

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

但是我觉得,如果在所有外部数前面都加了下划线,那么您实际上并没有对命名空间进行很大的分区.无论如何,这是另一天的问题,事实是,确实添加了下划线.

C++相关问答推荐

Linux/C:复制修剪了最后一个填零孔的文件

有什么方法可以检测SunOS上的SparcWorks吗?

无效使用未定义类型'structsquare'?

为什么下面的C代码会进入无限循环?

C语言中字符数组声明中的标准

Tiva TM4C123GXL的I2C通信

为静态库做准备中的奇怪行为

在C++中访问双指针

为什么此共享库没有预期的依赖项?

用gcc-msse 2编译的C程序包含AVX 1指令

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

为什么用非常数指针变量改变常量静态变量时会出现分段错误?

在函数外部使用内联ASM时无法指定操作数

为什么电路板被循环删除?

Realloc():中止的下一个大小无效(核心转储)

如何在C中计算包含递增和递减运算符的逻辑表达式?

DennisM.Ritchie的C编程语言一书中关于二进制搜索的代码出现错误?

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

malloc 属性不带参数