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_binfmt
register_binfmt
z parametrem script_binfmt
cleanup_module
unregister_binfmt
dla script_binfmt
do_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_binfmt
register_binfmt
raz z parametrem java_format
(odpowiadajacym za
programy-klasy), raz z applet_format
cleanup_module
unregister_binfmt
raz z parametrem java_format
(odpowiadajacym za
programy-klasy), raz z applet_format
do_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 .class
open_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_binfmt
register_binfmt
z parametrem script_binfmt
cleanup_module
unregister_binfmt
dla script_binfmt
do_load_aout_binary
do_load_aout_library
do_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 *.o
plik: "fs/binfmt_elf.c"
init_elf_binfmt
cleanup_module
do_load_elf_binary
do_load_elf_library
elf_core_dump