Mein Anwendungsfall ist wie folgt:
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections -o$(OUTPUT).elf
Meine Anforderung lautet wie folgt:
Was funktioniert:
Was nicht:
Leider halten unsere Stakeholder die oben genannte Methode für zu riskant und zu komplex, um sie zu verstehen. Ich möchte den Symbolwert in der Linker-Befehlszeile mit etwas wie folgt überschreiben:
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections,--defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -o$(OUTPUT).elf
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections --defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -o$(OUTPUT).elf
gcc $(OBJS) -l$(Lib1) -l$(Lib2) --defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections -o$(OUTPUT).elf
Keins von diesen scheint irgendeine Auswirkung auf das verknüpfte Bild zu haben, das vom Linker erzeugt wird.
Während ich darauf gewartet habe, dass jemand antwortet, habe ich das Problem gelöst. Es gibt einige Probleme mit dem Problem hier und ich dachte daran, meine Ergebnisse für jemanden zu erklären, der den gleichen Fehler machen könnte.
Zuerst Alle Optionen, die an den Linker übergeben werden sollen, müssen mit -Xlinker oder mit -Wl angegeben werden. Daher werden sowohl 2 als auch 3 im obigen Fall nicht funktionieren. Die korrigierten 2 und 3 wären wie folgt:
Ist schon richtig
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections -Xlinker --defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -o$(OUTPUT).elf
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -Xlinker --defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections -o$(OUTPUT).elf
Jetzt für den Fall der Optionen 1 & amp; 2 oben, --defsym kommt nach dem Linker-Skript und SYMBOL_RAM_START wurde bereits vom Linker-Skript definiert. Es überschreibt es. Der überschriebene Wert wird jedoch nicht verwendet, da die Abschnitte bereits definiert wurden, da das Linker-Skript bereits verwendet wurde.
Für den Fall der obigen Option 3 wurde das SYMBOL_RAM_START definiert, bevor das Linker-Skript vom Linker gelesen wurde. Daher wird beim Analysieren des Linker-Skripts der im Skript angegebene Wert überschrieben.
Lösung:
Damit dies funktioniert, muss das Linker-Skript das Symbol SYMBOL_RAM_START wie folgt initialisieren:
SYMBOL_RAM_START = DEFINIERT ( SYMBOL_RAM_START )? SYMBOL_RAM_START : DEFAULT_VALUE;
Wenn im obigen Linker-Skript das SYMBOL_RAM_START vor dem Einfügen des Linker-Skripts definiert wurde (wie oben in Option 3 gezeigt), funktionierte es. Aber am Ende musste ich das Linkerscript patchen.
Diese Lösung überschreibt das Symbol nicht wirklich, bietet aber eine Möglichkeit, ein Symbol so zu definieren, dass es überschrieben werden kann.
Tags und Links gcc ld linker-scripts