Реализация функции execve (unistd.h) - PullRequest
0 голосов
/ 12 сентября 2011

Как я могу увидеть реализацию функции execve (под x86_64 Linux), она есть в библиотеке unistd? Я хочу этого, потому что хочу знать, как я могу вызвать внешнюю программу, используя ассемблер, без вызова execve. Я знаю, что есть системный вызов с именем execve, но я не знаю, как его использовать.

Как я могу поместить переменную типа char * и типа char * [] в регистры?

Ответы [ 3 ]

1 голос
/ 12 сентября 2011

Достаточно взглянуть на исходные коды ядра (более конкретно: arch / YOUR-ARCH / kernel / head * .S) для соглашения о системных вызовах для вашей архитектуры (регистры и / или стек для номера системного вызова и параметров)..

Например, в ARM вы должны загрузить __NR_execve в r7, загрузить аргументы в r0, r1, r2 и затем использовать swi 0.Возможно, вас заинтересует это объяснение системных вызовов ARM EABI для получения более подробной информации.

1 голос
/ 12 сентября 2011

Реализация функции execve() в пользовательском пространстве выглядит примерно так:

int execve(const char *filename, char * const argv[], char * const envp[]) {
    return syscall(SYS_execve, filename, argv, envp);
}

Вся фактическая «работа» выполняется в ядре.В libc нет ничего особенно интересного, кроме, возможно, некоторой очистки потоков.

0 голосов
/ 12 сентября 2011

Нет реальной простой реализации системных вызовов в исходном коде для glibc - он генерируется во время сборки из различных файлов, определяющих номера системных вызовов.

Соответствующую информацию можно найти в sysdep.h если вы понимаете это, за исключением фактических номеров системных вызовов (вы хотите __NR_execve с, IIRC, #include <asm/unistd.h> - я не могу вспомнить, что это за x86_64).

Номер системного вызова указывается в% rax, а аргументы - в% rdi% rsi% rdx.Вся эта информация (включая выравнивание стека и кое-что об использовании регистров ядром) прокомментирована в sysdep.h.

...