如何用GCC或其他文件编译该程序集文件?

时间:2018-12-21 02:49:54

标签: linux gcc assembly

我从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进行编译。那我该怎么办?

1 个答案:

答案 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