2012-04-04 6 views
0

Ich habe ein sehr seltsames Problem. Ich baue zwei Bibliotheken aus einer Softwarequelle: statisch (mit ar) und dynamisch (mit gcc). Nachdem ich meine Testanwendung mit der dynamischen Bibliothek verknüpft habe, funktioniert es einwandfrei. Eine mit der statischen Bibliothek verbundene Testanwendung existiert jedoch entweder mit "segmentation fault" oder mit "Unhandled fault: alignment exception ... illegal instruction".Warum eine statische Bibliothek zu Ausrichtungsproblemen führt, wenn die gleiche gemeinsam genutzte Bibliothek in Ordnung ist?

Warum? Ich weiß, dass es einen Fehler in meinem Softwarecode gibt, aber gibt es einen Unterschied in der Speicherausrichtung, wenn eine statische Bibliothek verwendet wird?

+4

Es ist schwer zu sagen. Sie sind zwei unterschiedlich kompilierte Codebits, mit denen Sie arbeiten. Es ist wahrscheinlich ein Fehler in Ihrem Code, der in einem Fall einfach nicht auftritt. –

Antwort

1

Wenn Sie sich die Definition von statischer versus dynamischer Verknüpfung ansehen, sollte klar sein, dass das Speicherlayout für die beiden fraglichen Binärdateien sehr unterschiedlich ist.

Mit statischer Verknüpfung, alle Objektcode, der benötigt wird, um die Abhängigkeiten zu erfüllen, die in der Linkersymboltabelle erstellt werden, ist in der resultierenden Binärdatei enthalten.

Mit dynamischer Verknüpfung werden diese Abhängigkeiten in Platzhalter umgeschrieben, die der Loader beim Laden der Binärdatei zu erfüllen versucht. Der tatsächliche Objektcode wird entsprechend den Ausrichtungsanforderungen, die für dynamische Bibliotheken vorhanden sind, irgendwo in den Speicher geladen.

Der größte Unterschied liegt also darin, welcher Objektcode in der Binärdatei enthalten ist. Etwas in Ihrer statischen Bibliothek wird eingeschlossen, was die Ausführung zum Scheitern bringt. Ich würde vorschlagen, dass Sie einen selektiven Einheitstest an Ihrem Bibliothekscode durchführen, zusammen mit einer Codeüberprüfung, um das Problem zu lokalisieren.

Verwandte Themen