2016-05-17 5 views
5

Ich frage mich, ob GCC-Linker-Optionen (z. B. -Wl, Optionen) Assembler-Anweisungen in der kompilierten ausführbaren Datei ändern können, wie dies passiert, wenn Sie bestimmte GCC-Optimierungsoptionen verwenden? Kann der Unterschied zwischen der Verwendung einer Linkeroption und deren Nichtbenutzung beim Vergleichen der kompilierten Binärdateien (z. B. beim Vergleichen von Signaturen) festgestellt werden?Kann gcc Linker-Optionen Assembler-Anweisungen in der kompilierten Binärdatei ändern?

UPDATE

Um genauer zu sein Ich will, um herauszufinden, ob FLIRT Signaturen ändern, wenn ich bestimmte Verknüpfungsmöglichkeiten während der Kompilierung-Prozess verwenden. Diese Signaturen verwenden nur Bibliotheksfunktionen zum Erstellen der Signaturen.

+1

Siehe z.B. '--wrap'. – Phillip

+0

@Phillip können Sie das genauer erklären? – Maximilian

+0

Die man-Seite enthält Details zur Option; Es kann verwendet werden, um Symbole zu überschreiben, die zumindest für C-Objektdateien auch die Signatur der Funktion ändern können. – Phillip

Antwort

4

Für einige Linker-Optionen können Änderungen in den erzeugten binären gesehen werden, zum Beispiel:

  • Optionen, um loszuwerden/Bugsymbol halten (--strip-all, --strip-debug, --discard-all)
  • Optionen loswerden von ungenutzten Abschnitten, z ein Abschnitt, der eine Funktion enthält, auf die in anderen Abschnitten nie Bezug genommen wird. Diese Abschnitte können einfach entfernt werden. Oder Umzugsbereiche/Inhalte zu behalten. (--as-needed, --emit-relocs)
  • Optionen eine statische Bibliothek oder ein anderes kompatibles enthalten (zum Beispiel Bibliothek Version x.0 vs Version X.1)
  • Die Reihenfolge, in der Objekte und statische Bibliotheken sind auf der Kommandozeile gesetzt. Zum Beispiel ld -o foo a.obj b.obj c.obj und ld -o foo a.obj c.obj b.obj werden wahrscheinlich eine andere binäre erzeugen, wenn ein Aufruf von a zu einer Funktion in c aufgelöst wird (der Offset für den Code von c.obj und damit die Adresse der Funktion in c wahrscheinlich unterschiedlich sein)

Aber auch nach der Verknüpfung könnte sich die Signatur einer Binärdatei ändern. Wenn Sie z. B. in Linux die binäre Startzeit durch Ausführen von prelink

+0

eigentlich bin ich nur an Änderungen im binary auf Funktionsebene interessiert. Wenn bestimmte Debugsymbole geändert werden, ändert dies nicht den Assemblercode von Funktionen. Können Sie sich ein Szenario vorstellen, in dem sich der Assembly-Code auf der Funktionsbasis mithilfe von Linker-Optionen ändert? – Maximilian

+3

Ja, Aufrufe an andere Objekte können in Abhängigkeit von ihrer Reihenfolge oder der Reihenfolge statischer Bibliotheken oder verschiedener Versionen einer Bibliothek zu unterschiedlichen Offsets/Adressen aufgelöst werden. – Elijan9

+0

aber Funktionen innerhalb einer statischen Bibliothek bleiben unberührt, nicht wahr? – Maximilian

1

optimieren, sehen Sie eine andere Prüfsumme für zwei Binärdateien, die mit verschiedenen Linkeroptionen verknüpft sind - es sei denn, die Option hatte keine Auswirkungen, z. B. wenn Sie einen Standardwert angeben Option oder eine Option, die die Binärdatei (-print-map) nicht ändert.

Was möchten Sie genau herausfinden? Es scheint, als ob Sie Probleme haben, wenn Sie bestimmte Linker-Optionen angeben und Sie versuchen herauszufinden, warum. Erzähl uns mehr und vielleicht können wir besser helfen.

+0

siehe Update oben – Maximilian