我从Wiki复制了示例汇编代码:
.section .data
s0 : .asciz "Processor Brand String: %.48s\n"
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进行编译。那我该怎么办?
答案 0 :(得分:2)
gcc -no-pie main.s
,此源定义了main
,就像.c
定义了main
一样。
gcc -no-pie -nostartfiles start.s
(如果您自己定义_start
(ELF入口点)。 (由于您使用的是Linux,因此即使您的_start
没有调用glibc初始化函数,glibc也可以通过动态链接器挂钩进行初始化。)
要构建不带任何库的静态二进制文件,请gcc -nostdlib -static start.s
。