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
.)