Czytam o bibliotekach w C, ale nie znalazłem jeszcze wyjaśnienia, czym jest plik obiektowy. Jaka jest prawdziwa różnica między jakimkolwiek innym skompilowanym plikiem a plikiem obiektowym?
Byłbym szczęśliwy, gdyby ktoś mógł wyjaśnić w ludzkim języku.
c
compilation
linker
object-files
Pithikos
źródło
źródło
Odpowiedzi:
Plik obiektowy to rzeczywisty wynik fazy kompilacji. Jest to głównie kod maszynowy, ale zawiera informacje, które pozwalają konsolidatorowi zobaczyć, jakie symbole są w nim zawarte, a także symbole wymagane do działania. (Dla porównania „symbole” to w zasadzie nazwy obiektów globalnych, funkcji itp.)
Linker bierze wszystkie te pliki obiektowe i łączy je w jeden plik wykonywalny (zakładając, że może, tj .: że nie ma żadnych zduplikowanych lub niezdefiniowanych symboli). Wiele kompilatorów zrobi to za Ciebie (czytaj: samodzielnie uruchamiają linker), jeśli nie powiesz im, aby „po prostu kompilowały” za pomocą opcji wiersza poleceń. (
-c
jest to typowa opcja „po prostu skompiluj; nie łącz”).źródło
Plik Object to sam skompilowany plik. Nie ma między nimi różnicy.
Plik wykonywalny jest tworzony przez połączenie plików Object.
Plik obiektowy zawiera instrukcje niskiego poziomu, które mogą być zrozumiane przez CPU. Dlatego nazywany jest również kodem maszynowym.
Ten kod maszynowy niskiego poziomu jest binarną reprezentacją instrukcji, które można również napisać bezpośrednio w języku asemblera, a następnie przetworzyć kod asemblera (przedstawiony w języku angielskim) na język maszynowy (przedstawiony w postaci szesnastkowej) przy użyciu asemblera.
Oto typowy przepływ wysokiego poziomu dla tego procesu dla kodu w języku wysokiego poziomu, takiego jak C
-> przechodzi przez preprocesor
-> aby dać zoptymalizowany kod, nadal w C
-> przechodzi przez kompilator
-> aby podać kod asemblera
-> przechodzi przez asemblera
-> aby podać kod w języku maszynowym, który jest przechowywany w PLIKACH OBIEKTÓW
-> przechodzi przez Linkera
-> aby pobrać plik wykonywalny.
Ten przepływ może mieć pewne odmiany, na przykład większość kompilatorów może bezpośrednio generować kod języka maszynowego, bez przechodzenia przez asembler. Podobnie mogą wykonać za Ciebie wstępne przetwarzanie. Mimo to miło jest rozbić części składowe w celu lepszego zrozumienia.
źródło
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 plikexecutable 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żywasymbol resolution
irelocation
.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. Zdynamic 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.
źródło
Plik obiektowy jest tym, co otrzymujesz, gdy kompilujesz jeden (lub kilka) plików źródłowych.
Może to być w pełni ukończony plik wykonywalny lub biblioteka albo pliki pośrednie.
Pliki obiektowe zazwyczaj zawierają kod natywny, informacje o konsolidatorze, symbole debugowania i tak dalej.
źródło
Pliki obiektów są kodami zależnymi od funkcji, symboli i tekstu potrzebnych do uruchomienia programu. Podobnie jak stare teleksy, które wymagały teleksów, aby wysyłać sygnały do innych teleksów.
W ten sam sposób, w jaki procesor wymaga kodu binarnego do uruchomienia, pliki obiektowe są jak kod binarny, ale nie są połączone. Łączenie tworzy dodatkowe pliki, dzięki czemu użytkownik nie musi samodzielnie kompilować języka C. Użytkownicy mogą bezpośrednio otwierać plik exe, gdy plik obiektowy zostanie połączony z jakimś kompilatorem, takim jak język c lub vb itp.
źródło