Assembly 为什么可以';t GCC编译由CLANG生成的程序集?

Assembly 为什么可以';t GCC编译由CLANG生成的程序集?,assembly,gcc,clang,x86-64,gnu-assembler,Assembly,Gcc,Clang,X86 64,Gnu Assembler,所以,我注意到CLANG生成的程序集不能用GCC编译。例如,对于C中的一个简单的“Hello world!”程序,CLANG生成以下程序集: .text .file "hello.c" .globl main # -- Begin function main .p2align 4, 0x90 .type main,@function main:

所以,我注意到CLANG生成的程序集不能用GCC编译。例如,对于C中的一个简单的“Hello world!”程序,CLANG生成以下程序集:

    .text
    .file   "hello.c"
    .globl  main                    # -- Begin function main
    .p2align    4, 0x90
    .type   main,@function
main:                                   # @main
    .cfi_startproc
# %bb.0:
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register %rbp
    subq    $16, %rsp
    movabsq $.L.str, %rdi
    movb    $0, %al
    callq   printf
    xorl    %ecx, %ecx
    movl    %eax, -4(%rbp)          # 4-byte Spill
    movl    %ecx, %eax
    addq    $16, %rsp
    popq    %rbp
    .cfi_def_cfa %rsp, 8
    retq
.Lfunc_end0:
    .size   main, .Lfunc_end0-main
    .cfi_endproc
                                        # -- End function
    .type   .L.str,@object          # @.str
    .section    .rodata.str1.1,"aMS",@progbits,1
.L.str:
    .asciz  "Hello world!\n"
    .size   .L.str, 14

    .ident  "clang version 10.0.0 "
    .section    ".note.GNU-stack","",@progbits
    .addrsig
    .addrsig_sym printf
但是,当我尝试使用
gcc hello.s
编译该程序集时,我得到:

hello.s: Assembler messages:
hello.s:37: Error: unknown pseudo-op: `.addrsig'
hello.s:38: Error: unknown pseudo-op: `.addrsig_sym'

但是GCC和CLANG都使用同一个汇编器,GNU汇编器。那么,这到底是怎么回事?

这是什么目标?我从
movabsq$.L.str、%rdi
猜测MacOS——针对Linux,编译器将使用
mov$.L.str、%edi
作为位置相关(非饼图)代码(否则为RIP相对LEA),Windows具有不同的调用约定。实际上相当令人惊讶的是,clang在这里没有使用RIP相对LEA;它将小于
movabs

假设
.addrsig
指令是特定于clang的,对于GAS不知道如何创建的MachO64元数据。这可能也是苹果版本的叮当声,而不是主线叮当声

但是GCC和CLANG都使用同一个汇编器,GNU汇编器


不,它们使用相同的asm语法,但是clang有一个集成的汇编程序。正如@Marc Glisse所指出的,您可以使用
clang-no integrated As
来禁用该功能,这会将其输送到GAS,并可能失败。

-no integrated As
。默认情况下,Clang不使用气体。