GCC (minGW - Windows 10) 报告当我尝试将二进制文件嵌入可执行文件时,没有对 .o 文件中定义的符号的引用

GCC (minGW - Windows 10) report that there is no reference to symbol defined in .o file when I'm trying to embed the binary into executable

正在创建 .o 文件

ld -r -b binary -o baked.o baked.txt

λ nm baked.o
0000000f D _binary_baked_txt_end
0000000f A _binary_baked_txt_size
00000000 D _binary_baked_txt_start

代码:

#include <stdlib.h>
#include <stdio.h>

extern char *_binary_baked_txt_end;
extern char _binary_baked_txt_size;
extern char *_binary_baked_txt_start;

int main(void) {      
  printf("the baked is %s", _binary_baked_txt_start);      
  return 0;
}

编译:

λ gcc -o main baked.o main.c
C:\Users6\AppData\Local\Temp\cc4um6Mn.o:main.c:(.text+0x12): undefined reference to `_binary_baked_txt_start'
collect2.exe: error: ld returned 1 exit status

问题是,我做错了什么?我在 .o 文件中看到符号,我用 main.c 文件编译它,可能出了什么问题?

我应该只使用:

binary_baked_txt_end;
binary_baked_txt_size;
binary_baked_txt_start;

因为 Windows 机器上的 COFF 格式。 正确的做法是:

extern char binary_baked_txt_end[];
extern char binary_baked_txt_size;
extern char binary_baked_txt_start[];

因为这样很明显 binary_baked_txt_end 是一个指向 char 的地址(在我的例子中)并且它会更安全,没有人可以为它分配新的值。