Как мне скомпилировать этот файл сборки с GCC или другими? - PullRequest
0 голосов
/ 21 декабря 2018

Я скопировал пример кода сборки из вики:

.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

Я заменил main на _start и добавил syscall в конце, затем успешно собрал его с помощью «as» и «ld».Но я думал, что это должно быть как-то скомпилировано напрямую с GCC.Так что мне нужно делать?

1 Ответ

0 голосов
/ 21 декабря 2018

gcc -no-pie main.s для этого источника, который определяет main, точно так же как .c, который определяет main.

gcc -no-pie -nostartfiles start.s, если вы определите _start (точка входа ELF)сам.(Так как вы работаете в Linux, glibc может инициализировать себя через ловушки динамического компоновщика, даже если ваш _start не вызывает функции инициализации glibc.)

Чтобы создать статический двоичный файл без каких-либо библиотек, gcc -nostdlib -static start.s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...