我有一个头文件,定义以下内容:
#define BLA 1
Run Code Online (Sandbox Code Playgroud)
现在我想将这个头文件包含到我的汇编代码中:
#include "myinc.h"
.file "main.c"
.intel_syntax noprefix
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "ABCDEFGHIJK.\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB6:
.cfi_startproc
push ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
mov ebp, esp
.cfi_def_cfa_register 5
and esp, -16
sub esp, 16
call ___main
mov DWORD PTR [esp], OFFSET FLAT:LC0
call _puts
mov eax, 0
mov ebx, BLA
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE6:
.ident "GCC: (GNU) 4.8.1"
.def _puts; .scl 2; .type 32; .endef
Run Code Online (Sandbox Code Playgroud)
不幸的是,构建输出如下:
as "-ID:\\Dev\\ws\\Foobar\\inc" -o "src\\main.o" "..\\src\\main.S"
gcc -o Foobar.exe "src\\main.o"
src\main.o:main.c:(.text+0x21): undefined reference to `BLA'
collect2.exe: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
虽然头文件就可以解决,我得到undefined reference to
BLA" . If I define
BLA directly in the
S`文件,我得到了相同的结果.
任何想法为什么会这样?
汇编程序as
是纯汇编程序.它不是一个前端gcc
(它调用多个程序,包括需要时的预处理程序).
您需要自己运行预处理器,或者也可以使用gcc
汇编程序的前端程序:
gcc -ID:/Dev/ws/Foobar/inc -c ../src/main.S
gcc -o Foobar.exe ../src/main.o
Run Code Online (Sandbox Code Playgroud)
该gcc
前端程序识别的文件与最后的结束.S
(大写S)是汇编文件,需要预处理,并且将通过预处理程序运行它们.它还确认文件与结局.s
(小写S)为汇编文件并不需要进行预处理.