Do spisu tresci tematu 2

2.1.4.1 Formaty plikow wykonywalnych



Spis tresci


Wprowadzenie

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

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"

Kolejne etapy dzialania funkcji do_load_script:

  1. Rozpoznanie pliku skryptu (plik musi sie zaczynac od znakow #!)
  2. Wyluskanie nazwy interpretera jezyka skryptowego i ewentualnych dodatkowych argumentow dla niego(lancuch po #!)
  3. Kontrola pola sh_bang zapewniajaca, ze interpreterem jezyka skryptowego nie jest program napisany w jezyku skryptowym.
  4. Przygotowanie do wywolania programu interpretujacego, argumentami dla niego sa: nazwa skryptu + ewentualne dodatkowe argumenty.
  5. Wywolanie funkcji open_namei poszukujacej i-wezla interpretera.
  6. Jesli operacja rozpoznawania skryptu sie nie powiodla, funkcja wywoluje search_binary_handler, ktora to wywoluje funkcje rozpoznajaco-ladujaca dla kolejnego formatu.



Formaty Javy

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:

  1. W systemie musi byc zainstalowany Java Developers Kit for Linux.
  2. Samodzielne programy-klasy zapisane w plikach typu '*.class', ktore maja byc bezposrednio wykonywane musza miec:
  3. Pliki typu '*.html', ktore zawieraja aplety i maja byc bezposrednio wykonywane musza miec:
  4. Jesli klasy, ktorych uzywa program-klasa badz aplet, znajduja sie poza katalogiem /usr/local/java/classes/ , to nalezy eksportowac zmienna srodowiskowa CLASSPATH z odpowiednio zmodyfikowanymi parametrami.


plik: "fs/binfmt_java.c"

Kolejne etapy dzialania funkcji do_load_script(dla programow-klas):

  1. Testowanie czterech pierwszych bajtow pliku (czy sa to 0xca,0xfe,0xba,0xbe)
  2. Przygotowanie do wywolania przez standardowy shell unixowy (bash) interpretera javy (/usr/bin/java), ktorego argumentem bedzie nazwa pliku w javie z wycietym rozszerzeniem .class
  3. Wywolanie funkcji open_namei poszukujacej i-wezla interpretera.
  4. Jesli operacja rozpoznawania skryptu sie nie powiodla, funkcja wywoluje search_binary_handler, ktora to wywoluje funkcje rozpoznajaco-ladujaca dla kolejnego formatu.

Kolejne etapy dzialania funkcji do_load_applet (dla apletow):

  1. Testowanie dziesieciu pierwszych bajtow w pliku (wzorzec:"<!--applet")
  2. Przygotowanie do wywolania przez standardowy shell unixowy (bash) przegladarki do apletow (/usr/bin/appletviewer), ktorego argumentem jest tym razem nazwa pliku z nieusunietym rozszerzeniem '*.html'.
  3. Wywolanie funkcji open_namei poszukujacej i-wezla interpretera.
  4. Jesli operacja rozpoznawania skryptu sie nie powiodla, funkcja wywoluje search_binary_handler, ktora to wywoluje funkcje rozpoznajaco-ladujaca dla kolejnego formatu.


Format a.out

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:

  1. Naglowek podstawowy opisujacy ilosc sekcji w pliku, adres od ktorego rozpocznie sie wykonywanie procesu i liczbe magiczna, ktora to okresla podformat pliku wykonywanego.
  2. Naglowki sekcji, ktore dla kazdej sekcji w pliku podaja jej rozmiar, adresy wirtualne zajmowane przez sekcje podczas wykonania programu i inne dodatkowe informacje.
  3. Sekcje z kodem, ktore na poczatku laduje sie do przestrzeni adresowej procesu.
  4. Sekcje z tablica symboli i innymi danymi uzytecznymi podczas uruchamiania programu.
Istnieje kilka podformatow w formacie a.out. Wlasciwy podformat rozpoznaje sie na podstawie liczb magicznych umieszczonych wnaglowku pliku. Musza miec one odpowiednie wartosci dla kazdego podformatu. Podformaty sa bardzo podobne, a roznia sie glownie: polozeniem dalszej czesci kodu w pliku i ulozeniem stron. Wspomniane ulozenie umozliwia ladowanie na zadanie, ktore nastepuje dopiero w momencie odwolania sie do adresu znajdujacego sie na danej stronie.


plik: "fs/binfmt_aout.c"



Format ELF

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

 

plik: "fs/binfmt_elf.c"


Bibliografia


Autor: Marcin Truszel