"Undefined reference" 使用程序集嵌入数据时出错,使用 mingw-w64 为 windows 编译(COFF 而不是 ELF)

"Undefined reference" error when using assembly to embed data, using mingw-w64 compiling for windows (COFF instead of ELF)

在另一个 Whosebug Q/A 中有一个 post that showed how to embed arbitrary data in assembly and reference it in C++

这在 Linux 中工作正常,但在为 Windows 编译时(使用 mingw-w64),程序集必须不同,因为可执行文件使用 COFF 格式而不是 ELF。

我当前用于嵌入数据的程序集如下(对于 COFF):

# data.asm
    .section .rodata
    .global data_bin
    .def data_bin; .scl 2; .type 50; .endef
    .align  4
data_bin:
    .incbin "dataFile"
data_bin_end:
    .global data_bin_size
    .def data_bin_size; .scl 2; .type 15; .endef
    .align  8
data_bin_size:
    .quad   data_bin_end - data_bin

(我使用“.scl 2”因为存储 class“2”显然是 global/extern,我使用“.type 50”作为数据“50”是字符数组的值,我对 data_size 使用“.type 15”,因为“15”是无符号长整数的值(所有这些都是 specified here))

我仍在使用相同的头文件来引用数据:

// data.hpp
#ifndef DATA_ASM_HPP
#define DATA_ASM_HPP

extern const char data_bin[];
extern const unsigned long long data_bin_size;

#endif

程序集编译得很好,程序的其余部分也编译得很好。链接时会出现问题,链接器声称 data_bin 和 data_bin_size 未定义,即使我在汇编代码中定义了它们(对 'data_bin' 的未定义引用)。

任何 ideas/solutions 如何解决这个问题?我仔细检查过,编译汇编代码生成的目标文件包含在链接步骤中。

在 data.hpp 周围添加 extern "C" { }(在 linux 中,变量名没有被破坏,但在 windows 中,它们是)

也许,您需要在 asm 中的变量名前加上“_”。