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.cplik ź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 -gmetadane łą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 filesjest 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 resolutioni relocation.
Przeczytaj bonus:
Podczas łączenia z static libraryfunkcjami, do których istnieją odwołania w obiektach wejściowych, są kopiowane do końcowego pliku wykonywalnego. Z dynamic librariestabeli 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 myexecutablewywoła wszystkie polecenia wymienione w punkcie 1 i 3 (cpp -> cc1 -> as -> ld 1 )
1: tak naprawdę to collect2, czyli opakowanie nad ld.