Co zawiera plik obiektowy?

Podczas różnych etapów kompilacji w C lub C++ wiem, że generowany jest plik obiektowy (np. any_name.plik o). Co to robi ?o plik zawiera? Nie mogę go otworzyć, ponieważ jest to plik binarny.

Czy ktoś mógłby mi pomóc? Czy zawartość pliku obiektowego zależy głównie od kompilatora, którego używamy w Uniksie?

Author: Null, 2010-06-15

8 answers

Pliki obiektowe mogą zawierać kilka rzeczy: zasadniczo to niektóre lub wszystkie z poniższej listy:

  • Nazwy Symboli
  • skompilowany kod
  • Dane stałe, np. strings
  • Import-który oznacza zestawione odwołania do kodu (jest naprawiany przez linker)
  • Exports - symbole, które plik obiektowy udostępnia innym plikom obiektowym.

Linker zamienia kilka plików obiektowych w plik wykonywalny, dopasowując wszystkie import i eksport oraz modyfikowanie skompilowanego kodu tak, aby wywoływane były prawidłowe funkcje.

 46
Author: Roddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-15 13:38:23

Istnieje kilka standardowych formatów (COFF, ELF na Unix), zasadniczo są to warianty tych samych formatów, które są używane dla plików wykonywalnych, ale brakuje niektórych informacji. Te brakujące informacje zostaną uzupełnione podczas łączenia.

Formaty plików obiektów w zasadzie zawierają te same informacje:

  • kod binarny wynikający z kompilacji (dla procesora docelowego)
  • dane statyczne używane przez tę część programu (np. ciągi stałe itp.). You can make a finer rozróżnienie między BSS (dane eksportowane) i tekst (dane, które nie będą modyfikowane przez program). Ale to jest najważniejsze dla kompilatora i linkera. Zauważ, że podobnie jak kod binarny, dane są również zależne od celu (big-endian, little-endian, 32bits, 64bits).
  • tabele symboli wyeksportowanych przez tę część programu (głównie punkty wejściowe funkcji)
  • tabele symboli zewnętrznych używanych przez tę część programu

Kiedy obiekty będą połączone ze sobą części kodu to odnosi się do zewnętrznych symboli zostanie zastąpione przez rzeczywiste wartości (cóż, to jest nadal uproszczone, jest ostatnia część, która zostanie wykonana w czasie ładowania podczas uruchamiania programu, ale o to chodzi).

Plik obiektowy może również zawierać więcej informacji o symbolach, które są niezbędne do rozwiązywania importu i eksportu (przydatne do debugowania). Informacje te można usunąć za pomocą polecenia strip.

 7
Author: kriss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-15 14:03:15

Najpierw przeczytaj stronę wiki . Możesz użyć objdump do zbadania takiego pliku:)

 5
Author: Daniel Băluţă,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-21 07:53:40

Plik obiektowy jest skompilowanym źródłem.

Oznacza to, że jest to kod maszynowy, który jest zależny od platformy docelowej (możesz skompilować dla Uniksa w systemie Windows, jeśli naprawdę chcesz) i używanego kompilatora. Różne Kompilatory będą produkować inny kod maszynowy z tego samego pliku źródłowego.

 3
Author: ChrisF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-15 13:35:03

Użyj polecenia file do takich rzeczy. Jest to plik obiektowy ELF na nowoczesnym systemie Linux. Np. w przypadku kompilacji dla 32-bitowego x86.

ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

Dla kontrastu, dynamicznie połączony plik wykonywalny może wyglądać następująco:

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

Aby zobaczyć nagłówki, w tym nazwy sekcji, możesz użyć:

objdump -x any_name.o

Do demontażu:

objdump -d any_name.o
 3
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-15 13:40:55

