Мне нравится AT & T синтаксис ассемблера amd64, поэтому я использую GNU As.К сожалению, я не могу создать двоичные файлы разумного размера с ним.Для сравнения, тривиальная программа, которая просто выходит со значением 1, реализованная в fasm:
;; a02.fasm
format ELF64 executable at 0000000100000000h ; put image over 32-bit limit
segment readable executable
entry $
xor edi,edi ; exit code 0
inc edi
mov eax,60 ; sys_exit
syscall
, выполненная следующим образом:
$ fasm a02.fasm
flat assembler version 1.73.06 (16384 kilobytes memory)
1 passes, 131 bytes.
приводит к крошечному двоичному файлу.
Эквивалентная программа, скомпилированная и связанная с binutils
# a01.S
.globl _start
_start:
xor %di, %di
inc %di
mov $60, %eax
syscall
со следующими командами:
as a01.S -o a01.o
ld a01.o
приводит к огромному двоичному файлу:
$ du -hb a.out
4744 a.out
$ strip -s a.out
$ du -hb a.out
4408 a.out
$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
И as
, и ld
из пакета Debian binutils=2.31.1-11
.
Что я делаю не так?