Mir wurde eine Frage gestellt: “Was ist eine ‘Objektdatei’?”.
Nach dem Anschauen Wikiich weiß nur, dass es enthält Objekte.
Aber was sind diese Objekte und warum hat sie jemand so genannt?
stlm58
Mir wurde eine Frage gestellt: “Was ist eine ‘Objektdatei’?”.
Nach dem Anschauen Wikiich weiß nur, dass es enthält Objekte.
Aber was sind diese Objekte und warum hat sie jemand so genannt?
Macmade
Objektdateien (oder Objektcode) sind Maschinencodedateien, die von einem Compiler aus dem Quellcode generiert werden.
Der Unterschied zu einer ausführbaren Datei besteht darin, dass die Objektdatei nicht verknüpft ist, sodass Verweise auf Funktionen, Symbole usw. noch nicht definiert sind (ihre Speicheradressen bleiben im Grunde leer).
Wenn Sie eine C-Datei mit GCC kompilieren:
gcc -Wall -o test test.c
Hier kompilieren Sie UND verlinken. Sie erhalten also eine ausführbare Datei, die alle Speicheradressenreferenzen für die enthaltenen Symbole enthält (Bibliotheken, Header usw.).
Aber wenn Sie dies tun:
gcc -Wall -o test.o -c test.c
Sie erstellen eine Objektdatei. Es ist auch Maschinencode, aber es muss gelinkt werden, um eine ausführbare Datei oder eine Bibliothek zu erzeugen.
Wenn Sie beispielsweise ein Projekt mit vielen C-Dateien haben, kompilieren Sie jede einzelne in Objektcode und verknüpfen dann alle Objektdateien miteinander, um das Endprodukt zu erzeugen.
Zum Beispiel:
gcc -Wall -o foo.o -c foo.c // Object file for foo.c
gcc -Wall -o bar.o -c bar.c // Object file for bar.c
gcc -Wall -o main.o -c main.c // Object file for main.c
gcc -Wall -o software foo.o bar.o main.o // Executable (foo + bar + main)
Der Begriff Objekt steht hier für Folgen von unverkettetem Maschinencode (im Grunde). Eine Objektdatei enthält Objekte.
Sie haben gefragt: Warum ist dieser Aufruf so? Ich kann nicht wirklich antworten. Warum heißt “blau” “blau”? ; )
Es ist nur der Begriff, der seit … nun, Jahrzehnten verwendet wird …
Zur Information, die GCC Internals-Dokumentation definiert Objektcode nur als:
Der „Quellcode“ für ein Werk bezeichnet die bevorzugte Form des Werks, um Änderungen daran vorzunehmen. „Objektcode“ bezeichnet jede Nicht-Quellenform eines Werks.
Ziemlich vage über den historischen Grund …
Ich hoffe einfach, dass Sie jetzt besser verstehen, was eine Objektdatei ist. Ich denke, es ist wichtiger als zu wissen, warum es so heißt, denn Wörter sind nur, nun ja, Wörter …
Sie sollten wirklich versuchen, das “Warum heißt das so” zu beantworten, um Ihren gesamten Beitrag hervorragend zu machen: D.
– Bis
23. November 2011 um 23:00 Uhr
Ich glaube, der Name hat etwas mit der Unterscheidung zu tun zwischen:
Objektdateien enthalten:
- Header-Informationen: allgemeine Informationen über die Datei, wie z. B. die Größe des Codes, der Name der Quelldatei, aus der sie übersetzt wurde, und das Erstellungsdatum.
- Objektcode: Binäre Anweisungen und Daten, die von einem Compiler oder Assembler generiert werden.
- Verschiebung: Eine Liste der Stellen im Objektcode, die korrigiert werden müssen, wenn der Linker die Adressen des Objektcodes ändert.
- Symbole: In diesem Modul definierte globale Symbole, aus anderen Modulen zu importierende oder vom Linker definierte Symbole.
- Debugging-Informationen: Andere Informationen über den Objektcode, die nicht zum Linken benötigt werden, aber für einen Debugger nützlich sind. Dazu gehören Quelldatei- und Zeilennummerninformationen, lokale Symbole, Beschreibungen von Datenstrukturen, die vom Objektcode verwendet werden, wie beispielsweise C-Strukturdefinitionen.
Quelle: hier
Eine Objektdatei ist eine binäre Darstellung einer Quelldatei (Textdatei). Es ist eine Sammlung verschiedener Abschnitte, die die Art der Daten trennen in:
Je nach Compiler/Umgebung können diese abweichen.
ZB auf *nix-Systemen:
objdump -d a.out <--- sofern wir a.cpp kompiliert haben
disassembly of section .init:
08048278 <_init>:
8048278: 55 push %ebp
8048279: 89 e5 mov %esp,%ebp
804827b: 83 ec 08 sub $0x8,%esp
804827e: e8 61 00 00 00 call 80482e4 <call_gmon_start>
8048283: e8 b3 00 00 00 call 804833b <frame_dummy>
8048288: e8 9f 01 00 00 call 804842c <__do_global_ctors_aux>
804828d: c9 leave
804828e: c3 ret
Disassembly of section .plt:
08048290 <[email protected]>:
8048290: ff 35 78 95 04 08 pushl 0x8049578
8048296: ff 25 7c 95 04 08 jmp *0x804957c
804829c: 00 00 add %al,(%eax)
...
080482a0 <[email protected]>:
80482a0: ff 25 80 95 04 08 jmp *0x8049580
80482a6: 68 00 00 00 00 push $0x0
80482ab: e9 e0 ff ff ff jmp 8048290 <_init+0x18>
080482b0 <[email protected]>:
80482b0: ff 25 84 95 04 08 jmp *0x8049584
80482b6: 68 08 00 00 00 push $0x8
80482bb: e9 d0 ff ff ff jmp 8048290 <_init+0x18>
Disassembly of section .text:
Die verschiedenen Aufrufbefehle hier werden dann den verschiedenen Bibliotheken zum Aufrufen der eigentlichen Funktionen zugeteilt.
Muhende Ente
Gemäß der von Ihnen verlinkten Seite enthält jede Sequenz oder jedes Objekt normalerweise Anweisungen für den Hostcomputer, um eine Aufgabe auszuführen, möglicherweise begleitet von zugehörigen Daten und Metadaten (z ).
Grundsätzlich ist jedes Objekt in der Objektdatei eine Funktion und die relevanten Informationen für den Linker, um sie in das vollständige Programm aufzunehmen.
Es ist sicherlich eine sehr alte Terminologie, wenn man bedenkt, dass Unix-Compiler produziert haben
.o
Dateien seit mindestens den frühen 1970er Jahren, und es hat nichts mit OO-Programmierung zu tun.– Fred Foo
23. November 2011 um 22:37 Uhr
“Objekt: eine Person oder Sache, auf die eine bestimmte Handlung oder ein bestimmtes Gefühl gerichtet ist.” Das Produzieren dieser Datei ist das Ziel des Ausführens des Compilers, und sie mussten sich einen Namen dafür einfallen lassen, also …
– jthill
27. Mai 2014 um 14:29 Uhr