如何使用 GCC 或其他文件编译此程序集文件



我从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 .

最新更新