Warum verhält sich die Bibliothek, die auf zwei leicht unterschiedlichen Maschinen zusammengestellt wurde, etwas unterschiedlich?

StackOverflow https://stackoverflow.com/questions/1268101

Frage

Hier ist das Setup:

Mein Mitarbeiter hat eine Fedora x64_86 -Maschine mit einem GCC 4.3.3 Cross Compiler (von Buildroot). Ich habe eine Ubuntu 9.04 x64_86 -Maschine mit demselben Kreuzkompiler.

Mein Kollege hat eine A -Bibliothek + -T -Test -App erstellt, die auf einer Testmaschine arbeitet.

Soweit ich das beurteilen kann, hat GCC gegen uclibc mit Buildroot-kompiliert, also derselbe Code, derselbe Compiler. Welche Unterschiede für Wirtsmaschinen würden sich auf die Querkompilierung auswirken?

Jede Einsicht geschätzt.

UPDATE: Um es zu verdeutlichen, sind die Compiler identisch. Der Quellcode für Bibliothek und TestApp ist identisch. Der einzige Unterschied besteht darin, dass die testApp + lib auf verschiedenen Maschinen zusammengestellt wurde.

War es hilfreich?

Lösung

Wenn Ihr Code abstürzt (ich gehe davon aus, dass Sie ein Sigsegv erhalten), scheint es einen Fehler zu geben. Es ist höchstwahrscheinlich ein undefiniertes Verhalten, wie ein baumelnder Zeiger oder ein Schreiben über eine Puffergrenze.

Der unglückliche Punkt des undefinierten Verhaltens ist, dass es, dass es kann Arbeiten Sie an einigen Maschinen. Ich denke, Sie erleben hier eine solche Veranstaltung. Versuchen Sie, den Fehler zu finden, und Sie werden wissen, was passiert :-)

Andere Tipps

Auf welche Weise stürzt es ab? Können Sie genauer sein, Ausgabe, Rückgabecodes usw. bereitstellen, haben Sie versucht, einige nützliche printf () zu anschließen?

Und ich denke, wir brauchen hier ein paar weitere Details:

  1. Links der TestApp -Link zur Bibliothek?

  2. Ist die Bibliothek statisch oder dynamisch?

  3. Ist die Bibliothek im Bibliothekssuchpfad oder haben Sie ihr Verzeichnis zu ld.so.conf hinzugefügt?

  4. Verfolgen Sie Installationsverfahren für Bibliothek und TestApp?

  5. Sind die beiden Bibliotheken und TestApps Bit-for-Bit-kompatibel? Erwarten Sie, dass sie es sind?

  6. Laufen Sie als der gleiche Benutzer wie Ihr Mitarbeiter mit der gleichen Umgebung und den Berechtigungen?

Offensichtlich, etwas ist nicht identisch.

Versuchen Sie, Objdump und seine vielen Optionen, insbesondere -D, zu verwenden, um zu bestimmen, was anders ist.

Du hast keinen Sinn daraus gemacht, also werde ich vermuten, dass Binutils der Unterschied ist. Das ist der Satz von Werkzeugen, die zum Erstellen von Binärdateien verwendet werden. Es enthält LD, AS und Objdumph.

Cross-Compiler brauchen ihre eigenen Binutils für die Zielarchitektur. Im Gegensatz zu GCC glaube ich jedoch nicht, dass die Binutils -Tools einen doppelten Bootstrap -Build durchführen und den Schritt überprüfen. Daher ist es möglich, dass ein Unterschied zu der ursprünglichen X86_64 -Build -Umgebung es in sie geschafft hat.

Ich würde versuchen, die Binutils -Pakete wieder für Arm zu bauen, indem ich den Arm Crosscompiler mit dem Arm. Sehen Sie, ob das einen Unterschied macht.

Es ist etwas, das ich in regulären X86-Gentoo-Stage1-Installationen gesehen habe: Nachdem das Bootstrap-System und die Compiler installiert und aktualisiert wurden, ist ein Gentoo-Benutzer gut empfohlen, um das System wieder aufzubauen wieder Verwenden der aktualisierten Tools.

Welcher Bogen ist Ihr Ziel (die Testmaschine)?

Verwenden Sie die verteilungsbedingten Compiler? Sie haben normalerweise einen ziemlich großen Satz von Patches, die auf GCC angewendet werden, zum Beispiel auf Gentoo gibt es ungefähr 20 Patches, Fedora und Ubuntu werden nicht so anders sein. Nicht alle Patches sind jedoch 100% in Ordnung :-( Daher können sich die Compiler in Wirklichkeit unterscheiden.

Möglicherweise suchen Sie nach einer "Vanilla" -Version von GCC auf Ihrer Verteilung, vielleicht macht es den Trick.

Ich kannte jemanden, der eine ähnliche Erfahrung im College hatte. Grundsätzlich arbeitete sein Projekt in einem Labor identischer Maschinen an seiner Entwicklungsbox, stürzte aber schrecklich auf der Professors -Schachtel. Dies waren zwei Maschinen, die den gleichen Bogen waren und dieselbe Version des Betriebssystems ausführten.

Es kochte irgendwo auf einen nicht initialisierten Zeiger.

Er hatte Code, der aussah wie:

if(p == NULL) {
    p = f();
}

Da P ein Mitglied einer Klasse war, die auf dem Haufen zugeteilt wurde, war der Wert effektiv zufällig und leger gelegentlich null, was das Problem in Ordnung war ... das Problem war, dass das Problem war manchmal und weiter etwas Maschinen, der Speicher für P war das Programm zum Programm, aber auf der Box des Profes war es nicht der Fall. Das Fix war natürlich die richtige Initialisierung von P tp Null und alles war gut.

Möglicherweise erleben Sie so etwas. Oder eine Art von Art von undefiniertes Verhalten Das ist eine ausgefallene Art zu sagen: "Es kann wie erwartet aus irgendeinem oder gar keinen Grund funktionieren oder nicht."

Als Stich im Dunkeln würde ich nach nicht initialisierten Variablen suchen. Stellen Sie sicher, dass allen lokalen und globalen Variablen ein Wert zugewiesen werden. Überprüfen Sie, ob Konstruktoren Initialisierer für alle Datenmitglieder haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top