Plik wykonywalny — Executable

Hex zrzut z wykonywalnego trybie rzeczywistym ładowaczem

W obliczeniowej , kod wykonywalny , to plik wykonywalny , lub program wykonywalny , czasami po prostu dalej jako wykonywalny lub binarny , powoduje, że komputer „do wykonywania czynności wskazanych zgodnie z zakodowanymi instrukcjami ”, w przeciwieństwie do pliku danych , które muszą być interpretowane ( parsowane ) przez program, aby były znaczące.

Dokładna interpretacja zależy od zastosowania. „Instrukcje” są tradycyjnie rozumiane jako instrukcje kodu maszynowego dla fizycznego procesora . W niektórych kontekstach plik zawierający instrukcje skryptowe (takie jak kod bajtowy ) może być również uważany za wykonywalny.

Generowanie plików wykonywalnych

Pliki wykonywalne można zakodować ręcznie w języku maszynowym, chociaż o wiele wygodniej jest tworzyć oprogramowanie jako kod źródłowy w języku wysokiego poziomu, który może być łatwo zrozumiały dla ludzi. W niektórych przypadkach kod źródłowy może być określony w języku asemblerowym , który pozostaje czytelny dla człowieka będąc blisko związany z instrukcjami kodu maszynowego.

Język wysokiego poziomu jest kompilowany do pliku wykonywalnego kodu maszynowego lub niewykonywalnego kodu maszynowego – pewnego rodzaju pliku obiektowego ; równoważny proces w kodzie źródłowym języka asemblerowego nazywa się asembler . Kilka plików obiektowych jest połączonych w celu utworzenia pliku wykonywalnego. Pliki obiektowe – wykonywalne lub nie – są zwykle przechowywane w formacie kontenera , takim jak Executable and Linkable Format (ELF) lub Portable Executable (PE), który jest specyficzny dla systemu operacyjnego . Daje to strukturę wygenerowanemu kodowi maszynowemu, na przykład dzieląc go na sekcje, takie jak .text (kod wykonywalny), .data (zainicjowane zmienne globalne i statyczne) i .rodata (dane tylko do odczytu, takie jak stałe i ciągi).

Pliki wykonywalne zazwyczaj zawierają również system wykonawczy , który implementuje funkcje języka wykonawczego (takie jak planowanie zadań , obsługa wyjątków , wywoływanie konstruktorów i destruktorów statycznych itp.) oraz interakcje z systemem operacyjnym, w szczególności przekazywanie argumentów, środowisko i zwracanie stanu wyjścia wraz z innymi funkcjami uruchamiania i zamykania, takimi jak zwalnianie zasobów, takich jak uchwyty plików . W przypadku języka C odbywa się to poprzez dowiązanie w obiekcie crt0 , który zawiera rzeczywisty punkt wejścia i przeprowadza konfigurację i zamykanie przez wywołanie biblioteki wykonawczej .

Pliki wykonywalne zwykle zawierają zatem znacznie dodatkowy kod maszynowy poza kodem wygenerowanym bezpośrednio z określonego kodu źródłowego. W niektórych przypadkach pożądane jest pominięcie tego, na przykład w przypadku rozwoju systemów wbudowanych lub po prostu zrozumienie, jak działa kompilacja, łączenie i ładowanie. W C można to zrobić przez pominięcie zwykłego środowiska uruchomieniowego i zamiast tego jawnie określając skrypt konsolidujący, który generuje punkt wejścia i obsługuje uruchamianie i zamykanie, takie jak wywołanie maindo startu i zwrócenie statusu wyjścia do jądra na końcu.

Wykonanie

Aby mógł zostać uruchomiony przez system (taki jak system operacyjny, oprogramowanie układowe lub program ładujący ), plik wykonywalny musi być zgodny z interfejsem binarnym aplikacji (ABI) systemu. W prostych interfejsach plik jest wykonywany przez załadowanie go do pamięci, przeskoczenie na początek przestrzeni adresowej i wykonanie stamtąd. W bardziej skomplikowanych interfejsach pliki wykonywalne mają dodatkowe metadane określające osobny punkt wejścia . Na przykład w ELF punkt wejścia jest określony w polu nagłówka e_entry, które określa adres (wirtualnej) pamięci, od którego ma się rozpocząć wykonywanie. W GCC ( GNU Compiler Collection ) to pole jest ustawiane przez linker na podstawie _startsymbolu.

Zobacz też

Bibliografia

Zewnętrzne linki