Как bash выполняет файл ELF?

8

Когда я использую Linux Box, я использую bash в качестве оболочки. Теперь мне стало интересно, как bash управляет выполнением ELF-файла, то есть когда я печатаю ./program, а программа представляет собой ELF-файл. Я добавил bash-4.3.tar.gz, похоже, что нет какого-то парсера магических чисел, чтобы выяснить, является ли файл ELF, и я не нашел системный вызов exec ().

Как работает процесс? Как bash передает выполнение ELF в ОС?

JohnnyFromBF
источник

Ответы:

15

Bash ничего не знает об ELF. Он просто видит, что вы попросили запустить внешнюю программу, и передает имя, которое вы ему дали, как есть execve(2). Знание таких вещей, как форматы исполняемых файлов, строки shebang и разрешения на выполнение, находится за этим системным вызовом в ядре.

(То же самое относится и к другим оболочкам, хотя они могут вместо этого использовать другую функцию в exec(3)семье.)

В Bash 4.3, это происходит по линии 5195 из execute_cmd.cв shell_execve()функции.

Если вы хотите понять Linux на уровне исходного кода, я рекомендую скачать копию Research Unix V6 или V7 и пройти ее , а не всю сложность, которая есть в современных системах Linux. Lions Book - хорошее руководство по коду.

V7 - это то место, где дебютировала оболочка Bourne . Весь его исходный код на C чуть больше половины всего лишь одного файла C в Bash. Оболочки Томпсон в V6 почти половину размера оригинального Bourne оболочки. Тем не менее, обе эти простые оболочки делают то же самое, что и Bash, и по той же причине. (Похоже, это execv(2)вызов из texec()оболочки Томпсона и execve()вызов из модуля execs()оболочки Борна service.c.)

Уоррен Янг
источник