2013-01-13 5 views
7

Zunächst möchte ich für den Datensatz angeben, dass diese Frage zu Schule/Hausaufgaben betrifft.C-Objekt-Datei-Kompatibilität zwischen Computern

Computer sagen Lassen CP1 und CP2 beide das gleiche Betriebssystem und Maschinensprache teilen. Wenn ein C-Programm auf CP1 kompiliert wird, um es in CP2 zu verschieben, ist es notwendig, den Quellcode zu übertragen und auf CP2 neu zu kompilieren oder einfach die Objektdateien zu übertragen.

Meine gute Antwort ist, dass die Objektdateien ausreichen sollten. Der C-Code wird vom Compiler in Assembler übersetzt und vom Assembler zu Maschinencode zusammengesetzt. Da die Architektur denselben Maschinencode und dasselbe Betriebssystem verwendet, sehe ich kein Problem.

Aber je mehr ich darüber nachdenke, desto verwirrter werde ich.

Meine Fragen sind:

a) Seit seiner Dateien und nicht ausführbare Dateien auf Objekt Bezug genommen wird, ich es gehe mal davon keine Verknüpfung war. Gibt es Probleme, die beim Verbinden auf CP2 auftreten?

b) Wäre es egal, ob der Code C11-Standard auf CP1 verwendet, aber der einzige Compiler auf CP2 war C99? Ich gehe davon aus, dass dies irrelevant ist, sobald der Code kompiliert/zusammengestellt wurde.

c) Die Frage spezifiziert keine gemeinsam genutzten/dynamisch verbundenen Bibliotheken. Das würde also nur funktionieren, wenn das Programm keine Abhängigkeiten zu .dll/.so/.dylib Dateien hätte, sonst wären diese auch auf CP2 erforderlich.

Ich fühle mich wie es so viele Fallstricke sind, und überlegen, wie vage die Frage, die ich jetzt das Gefühl, dass es sicherer wäre, einfach neu kompilieren.

Halp!

+0

distcc, das Objektdateien zwischen Computern kopiert, empfiehlt die Verwendung der gleichen Version des Compilers auf allen Knoten, auch für die Sprache C. – aschepler

Antwort

3

Die Antwort ist, es kommt darauf an. Wenn Sie ein C-Programm kompilieren und die Objektdateien verschieben, um auf einem anderen Computer zu verknüpfen, sollte es funktionieren. Aber aufgrund von Faktoren wie endianness oder name mangling funktioniert Ihr Programm möglicherweise nicht wie gewünscht, und es kann sogar zum Absturz kommen, wenn Sie versuchen, es auszuführen.

C11 wird nicht von einem C99 Compiler unterstützt, aber es spielt keine Rolle, ob die Quelle kompiliert und assembliert wurde.

Solange die Quelle mit den Bibliotheken auf einer Maschine kompiliert wird, müssen Sie die Bibliotheken nicht benötigt, um die Datei (en) auf dem anderen Computer (statische Bibliotheken nur, dynamische Bibliotheken zu verknüpfen oder laufen müssen auf dem Computer sein, auf dem Sie die Anwendung ausführen). Das heißt, Sie sollten das Programm unabhängig machen, damit Sie nicht auf die gleichen Probleme stoßen wie zuvor, wo das Programm nicht wie vorgesehen funktioniert oder abstürzt.

Sie könnten einen Compiler, die Sie EABI also nicht diese Probleme laufen in unterstützt. Compiler, die die EABI unterstützen, erzeugen Objektcode, der mit Code kompatibel ist, der von anderen solchen Compilern erzeugt wird, wodurch Entwickler Bibliotheken, die mit einem Compiler erzeugt wurden, mit Objektcode verknüpfen können, der mit einem anderen Compiler erzeugt wurde.

Ich habe versucht, dies vor zu tun, aber nicht viel, und in letzter Zeit nicht. Daher sind meine Informationen möglicherweise nicht zu 100% korrekt.

+0

"Sie brauchen die Bibliotheken nicht" - das gilt nur für statische Verknüpfungen. Dynamische Bibliotheken werden nur von Ihrem Programm referenziert und nicht darin kompiliert. Das Programm startet nicht, wenn sie fehlen. –

+0

Danke für den Fang, Bearbeitung gemacht. – syb0rg

+0

Ihre rev 2 ist im Wesentlichen richtig, sollten Sie Namen Mangling und Laufzeitkompatibilität erwähnen, gibt es Systeme, wo Sie tatsächlich für verschiedene Arten von Objektdateiausgaben fragen können, wenn eine neue [ABI] (http://en.wikipedia.org/wiki/Application_binary_interface) ist so viel besser, dass es sich lohnt, die Toolchain neu zu schreiben, um sie zu bekommen. – jthill

1

a) Ich habe schon gehört, der Begriff „Objektdateien“ auf verknüpfte Binärdateien beziehen verwendet wird - auch wenn es ein bisschen ungenau ist. Vielleicht meinen sie "Binärdateien".Ich würde sagen, die Verknüpfung auf einer anderen Maschine könnte problematisch sein, wenn sie einen anderen Compiler hat - , es sei denn, Objektdateiformate sind standardisiert, worüber ich nicht sicher bin.

b) Die Verwendung unterschiedlicher Standards oder gar Compiler spielt für den Binärcode keine Rolle - wenn er statisch verknüpft ist. Wenn es auf Funktionen aus einer dynamischen Lib angewiesen ist, könnte es Probleme geben. Welche Antworten c) auch: Ja, das wird ein Problem sein. Das Programm wird nicht gestartet, wenn nicht alle erforderlichen dynamischen Bibliotheken in der richtigen Version vorhanden sind. Hängt wieder vom Verknüpfungsmodus (statisch vs. dynamisch) ab.

0

F: Nehmen wir an, die Computer CP1 und CP2 teilen sich das Betriebssystem und die Maschinensprache.

A: Dann können Sie die gleichen .exe die auf beiden Computern

Q laufen: Wenn ein C-Programm auf CP1 kompiliert wird, um es zu CP2 zu bewegen, ist es notwendig, den Quellcode

zu übertragen

A: Nein. Sie benötigen nur den Quellcode, wenn Sie neu kompilieren möchten. Sie müssen nur neu kompilieren, wenn es sich um eine andere, inkompatible CPU und/oder ein anderes Betriebssystem handelt.

„Object-Dateien“ sind in der Regel überhaupt nicht für die Programmausführung benötigt:

http://en.wikipedia.org/wiki/Object_files

Eine Objektdatei ist eine Datei relocatable Format Maschinencode enthält , die in der Regel nicht direkt ausführbar ist. Objektdateien werden von einem Assembler, Compiler oder einem anderen Sprachübersetzer erzeugt und als Eingabe für den Linker verwendet.

Ein "ausführbares Programm" muss möglicherweise einen oder mehr "Shared Libraries" (auch bekannt als .dll). In diesem Fall gelten die gleichen Einschränkungen: Die gemeinsam genutzten Bibliotheken müssen, wenn sie nicht bereits resident sind, zusammen mit der EXE-Datei kopiert werden und außerdem mit der CPU und dem Betriebssystem kompatibel sein.

Schließlich müssen "Skripte" nicht müssen neu kompiliert werden. Sie können das Skript frei von Computer zu Computer kopieren. Aber jeder Computer muss einen "Interpreter" haben, um das Skript auszuführen: Ein Perl-Skript benötigt einen Perl-Interpreter, ein Python-Skript einen Python-Interpreter und so weiter.

Verwandte Themen