2014-04-25 16 views
6

Chcę wiedzieć, w jaki sposób systemy operacyjne Linux uruchamiają pliki. Z moich wyszukiwań w sieci zrozumiałem, że każdy plik, który ma ustawiony bit działający, może zostać wykonany. Ale potem dowiedziałem się, że istnieje ELF o nazwie format, który jest standardem Linux dla plików wykonywalnych.W jaki sposób Linux wykonuje plik?

Co chcę wiedzieć, co jest potrzebne do pliku, który ma uprawnienia do uruchomienia (uruchomiony bit jest włączony), w celu wykonania kodu w systemie? Czy mogę po prostu utworzyć nowy plik za pomocą edytora szesnastkowego i napisać 90 wewnątrz (kod operacji NOP) i oczekiwać, że zostanie wykonany? Czy Linux wymaga standardowego formatu, takiego jak format ELF lub Bash?

+0

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. –

+0

@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

Odpowiedz

10

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.

+0

Przydatne linki: http://www.linux.it/~rubini/docs/binfmt/binfmt.html – osgx

Powiązane problemy