`Execve ()` настраивает регистры для вызова динамического компоновщика или исполняемого файла для выполнения? - PullRequest
0 голосов
/ 03 февраля 2019

Понимание ядра Linux говорит execve(), вызывает load_binary() каждого linux_binfmt объекта, а load_binary()

Вызывает макрос start_thread () для изменениязначения регистров пользовательского режима eip и esp, сохраненные в стеке режима ядра, так что они указывают на точку входа динамического компоновщика и на вершину нового стека режима пользователя соответственно.

mosvy писал:

В результате ядро ​​организует системный вызов execve после возвращения в режим пользователя для получения IP (регистр указателя инструкций, установленный на начало _start функции , и регистр SP (указатель стека), установленный на указатель на начало списка строк argv + env, поэтому эффект отточка зрения пользовательского режима такова, как если бы кто-то вызывал функцию _start следующим образом:

_start(argc, argv0, argv1, ... , NULL, env0, env1, ... NULL)

в соглашении о вызовах, где все аргументы передаются в стеке.

К "началу функции _starton ", он имел в виду точку входа исполняемого файла, который должен быть выполнен ?

Какая из верных?Т.е. execve() устанавливает регистры для вызова динамического компоновщика или исполняемого файла для выполнения?

1 Ответ

0 голосов
/ 03 февраля 2019

_start является точкой входа исполняемого файла.В Си вы можете подумать, что main - это точка входа, но это всего лишь точка зрения программиста.Компилятор может вставить другой код в _start для запуска перед вызовом main.

Моя интерпретация заключается в том, что все, что описано в вашем вопросе, происходит до вызова _start (или, по-видимому, для вызова _start).

...