Plik obiektu - Object file

Plik obiektowy to plik komputerowy zawierający kod obiektowy , to znaczy dane wyjściowe kodu maszynowego asemblera lub kompilatora . Kod obiektowy jest zwykle relokowalny i zazwyczaj nie jest bezpośrednio wykonywalny . Istnieją różne formaty plików obiektowych, a ten sam kod maszynowy można spakować w różnych formatach plików obiektowych. Plik obiektowy może również działać jak biblioteka współdzielona .

Oprócz samego kodu wynikowego pliki obiektowe mogą zawierać metadane używane do łączenia lub debugowania, w tym: informacje dotyczące rozwiązywania symbolicznych powiązań między różnymi modułami, informacje o relokacji, informacje o rozwijaniu stosu , komentarze , symbole programów , informacje dotyczące debugowania lub profilowania . Inne metadane mogą obejmować datę i godzinę kompilacji, nazwę i wersję kompilatora oraz inne informacje identyfikujące.

Termin „program obiektowy” pochodzi z co najmniej lat pięćdziesiątych:

Termin w automatycznym programowaniu dla programu języka maszynowego wytwarzanego przez maszynę przez tłumaczenie programu źródłowego napisanego przez programistę na język podobny do notacji algebraicznej.

Programista komputerowy generuje kod obiektowy za pomocą kompilatora lub asemblera . Na przykład, pod Linuksem The GNU Compiler Collection kompilator wygeneruje pliki z rozszerzeniem .o które używają ELF format. Kompilacja w systemie Windows generuje pliki z rozszerzeniem .obj, które używają formatu COFF . Konsolidator jest następnie używany do łączenia kodu obiektowego w jeden program wykonywalny lub bibliotekę, która w razie potrzeby pobiera prekompilowane biblioteki systemowe. Programy JavaScriptinterpretowane, podczas gdy programy Python i Java są kompilowane do plików kodu bajtowego .

Formaty plików obiektowych

Istnieje wiele różnych formatów plików obiektowych; pierwotnie każdy typ komputera miał swój własny, unikalny format, ale wraz z pojawieniem się Uniksa i innych przenośnych systemów operacyjnych , niektóre formaty, takie jak ELF i COFF , zostały zdefiniowane i używane w różnych rodzajach systemów. Możliwe jest, aby ten sam format był używany zarówno jako wejście i wyjście konsolidatora , a zatem jako biblioteka i format pliku wykonywalnego . Niektóre formaty mogą zawierać kod maszynowy dla różnych procesorów, przy czym poprawny jest wybierany przez system operacyjny podczas ładowania programu.

Niektóre systemy rozróżniają formaty, które są bezpośrednio wykonywalne i formaty, które wymagają przetwarzania przez linker. Na przykład OS/360 i następcy nazywają pierwszy format modułem ładowania, a drugi modułem obiektu . W tym przypadku pliki mają zupełnie inne formaty.

Projekt i/lub wybór formatu pliku obiektowego jest kluczową częścią całego projektu systemu. Wpływa na wydajność konsolidatora, a tym samym na czas pracy programisty podczas opracowywania programu. Jeśli format jest używany dla plików wykonywalnych, projekt ma również wpływ na czas potrzebny do programów uaktywnione , a tym samym czas reakcji dla użytkowników.

Bezwzględne pliki obiektów

Wiele wczesnych komputerów lub małych mikrokomputerów obsługuje tylko bezwzględny format obiektu. Programy nie podlegają relokacji; muszą być skompilowane lub skompilowane w celu wykonania pod określonymi, predefiniowanymi adresami. Plik nie zawiera informacji o relokacji ani powiązaniach. Pliki te mogą być ładowane do pamięci do odczytu/zapisu lub przechowywane w pamięci tylko do odczytu . Na przykład monitor Motorola 6800 MIKBUG zawiera procedurę odczytu pliku obiektu bezwzględnego ( format SREC ) z taśmy papierowej . Pliki DOS COM są nowszym przykładem absolutnych plików obiektowych.

Segmentacja

Większość formatów plików obiektowych składa się z oddzielnych sekcji danych, z których każda zawiera określony typ danych. Sekcje te są znane jako „segmenty” ze względu na termin „ segment pamięci ”, który wcześniej był powszechną formą zarządzania pamięcią . Kiedy program jest ładowany do pamięci przez program ładujący , program ładujący przydziela programowi różne regiony pamięci. Niektóre z tych regionów odpowiadają segmentom pliku obiektowego i dlatego są zwykle znane pod tymi samymi nazwami. Inne, takie jak stos, istnieją tylko w czasie wykonywania. W niektórych przypadkach relokacja jest wykonywana przez program ładujący (lub linker) w celu określenia rzeczywistych adresów pamięci. Jednak w przypadku wielu programów lub architektur relokacja nie jest konieczna, ponieważ jest obsługiwana przez jednostkę zarządzania pamięcią lub kod niezależny od pozycji . W niektórych systemach segmenty pliku obiektowego mogą być następnie kopiowane (stronicowane) do pamięci i wykonywane bez konieczności dalszego przetwarzania. W tych systemach można to zrobić leniwie , to znaczy tylko wtedy, gdy do segmentów odwołuje się podczas wykonywania, na przykład za pośrednictwem pliku mapowanego w pamięci obsługiwanego przez plik obiektowy.

Typy danych obsługiwane przez typowe formaty plików obiektowych:

Segmenty w różnych plikach obiektowych mogą być łączone przez linker zgodnie z regułami określonymi podczas definiowania segmentów. Istnieją konwencje dotyczące segmentów współdzielonych między plikami obiektowymi; na przykład w DOS istnieją różne modele pamięci, które określają nazwy specjalnych segmentów i określają, czy można je łączyć.

Informacje debugowania mogą być integralną częścią formatu pliku obiektowego, jak w COFF , lub częściowo niezależnym formatem, który może być używany z kilkoma formatami obiektowymi, takimi jak stabs lub DWARF .

Projekt GNU „s binarne biblioteki deskryptor pliku (biblioteka BFD) zapewnia wspólny interfejs API do manipulacji plików obiektowych w różnych formatach.

Bibliografia

Dalsza lektura