GNU LD: Jak zastąpić wartość symbolu (adres) zdefiniowaną przez skrypt linkera określony za pomocą -T

Moja aplikacja jest następująca:

Używam typowego zestawu SDK dostarczanego z projektami opartymi na MakefileWierzę, że linker jest poprawiony gcc. gcc --version daje mi 4.3.4SDK definiuje skrypt linkera (nazwijmy go Linker.ld)Linker.ld zawiera LinkerMemMap.cfg, który definiuje adresy bezwzględne dla różnych sekcji w połączonym obrazie ELFSDK zapewnia szablony aplikacji oparte na plikach Makefile (GNU Make 3.81) i tworzy sięW SDK dostarczonym szablonie Makefile, kiedygcc wywoływany jest linker.ld z opcją -T w linii poleceń, w następujący sposób:

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

Moje wymaganie jest następujące:

Chciałbym skorzystać z sekcji zdefiniowanych w Linker.ld i użyć mapy pamięci zgodnie z LinkerMemMap.cfg, ale ulepszyć konkretny symbol (nazwijmy go SYMBOL_RAM_START) zdefiniowany w LinkerMemMap.cfg

Co działa:

Próbowałem w makefile, przed połączeniem końcowego obrazu ELF, skopiuj LinkerMemMap.cfg (który jest dołączony przez Linker.ld) do katalogu kompilacji i załataj go, aby przedefiniować SYMBOL_RAM_START. Todziała jako linker wyszukuje najpierw skrypty linkera i pliki dołączone przez skrypty linkera w bieżącym folderze.

Co nie:

Niestety nasi interesariusze uważają, że powyższa metoda jest zbyt ryzykowna i złożona, aby ją zrozumieć. Chciałbym nadpisać wartość symbolu w wierszu polecenia linkera za pomocą czegoś takiego jak poniżej:

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

Żadne z nich nie wydaje się mieć żadnego wpływu na połączony obraz utworzony przez linker.

Czy --defsym nadpisuje symbole zdefiniowane przez linkerscript określony za pomocą -T?Czy ktokolwiek z was mógłby zobaczyć, co tutaj robię źle?

questionAnswers(1)

yourAnswerToTheQuestion