使用程序集嵌入数据时使用mingw-w64编译窗口(COFF而不是ELF)时出现“未定义的引用”错误

时间:2017-07-15 10:29:28

标签: c++ assembly coff

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

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

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

const int trigger_pin_1 = 12;
const int echo_pin_1 = 13;

const int trigger_pin_2 = 11;
const int echo_pin_2 = 10;

(我正在使用“.scl 2”,因为存储类“2”显然是全局/外部的,我使用“.type 50”表示数据,因为“50”是字符数组的值,我正在使用“.type 15”作为data_size,因为“15”是无符号长整数的值(所有这些都作为specified here))

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

# 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

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

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

1 个答案:

答案 0 :(得分:0)

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

也许,你需要在asm中为变量名前置“_”。