我喜欢amd64汇编程序的AT&T语法,所以我使用GNU As。不幸的是,我无法使用它创建合理大小的二进制文件。为了比较,这个简单的程序只是以fasm的值1退出:
;; 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
。
我在做什么错了?