Я по-наивности думал, что загрузкой файлов занимается какой-то модуль ядра. Модуль, потому что форматов много, и вот под ELF отдельный модуль, под другой формат - другой модуль.
Ну, собрался я, зайду сейчас в /usr/src/linux, да погрепаю.
/usr/src/linux-5.15.41-x86_64 # grep -R "e_phentsize" *
include/uapi/linux/elf.h: Elf32_Half e_phentsize;
include/uapi/linux/elf.h: Elf64_Half e_phentsize;
scripts/mod/modpost.c: hdr->e_phentsize = TO_NATIVE(hdr->e_phentsize);
Но не тут-то было! В ядре нет кода, который занимается загрузкой!!!
# find . -iname *.c -exec grep -nil -R "include.*elf\.h" {} \;
./scripts/sorttable.c
./scripts/mod/modpost.c
./scripts/mod/mk_elfconfig.c
./scripts/insert-sys-cert.c
./scripts/recordmcount.c
Как оно работает-то тогда?
То есть, вот файл ld-linux.so https://man7.org/linux/man-pages/man8/ld.so.8.html он же в этом же ELF-формате,
# file /lib/ld-linux.so.2
/lib/ld-linux.so.2: ELF 32-bit LSB shared object, Intel 80386, version 1 (GNU/Linux), static-pie linked, stripped
# file /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), static-pie linked, stripped
кто же его загрузит?