Istnieją 3 rodzaje plików obiektowych.
Przemieszczalne pliki obiektów
Zawierają kod maszynowy w postaci, którą można łączyć z innymi relokowalnymi plikami obiektowymi w czasie łączenia, aby utworzyć wykonywalny plik obiektowy.
Jeśli masz a.c
plik źródłowy, aby utworzyć plik obiektowy za pomocą GCC, powinieneś uruchomić:
gcc a.c -c
Pełny proces wyglądałby następująco: preprocesor (cpp) działałby na ac Jego dane wyjściowe (nadal źródło) zostaną przesłane do kompilatora (cc1). Jego dane wyjściowe (zespół) zostaną przesłane do asemblera (as), który utworzy plik relocatable object file
. Plik ten zawiera kod obiektowy i -g
metadane łączenia (i debugowania, jeśli był używany) i nie jest bezpośrednio wykonywalny.
Pliki obiektów współużytkowanych
Specjalny typ relokowalnego pliku obiektowego, który może być ładowany dynamicznie, w czasie ładowania lub w czasie wykonywania. Przykładem tego typu obiektów są biblioteki współdzielone.
Pliki wykonywalne obiektów
Zawierają kod maszynowy, który można bezpośrednio załadować do pamięci (przez program ładujący, np. Execve ), a następnie wykonać.
Wynikiem działania konsolidatora na wielu relocatable object files
jest plik executable object file
. Linker scala wszystkie wejściowe pliki obiektowe z linii poleceń, od lewej do prawej, scalając wszystkie sekcje wejściowe tego samego typu (np. .data
) Z sekcją wyjściową tego samego typu. Używa symbol resolution
i relocation
.
Przeczytaj bonus:
Podczas łączenia z static library
funkcjami, do których istnieją odwołania w obiektach wejściowych, są kopiowane do końcowego pliku wykonywalnego. Z dynamic libraries
tabeli symbol tworzony jest natomiast, że umożliwi dynamiczne łączenie z biblioteki funkcji / globalnych. W ten sposób wynikiem jest częściowo wykonywalny plik obiektowy, ponieważ zależy to od biblioteki. Jeśli biblioteka nie istnieje, plik nie może już działać).
Proces łączenia można przeprowadzić w następujący sposób:
ld a.o -o myexecutable
Polecenie: gcc a.c -o myexecutable
wywoła wszystkie polecenia wymienione w punkcie 1 i 3 (cpp -> cc1 -> as -> ld 1 )
1: tak naprawdę to collect2, czyli opakowanie nad ld.