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.cfgCo 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?