Я пишу небольшую библиотеку, предназначенную для использования вместо 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