1

在另一个 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”的引用)。

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

4

1 回答 1

0

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

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

于 2017-07-15T10:42:01.447 回答