Итак, я заметил, что CLANG производит сборку, которая не может быть скомпилирована с G CC. Например, для простого "Hello world!" в программе C, 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'
Но оба G CC и CLANG используют один и тот же ассемблер, GNU Assembler. Итак, что здесь происходит на самом деле?