Co to jest plik obiektowy w C?

140

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.

Pithikos
źródło
Bardziej aktywna wersja tego: stackoverflow.com/questions/12122446/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

153

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ń. ( -cjest to typowa opcja „po prostu skompiluj; nie łącz”).

cHao
źródło
W rzeczywistości, w przypadku większości kompilatorów, wynikiem fazy kompilacji jest kod asemblera, a następnie kompilator wywołuje asembler, aby przekształcić go w plik obiektowy.
Chris Dodd
15
@ChrisDodd: Tak było często w przypadku starszych kompilatorów. Obecnie kompilator nie generuje kodu asemblera, chyba że o to poprosisz, i często nie używa go wewnętrznie. Ale tak czy inaczej, montaż byłby podfazą fazy kompilacji, więc wszystko to jest dyskusyjne.
cHao
2
czy pojedynczy plik obiektowy może być wykonywalny?
Kochanie,
1
@Honey: Generalnie nie. Nawet jeśli plik obiektowy był w formacie zaprojektowanym do wykonania (którym w zasadzie nigdy nie jest), ta część dotycząca „symboli, których wymaga do działania” w zasadzie kończy transakcję. Nawet Twój standardowy „hello world” wymaga linkowania z biblioteką wykonawczą C.
cHao
74
  1. Plik Object to sam skompilowany plik. Nie ma między nimi różnicy.

  2. Plik wykonywalny jest tworzony przez połączenie plików Object.

  3. Plik obiektowy zawiera instrukcje niskiego poziomu, które mogą być zrozumiane przez CPU. Dlatego nazywany jest również kodem maszynowym.

  4. 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.

RHT
źródło
5
Zoptymalizowany kod nie jest generowany na etapie preprocesora ani bezpośrednio po nim. Preprocesor radzi sobie tylko z własnym językiem i to wszystko. Optymalizacja ma miejsce na etapie kompilacji i montażu.
Ignas2526
Czy plik obiektowy, który otrzymujemy po kompilacji, jest tym samym, co plik wykonywalny w języku maszynowym. Jestem zdezorientowany, ponieważ powiedziałeś, że plik obiektowy jest tworzony w drugim kroku od ostatniego, a ostatni krok to plik wykonywalny. A więc plik .0, który otrzymujemy po kompilacji, czy to plik wykonywalny?
AV94
czy pojedynczy plik obiektowy nie może być również wykonywalny?
Kochanie,
33

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.

Paschalis
źródło
11

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.

Mata
źródło
2

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.

Farhan
źródło