GNU LD: Como sobrescrever um valor de símbolo (um endereço) definido pelo script de vinculador especificado usando -T

Meu usecase é o seguinte:

Eu estou usando um SDK típico que vem com projetos baseados em MakefileEu acredito que o linker é corrigido pelo gcc. gcc --version me dá 4.3.4O SDK define o script de vinculador (vamos chamá-lo de Linker.ld)Linker.ld inclui LinkerMemMap.cfg, que define os endereços absolutos para várias seções na imagem ELF vinculadaO SDK fornece modelos de aplicativos baseados em Makefiles (GNU Make 3.81) e se tornaNo SDK fornecido modelo Makefile, quandogcc é invocado o Linker.ld é fornecido com a opção de linha de comandos -T, da seguinte maneira:

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

Minha exigência é a seguinte:

Eu gostaria de usar as seções conforme definido no Linker.ld e usar o mapa de memória como LinkerMemMap.cfg no entanto tweak um símbolo específico (vamos chamá-lo SYMBOL_RAM_START) definido no LinkerMemMap.cfg

O que funciona:

Eu tentei no makefile, antes de vincular a imagem ELF final, copiar o LinkerMemMap.cfg (que é incluído por Linker.ld) para o diretório de compilação e consertá-lo para redefinir SYMBOL_RAM_START. estefunciona como o vinculador procura primeiro pelos scripts de vinculação e pelos arquivos incluídos pelos scripts de vinculação na pasta atual.

O que não faz?

Infelizmente, nossas partes interessadas acham que o método acima é muito arriscado e complexo para entender. Eu gostaria de substituir o valor do símbolo na linha de comando do vinculador com algo como abaixo:

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

Nada disso parece ter algum efeito na imagem vinculada criada pelo vinculador.

Pode --defsym substituir os símbolos definidos pelo linkerscript especificado usando -T?Algum de vocês poderia ver o que estou fazendo errado aqui?

questionAnswers(1)

yourAnswerToTheQuestion