Or does linux requires some kind of standard format, like ELF format or bash format?
Tak, linux wymaga, aby plik był w jakimś obsługiwanym (zarejestrowanym) formacie i wykonał zestaw bitów w celu jego wykonania. Większość plików w systemie Linux ma albo ELF format, albo "shebang" format (dwa pierwsze symbole z nich są #!
, a następnie zapisywana jest ścieżka do interpretera, używana przez bash, perl, python i większość innych skryptów). Czasami pliki tekstowe mogą być uruchamiane jako skrypty powłoki, np. kiedy robisz ./script
z bash (obsługiwane nie przez jądro, ale przez powłokę bash).
Więcej szczegółów dostępnych jest w wersji fs/exec.c file z jądra Linux, począwszy od funkcji do_execve
.
Istnieje podsystem jądra "binfmt" do rejestrowania innych formatów wykonywalnych. Na przykład binfmt_misc
umożliwia zdefiniowanie i zarejestrowanie własnego formatu binarnego za pomocą specjalnego pliku /proc/sys/fs/binfmt_misc
. Wykonanie jest obsługiwane przez zdefiniowany przez użytkownika "interpreter", program, który może odczytać, wczytać i wykonać docelowy plik wykonywalny. Na przykład pliki binarne systemu Windows PE można uruchamiać za pomocą programu anion-emulator wine
.
Widzimy kilka wbudowanych modułów binfmt
w fs
directory źródeł kernela. Najczęściej są to: binfmt_elf.c
(format binarny ELF) i binfmt_script.c
(który wykrywa "shebang" i uruchamia interpreter). Jest prosty binary format "a.out" z AT & T, obsługiwany przez binfmt_aout.c
, który może być łatwiejszy do wygenerowania niż ELF.
binfmt_aout.c 11374 bytes
binfmt_elf.c 58415 bytes
binfmt_elf_fdpic.c 48256 bytes
binfmt_em86.c 2710 bytes
binfmt_flat.c 27054 bytes
binfmt_misc.c 15175 bytes
binfmt_script.c 2768 bytes
binfmt_som.c 7315 bytes
Jeśli plik spróbować wykonać nie jest format obsługiwany, exec*
syscalli zwróci błąd:
$ hexdump -C asd
00000000 07 01 09 00 11 12 13 14 0a |.........|
00000009
$ strace ./asd
execve("./asd", ["./asd"], [/* 179 vars */]) = -1 ENOEXEC (Exec format error)
....
Według execve
man page, kod powrotu oznacza:
ENOEXEC
An executable is not in a recognized format, is for the wrong architecture, or has some other format error that means it cannot be executed.
pamiętam znalezienie gdzieś w Internecie jest artykułem, w którym ktoś wyruszył na handcraft do najmniejszego poprawnego wykonywalnego elfa - ostatecznie nałożyli się na niektóre struktury danych, ale wzdłuż ay wyjaśnił minimalną rolę każdego z nich. Nie jestem pewien, czy to http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html, czy był to kolejny podobny. –
@ChrisStratton, http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html lub http://timelessname.com/elfbin/. I co? To jest po prostu mały plik binarny ELF, ładowany przez 'binfmt_elf'. – osgx