Po pierwsze, pliki binarne mogą zostać otwarte! Nie bój się tego, potrzebujesz odpowiednich narzędzi! Edytor tekstu, jako dane binarne, nie jest oczywiście właściwym narzędziem; właściwym narzędziem może być edytor szesnastkowy, zaawansowany edytor, taki jak emacs, lub narzędzie, które zamiast po prostu "wysyłać" bajty w ich reprezentacji "szesnastkowej" i pozwalać ci na interpretację danych, zna ten konkretny format i" interpretuje " dane poprawnie, na pewnym poziomie (np. GIMP interpretuje plik PNG jako plik obraz i pokazuje go, analizator PNG "rozkłada" dane wewnątrz sekcji PNG, pokazując flagi w określonych bajtach, ...itp.).

W Twoim przypadku, ogólna odpowiedź jest taka, że plik obiektowy Zawiera Twój skompilowany kod (i dane), a także wszystkie dodatkowe informacje potrzebne linkerowi, i ostatecznie więcej.

Jak te informacje są "zorganizowane", a w niektórych przypadkach na czym składa się "ostatecznie więcej", zależy to od konkretnego formatu obiektu. Niektóre linki do Wikipedii niektóre z możliwości są to, to, to, to ...

Każdy z nich może mieć swoje narzędzia do analizy zawartości; np. readelf dla ELF, objdump dla kilku formatów (try objdump -i) w zależności od sposobu kompilacji.

 3
Author: ShinTakezou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-15 14:13:04

Plik zawiera dane binarne, które muszą być uruchamiane przez łącznik , aby wygenerować plik wykonywalny. Jest to zasadniczo zestaw instrukcji kodu maszynowego z nazwanymi sekcjami (odpowiadającymi Twoim funkcjom). Z Artykułu "Plik obiektowy " Wikipedii:

W informatyce plik obiektowy jest uporządkowany zbiór odrębnych, nazwane sekwencje maszyny kod [potrzebny przypis]. Każda sekwencja, lub obiekt, zazwyczaj zawiera instrukcje dla gospodarza maszyna do wykonać jakieś zadanie, ewentualnie wraz z powiązanymi danymi i metadane (np. przeniesienie informacje, odwijanie stosu informacje, Komentarze, program symbole, debugowanie lub profilowanie informacje). Łącznik jest zazwyczaj służy do generowania pliku wykonywalnego lub biblioteka poprzez łączenie części obiektu pliki.

 1
Author: soulmerge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-15 13:37:09

W środowisku kompilacji GNU można szukać z objdump zarówno w pliku wykonywalnym, jak i w pliku obiektowym.

Jak widać obiekt zawiera tylko kod funkcji zadeklarowanych/odwołanych w skompilowanym pliku(Plik zawiera tylko główną funkcję z wywołaniem scanf i wywołaniem printf).

$ objdump -t scanf_sample.o

scanf_sample.o:     file format pe-i386

SYMBOL TABLE:
[  0](sec -2)(fl 0x00)(ty   0)(scl 103) (nx 1) 0x00000000 scanf_sample.c
File
[  2](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00000000 _main
[  3](sec  1)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .text
AUX scnlen 0x91 nreloc 9 nlnno 0
[  5](sec  2)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .data
AUX scnlen 0x0 nreloc 0 nlnno 0
[  7](sec  3)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .bss
AUX scnlen 0x0 nreloc 0 nlnno 0
[  9](sec  4)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .rdata
AUX scnlen 0x54 nreloc 0 nlnno 0
[ 11](sec  0)(fl 0x00)(ty  20)(scl   2) (nx 1) 0x00000000 ___main
AUX tagndx 0 ttlsiz 0x0 lnnos 0 next 0
[ 13](sec  0)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 __alloca
[ 14](sec  0)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00000000 _memset
[ 15](sec  0)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00000000 _scanf
[ 16](sec  0)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00000000 _printf

Jeśli używasz objdump na pliku wykonywalnym, możesz zobaczyć dużo więcej funkcji (poza tymi znajdującymi się wewnątrz obiektu). Dowodzi to, że plik obiektowy zawiera tylko funkcje zdefiniowane w pliku źródłowym z odniesieniami do innych funkcji. Te odniesienia zostaną rozwiązane w fazie łączenia.

Read more about linkowanie, kompilacji i obiektów.

 1
Author: INS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-15 13:50:55