GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Mein Bootloader lässt sich nicht mit gcc 4.6 und 4.7 kompilieren ... nur 4.5

Durch Kompilieren einer trivialen C-Datei mit den von Ihnen bereitgestellten Flags zwischen gcc-4.5 und gcc-4.6 , und verwenden Sie objdump -h Um die Ausgabe zu untersuchen, scheint es, dass .eh_frame Abschnitt wird in gcc-4.6 eingeführt .

Die ld Das von Ihnen bereitgestellte Skript kümmert sich nicht um diesen Abschnitt, und das sollte es wahrscheinlich. Sie können strip -R .eh_frame -R .eh_frame_hdr verwenden diesen Abschnitt und andere vor dem Verknüpfen aus den Objektdateien zu entfernen.

Wie auch immer, da der Linker für beide gcc-Versionen gleich ist, objdump -h in den Objektdateien wird auf den Unterschied hinweisen, der dieses Problem verursacht.


Gibt es ein Befehlszeilenargument, das eine Funktion ausschaltet, die größere Abschnitte erzeugen kann

Ja:Wenn Ihnen die Größe wichtig ist, sollten Sie mit -Os bauen . Die -O3 aktiviert explizit Optimierungen, die zu einer größeren Codegröße führen könnten. Da der Bootloader einmal ausgeführt wird , mit -O3 denn es ist mit ziemlicher Sicherheit falsch.

Bearbeiten:

"Optimierung in der Montage ist sinnlos ...
... und andere Objekte hier ..."

Ist alles Ihres Codes in Assembler? Wenn ja, ist die Optimierungsstufe tatsächlich bedeutungslos, aber dann sollten Sie einfach die Ausgabe von readelf -S vga_pm.S.o vergleichen können mit beiden Compilern gebaut, und sehen Sie genau welche Abschnitte sind unterschiedlich.

Aber es scheint wahrscheinlicher, dass einige Ihrer Objekte nicht sind in Assembler, in diesem Fall der Unterschied zwischen -O3 und -Os wird sehr aussagekräftig sein.


GCC fügt seiner Binärausgabe einige unerwünschte Debug-Abschnitte hinzu (verwenden Sie objdump -h <file> um sie zu sehen), lege ich normalerweise diejenigen, die ich nicht möchte, in /DISCARD/ Regel in meinen ld-Skripten, um sie loszuwerden:

/DISCARD/ : {
        *(.debug_*)
        *(.note*)
        *(.indent)
        *(.comment)
        *(.stab)
        *(.stabstr)
        *(.eh_frame)
}

Linux
  1. `find` mit mehreren `-name` und `-exec` führt nur die letzten Übereinstimmungen von `-name` aus?

  2. Trimmen mit Lvm und Dm-Crypt?

  3. Können Sie Anker ^ $ mit Ls verwenden?

  4. Warum kann ich mich mit Teilpasswörtern anmelden?

  5. Wie teste ich, auf welchem ​​Port MySQL läuft und ob eine Verbindung möglich ist?

32-Bit-Lebenserhaltung:Cross-Compiling mit GCC

Linux which und whoami Command Tutorial für Anfänger (mit Beispielen)

Eine Datei, deren Name mit einem Bindestrich beginnt, kann nicht umbenannt werden

Was kann ein Angreifer mit Bluetooth machen und wie sollte es abgewehrt werden?

Verschlüsseln Sie Ordner unter Linux, die nur auf diesem bestimmten Betriebssystem und Gerät entschlüsselt werden können

Wie kann ich Platzhalter im ms-dos-Stil mit ls und mv verwenden?