Bash no sabe nada sobre ELF. Simplemente ve que le pidió que ejecutara un programa externo, por lo que le pasa el nombre que le dio como está execve(2)
. El conocimiento de cosas como formatos de archivos ejecutables, líneas shebang y permisos de ejecución se encuentra detrás de esa llamada al sistema , en el núcleo.
(Es lo mismo para otros shells, aunque pueden optar por usar otra función en la exec(3)
familia).
En Bash 4.3, esto sucede en la línea 5195 de execute_cmd.c
la shell_execve()
función.
Si desea comprender Linux en el nivel del código fuente, le recomiendo descargar una copia de Research Unix V6 o V7 , y pasar por eso en lugar de toda la complejidad de los sistemas Linux modernos. The Lions Book es una buena guía para el código.
V7 es donde el shell Bourne hizo su debut. Todo su código fuente C es un poco más de la mitad del tamaño de ese archivo C en Bash. El shell Thompson en V6 es casi la mitad del tamaño del shell Bourne original. Sin embargo, estos dos proyectiles más simples hacen el mismo tipo de cosas que Bash, y por la misma razón. (Parece ser una execv(2)
llamada desde texec()
el shell de Thompson y una execve()
llamada desde execs()
el service.c
módulo del shell Bourne ).