Вызов основного из сборки - PullRequest
       0

Вызов основного из сборки

2 голосов
/ 10 декабря 2011

Я пишу небольшую библиотеку, предназначенную для использования вместо libc в небольшом приложении. Я прочитал источник основных альтернатив libc, но не могу заставить передачу параметров работать для архитектуры x86_64 в Linux.

Библиотека не требует какого-либо шага инициализации между _start и main. Поскольку libc и его альтернативы действительно используют этап инициализации, и мои знания по сборке ограничены, я подозреваю, что переупорядочение параметров вызывает у меня проблемы.

Это то, что у меня есть, оно содержит ассемблер, вдохновленный различными реализациями:

.text
.global _start

_start:
    /* Mark the outmost frame by clearing the frame pointer. */
    xorl %ebp, %ebp

    /* Pop the argument count of the stack and place it
     * in the first parameter-passing register. */
    popq %rdi

    /* Place the argument array in the second parameter-passing register. */
    movq %rsi, %rsp

    /* Align the stack at a 16-byte boundary. */
    andq $~15, %rsp

    /* Invoke main (defined by the host program). */
    call main

    /* Request process termination by the kernel. This
     * is x86 assembly but it works for now. */
    mov  %ebx, %eax
    mov  %eax, 1
    int  $80

А точкой входа является обычная основная подпись: int main(int argc, char* argv[]). Для этого конкретного проекта переменные среды и т. Д. Не требуются.

AMD64 ABI говорит, что rdi должен использоваться для первого параметра и rsi для второго.

Как правильно настроить стек и передать параметры в main в Linux x86_64? Спасибо!

Ссылки:
http://www.eglibc.org/cgi-bin/viewvc.cgi/trunk/libc/sysdeps/x86_64/elf/start.S?view=markup
http://git.uclibc.org/uClibc/tree/libc/sysdeps/linux/x86_64/crt1.S

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

Я думаю, что вы получили

 /* Place the argument array in the second parameter-passing register. */
    movq %rsi, %rsp

неправильно. Должно быть

movq %rsp, %rsi      # move argv to rsi, the second parameter in x86_64 abi
0 голосов
/ 12 декабря 2011

main вызывается crt0.o ;см. также этот вопрос

Ядро устанавливает начальный стек и среду процесса после execve , как указано в документе ABI (зависит от архитектуры);crt0 (и связанный с ним) код отвечает за вызов main.

...