使用程序集嵌入数据时"Undefined reference"错误,使用适用于窗口的 mingw-w64 编译(COFF 而不是 ELF)

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

本文关键字:COFF 编译 mingw-w64 ELF 数据 程序集 Undefined 适用于 错误 reference 窗口      更新时间:2023-10-16

在另一个Stackoverflow Q/A中,有一篇文章展示了如何在汇编中嵌入任意数据并在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",因为存储类"2"显然是全局/外部的,并且我对数据使用".type 50",因为"50"是字符数组的值,我使用".type 15"作为data_size因为"15"是无符号长整型的值(所有这些都在此处指定))

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

// 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"的引用)。

关于如何解决这个问题的任何想法/解决方案?我已经仔细检查了,编译汇编代码生成的对象文件包含在链接步骤中。

在 data.hpp 周围添加extern "C" { }(在 Linux 中,变量名称不会被破坏,但在 Windows 中,它们是)

也许,您需要在 asm 中的变量名称前面加上"_"。