预处理器不在汇编代码中工作

时间:2016-11-22 12:41:41

标签: assembly

我有一个头文件,用于定义以下内容:

#define BLA 1

现在我想将这个头文件包含在我的汇编代码中:

#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

不幸的是,构建输出如下:

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

虽然可以解析头文件,但我得到undefined reference to BLA'. If I define BLA directly in the S`文件,我得到的结果相同。

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:5)

汇编程序as是纯汇编程序。它不是像gcc这样的前端(它会调用多个程序,包括需要时的预处理程序)。

您需要自己运行预处理器,或者也可以使用汇编程序文件的gcc前端程序:

gcc -ID:/Dev/ws/Foobar/inc -c ../src/main.S
gcc -o Foobar.exe ../src/main.o

gcc前端程序将结尾为.S(大写字母S)的文件识别为需要预处理的汇编程序文件,并将通过预处理程序运行它们。它还会将结尾为.s(小写s)的文件识别为需要预处理的汇编程序文件。