2017-07-15 29 views
1

在另一个Stackoverflow Q/A中有post that showed how to embed arbitrary data in assembly and reference it in C++当使用汇编嵌入数据时,使用mingw-w64编译窗口(COFF代替ELF)时出现“Undefined reference”错误

这在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” 显然是全球/ EXTERN和我m使用“.type 50”作为数据,因为“50”是字符数组的值,并且我使用“.type 15”作为data_size,因为“15”是无符号long的值(所有这些如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'的未定义引用),链接器就会出现问题。

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

回答

0

添加extern "C" { }各地data.hpp(在Linux中,变量名是不是缺胳膊少腿,但在Windows,他们是)

也许,你需要预先“_”在ASM变量名。

+0

哇,这个技巧(外部块和前缀“_”到变量名称在asm中)。谢谢一堆! –

相关问题