Linux wspiera kilka roznych formatow plikow wykonywalnych. Kazdy z nich zarejestrowany jest na liscie formats,
ktorej elementy sa typu linux_binfmt. Opis czynnosci wstepnych poprzedzajacych
rozpoznawanie pliku opisany jest w podpunkcie Czynnosci wstepne
. Dokladny opis sposobu wywolywania kolejnych funkcji
rozpoznajacych dany plik, opisany jest w podpunkcie Rozpoznawanie formatu pliku.
struct linux_binfmt {
struct linux_binfmt * next;
long *use_count;
int (*load_binary)(struct linux_binprm *, struct pt_regs * regs);
int (*load_shlib)(int fd);
int (*core_dump)(long signr, struct pt_regs * regs);
};
Kazdy z formatow za pomoca funkcji register_binfmt definuje i wstawia do listy formats elementy typu
linux_binfmt z odpowiednimi dla siebie funkcjami do rozpoznawania i ladowania programu (wskaznik load_binary),
ladowania bibliotek dzielonych (wskaznik load_shlib) i zrzutu obrazu procesu na dysk (wskaznik core_dump).
Niektore formaty zapewniaja jedynie funkcje do rozpoznawania i ladowania programu.
W opisywaniej wersji linuxa mamy do dyspozycji piec formatow plikow wykonywalnych: skrypt shellowy, program w javie, aplet w javie, plik wykonywalny typu a.out, plik wykonywalny typu ELF.
Format skryptow - wykonywane sa pliki tekstowe napisane w dowolnym jezyku skryptowym, jakiego interpreter znajduje sie
w systemie (moga byc skrypty shellowe, skrypty w Perlu, awk, itp...).
Sciezka interpretera zdefiniowana jest w pierwszej linijce skryptu, zaraz po znakach #!.
Plik musi miec ustawiony atrybut do wykonania.
plik: "fs/binfmt_script.c"
init_script_binfmtregister_binfmt z parametrem script_binfmtcleanup_moduleunregister_binfmt dla script_binfmtdo_load_script(opis ponizej)Kolejne etapy dzialania funkcji do_load_script:
sh_bang zapewniajaca, ze interpreterem jezyka skryptowego nie jest program napisany w jezyku
skryptowym.open_namei poszukujacej i-wezla interpretera.search_binary_handler, ktora to wywoluje
funkcje rozpoznajaco-ladujaca dla kolejnego formatu.
W Linuxie (od wersji 1.3.8) istnieje mozliwosc bezposredniego wywolywania plikow napisanych w javie (zarowno
programow-klas skompilowanych do plikow typu '*.class' jak i apletow (umieszczanych w plikach typu '*.html').
Obsluga tych plikow przez system jest bardzo podobna do obslugi skryptow
Musi zostac tylko spelnionych kilka warunkow:
plik: "fs/binfmt_java.c"
init_java_binfmtregister_binfmt raz z parametrem java_format(odpowiadajacym za
programy-klasy), raz z applet_formatcleanup_moduleunregister_binfmt raz z parametrem java_format(odpowiadajacym za
programy-klasy), raz z applet_formatdo_load_script(dla nieapletow)
i do_load_applet(dla apletow)(opis ponizej)Kolejne etapy dzialania funkcji do_load_script(dla programow-klas):
0xca,0xfe,0xba,0xbe) bash) interpretera javy (/usr/bin/java), ktorego
argumentem bedzie nazwa pliku w javie z wycietym rozszerzeniem .classopen_namei poszukujacej i-wezla interpretera.search_binary_handler, ktora to wywoluje
funkcje rozpoznajaco-ladujaca dla kolejnego formatu.Kolejne etapy dzialania funkcji do_load_applet (dla apletow):
bash) przegladarki do apletow (/usr/bin/appletviewer),
ktorego argumentem jest tym razem nazwa pliku z nieusunietym rozszerzeniem '*.html'.open_namei poszukujacej i-wezla interpretera.search_binary_handler, ktora to wywoluje
funkcje rozpoznajaco-ladujaca dla kolejnego formatu.
Byl to podstawowy format plikow wykonywalnych w Linuxie. Obecnie w trakcie wychodzenia z uzycia, jego nastepca jest
nowszym, bardziej elastyczny i oferujacy wieksze mozliwosci format ELF.
Obsluga tego formatu przez jadro zapewnia: ladowanie programu, ladowanie dzielonej biblioteki procedur, zrzut obrazu na
dysk.
Plik wykonywalny w formacie a.out zawiera cztery czesci:
plik: "fs/binfmt_aout.c"
init_aout_binfmtregister_binfmt z parametrem script_binfmtcleanup_moduleunregister_binfmt dla script_binfmtdo_load_aout_binarydo_load_aout_librarydo_aout_core_dump
ELF (Executable and Linking Format) jest formatem plikow binarnych pierwotnie napisanym przez USL (UNIX System Laboratories) i uzywanym w systemach Solaris i System V Release 4. Jego duza elastycznosc spowodowala, ze programisci bibliotek GCC i C dla Linuxa uznali w roku 1994, ze ELF bedzie nastepca wysluzonego a.out .
Posiada nastepujace mozliwosci
gcc -shared -Wl,-soname,libfoo.so.y -o libfoo.so.y.x *.oplik: "fs/binfmt_elf.c"
init_elf_binfmtcleanup_moduledo_load_elf_binarydo_load_elf_libraryelf_core_dump