HINTERGRUND verknüpftgcc Linker - OBJ-Dump hat Quelle-Baugruppe gemischt, aber nicht, wenn sie in .elf
Ich habe ein Projekt unter Verwendung von C-Code und C++ Code. Die Verknüpfung ist kein Problem: Die C-Funktionen werden korrekt vom C++ - Code aufgerufen.
Alle meine .cpp
Dateien werden mit -g3
kompiliert, sondern nur main.c
und pyexec.c
sind -g3
; Rest hat keine Debug-Informationen.
Der Verknüpfungsschritt besteht aus der Verknüpfung einiger .cpp
Archive, .cpp
Objekte und Archiv mit .c
Objekte.
PROBLEM
Wenn ich ein objdump
auf meinem .elf
objdump APP.elf -dSsxsgetr > elf.dump
ich die Quelle der .cpp
Dateien sehen mit der Montage durchsetzt, aber nicht für die beiden .c
Dateien mit -g3
zusammengestellt .
DOUBLE-CHECK
Ich bin absolut sicher, dass ich main.c
und pyexec.c
mit -g3
zusammengestellt. Als ich eine objdump -dSsxsgetr
main.obj
machte, sehe ich die Quelle mit der Assembly zusätzlich Debug-Symbole wie .debug_line
durchsetzt, die die gesamte Quelle meiner .c
Datei enthält.
Meine Link-Befehl ist:
arm-none-eabi-ld.exe HW_Interface.obj HW_Module.obj HeapMngr.obj C_archive.a Cpp_archive.a -nostartfiles --no-warn-mismatch --gc-sections --stats --cref -Map=APP.map -T "APP.ld" -o "APP.elf"
FRAGE
Warum sind nicht die Debug-Zeilennummern aus den .c
Objekte zusammengestellt mit -g3
in die .elf
bekommen?
UPDATE 1
Ich denke, was die Symbole Strippen ist mein Linker-Skript-Anweisung mit der --gc-sections
Option an den Linker kombiniert ist:
.dflash_code :
{
*ATI_micropython.dlb:*(.text.*)
*ATI_micropython.dlb:*(.debug*)
} >dflash
Diese Aussage ist "richtig", aber was geschieht, (Ich denke) ist, dass, weil ich nicht explizit angeben, was auch immer Eingangsabschnitt enthält die Zeile-für-Zeile-Informationen und, weil --gc-sections
sagt verwerfen alle "unbenutzten" Abschnitte, diese Information wird gelöscht.
Die eigentliche Frage ist also: Was ist der Eingabeabschnitt, den ich zu .dflash_code
hinzufügen muss, die die gemischte Quellbaugruppe enthält? Der Abschnitt .debug_line
ist bereits enthalten und enthält die gesamte Quelle für eine bestimmte Datei.
In gibt es einen Abschnitt namens Discarded input sections
. In diesem Abschnitt sehe ich, dass nur für meine zwei .c
Debug-Dateien gibt es eine Reihe von .debug_macro
Aussagen. . . was macht keinen Sinn, weil alle solche Abschnitte erfasst haben sollte (es sei denn, ich missverstand ihren Zweck).
.debug_macro 0x00000000 0x3a ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x35 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x3a ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x52 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x19 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x189 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x10 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x22 ..\archive.dlb(main.doj)
.debug_macro 0x00000000 0x91 ..\archive.dlb(main.doj)
Ist es möglich, dass, was auch immer die C-Objekt-Dateien in das Bibliotheksarchiv legt, das Entfernen von Symbolen ist? –
@MichaelBurr nein, um die '.obj's zu überprüfen, entzippe ich das Archiv der Bibliothek, aber ich denke, ich weiß, was das Entfernen der Symbole ist; Siehe mein Update in Kürze. – Adrian
@MichaelBurr aktualisiert – Adrian