我从wiki复制了一个示例汇编代码:
.section .data
s0 : .asciz "Processor Brand String: %.48sn"
err : .asciz "Feature unsupported.n"
.section .text
.global main
.type main,@function
.align 32
main:
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp
pushq %rbx
movl $0x80000000, %eax
cpuid
cmpl $0x80000004, %eax
jl error
movl $0x80000002, %esi
movq %rsp, %rdi
......
......
jmp end
.align 16
error:
movq $err, %rdi
xorb %al, %al
call printf
.align 16
end:
popq %rbx
movq %rbp, %rsp
popq %rbp
xorl %eax, %eax
ret
我用 _start 替换了 main,并在最后添加了 syscall,然后用 "as" 和 "ld" 成功构建了它。但我认为它应该以某种方式直接与 GCC 一起编译。那么我需要做什么呢?
gcc -no-pie main.s
这个定义main
的源,就像定义main
的.c
一样。
gcc -no-pie -nostartfiles start.s
如果您自己定义_start
(ELF 入口点)。 (由于您使用的是 Linux,glibc 可以通过动态链接器钩子初始化自身,即使您的_start
不调用 glibc init 函数也是如此。
要构建没有任何库的静态二进制文件,gcc -nostdlib -static start.s
.