GNU LD: So überschreiben Sie einen Symbolwert (eine Adresse), der durch das mit -T angegebene Linkerskript definiert ist

Mein Usecase ist wie folgt:

Ich verwende ein typisches SDK, das mit Makefile-basierten Projekten geliefert wirdIch glaube, der Linker ist gcc gepatcht. gcc --version gibt mir 4.3.4SDK definiert das Linker-Skript (nennen wir es Linker.ld)Linker.ld enthält LinkerMemMap.cfg, das die absoluten Adressen für verschiedene Abschnitte im verknüpften ELF-Bild definiertSDK stellt Anwendungsvorlagen bereit, die auf Makefiles (GNU Make 3.81) basieren und sich selbst erstellenIm SDK bereitgestellte Makefile-Vorlage, wenngcc wird aufgerufen, wird die Linker.ld mit der Befehlszeilenoption -T versehen, 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 ist wie folgt:

Ich möchte die in Linker.ld definierten Abschnitte verwenden und die Speicherzuordnung gemäß LinkerMemMap.cfg verwenden, aber ein bestimmtes in LinkerMemMap.cfg definiertes Symbol (nennen wir es SYMBOL_RAM_START) optimieren

Was funktioniert:

Ich habe im Makefile versucht, vor dem Verknüpfen des endgültigen ELF-Image die LinkerMemMap.cfg (die in Linker.ld enthalten ist) in das Build-Verzeichnis zu kopieren und zu patchen, um SYMBOL_RAM_START neu zu definieren. Diesefunktioniert während der Linker zuerst nach den Linkerskripten und den Dateien sucht, die in den Linkerskripten im aktuellen Ordner enthalten sind.

Was nicht:

Leider halten unsere Stakeholder die oben beschriebene Methode für zu riskant und zu komplex, um sie zu verstehen. Ich möchte den Symbolwert in der Linker-Befehlszeile mit etwas wie dem Folgenden ü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

Keine dieser Angaben scheint Auswirkungen auf das vom Linker erstellte verknüpfte Bild zu haben.

Kann --defsym die durch das mit -T angegebene Linkerskript definierten Symbole überschreiben?Könnte jemand von euch bitte sehen, was ich hier falsch mache?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage