GNU LD: cómo reemplazar un valor de símbolo (una dirección) definido por el script del vinculador especificado usando -T

Mi caso de uso es el siguiente:

Estoy usando un SDK típico que viene con proyectos basados ​​en MakefileCreo que el enlazador está parcheado gcc. gcc --version me da 4.3.4SDK define el script del enlazador (llamémoslo Linker.ld)Linker.ld incluye LinkerMemMap.cfg, que define las direcciones absolutas para varias secciones en la imagen ELF vinculada.SDK proporciona plantillas de aplicación basadas en Makefiles (GNU Make 3.81) y se hace a sí mismo.En la plantilla de Makefile proporcionada por el SDK, cuandogcc se invoca el Linker.ld se proporciona con la opción de línea de comando -T, de la siguiente manera:

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

Mi requisito es el siguiente:

Me gustaría usar las secciones como se define en Linker.ld y usar el mapa de memoria según LinkerMemMap.cfg, sin embargo, modificar un símbolo particular (llamémoslo SYMBOL_RAM_START) definido en LinkerMemMap.cfg

Que funciona:

He intentado en el makefile, antes de vincular la imagen final de ELF, copie el LinkerMemMap.cfg (que está incluido por Linker.ld) al directorio de compilación y parchelo para redefinir SYMBOL_RAM_START. Estafunciona a medida que el enlazador busca los scripts del vinculador y los archivos incluidos por los scripts del vinculador en la carpeta actual primero.

Lo que no hace

Desafortunadamente, nuestras partes interesadas piensan que el método anterior es demasiado arriesgado y complejo de entender. Me gustaría anular el valor del símbolo en la línea de comando del vinculador con algo como a continuación:

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

Ninguno de estos parece tener ningún efecto en la imagen vinculada creada por el enlazador.

¿Puede --defsym anular los símbolos definidos por el script de enlace especificado usando -T?¿Podría alguno de ustedes ver qué estoy haciendo mal aquí?

Respuestas a la pregunta(1)

Su respuesta a la pregunta