2012-06-07 10 views
8

¿Es posible que una secuencia de comandos del vinculador tenga acceso a las variables de archivo/shell y tome una decisión en función de dicha variable?Variables de creación o shell en la secuencia de comandos del vinculador

Por ejemplo, supongamos que quiero cambiar el inicio del área RAM a continuación sin utilizar un script de enlazador diferente, ¿sería posible usar una variable make para hacer esto?

MEMORY 
{ 
ifeq ($(SOME_VAR),0) 
RAM (wx) : ORIGIN = 0x100000, LENGTH = 128K 
else 
RAM (wx) : ORIGIN = 0x200000, LENGTH = 128K 
endif 
} 

Respuesta

0

Lo dudo aunque dependería del vinculador que está utilizando. Es posible que el vinculador lea algunas variables exportadas de make, pero como he dicho, todo esto dependería de la funcionalidad específica del enlazador. Otra idea podría ser siempre que el archivo del enlazador no sea demasiado complicado, una opción sería generarlo usando tu archivo MAKE. Hay muchos ejemplos en los que puede buscar google para que los makefiles generen archivos de encabezado, puede seguir la misma ruta para generar un archivo de enlazador.

+0

estoy usando LD (del CCG a olset). Pensé en generar el script, pero esperaba no modificar demasiado la infraestructura de make surrounding. De todos modos, decidí simplemente tener otro script de enlazador y elegir uno u otro durante la etapa de enlace en función de una variable make. Era una solución más simple que generar el script. Gracias por tu respuesta. – jkayca

0

Si la solución de decidir dentro del archivo MAKE no es suficiente con uno de los varios scripts del enlazador, entonces generar el script dentro de make podría ser una opción viable.

Esta solución se basa en las variables textuales de la marca GNU, que se exportan a variables de entorno y se referencian con $$. estoy usando esto para definir una variable de ruta que se utilizará para incluir un guión de enlazado en otro script enlazador de este modo:

define LDSCRIPT_DEF 
/* Include the original libopencm3 linker script */ 
INCLUDE $(OPENCM3_DIR)/lib/stm32/f4/stm32f405x6.ld 

/* Do custom stuff */ 
endef 
export LDSCRIPT_DEF 

$(LDSCRIPT): 
    @echo "$$LDSCRIPT_DEF" > $(LDSCRIPT) 

Explicación: se trata de una parte del archivo MAKE y sólo funciona si los archivos make utilizan $ (LDSCRIPT) como un requisito previo en todas las reglas relevantes.

2

ld no importa ninguna variable del entorno, por lo que no puede usarlas directamente. La mejor manera de hacer esto es crear su propio guión de puente con las variables de entorno que desea exportar, y tienen el guión enlazador original de incluirlo como así:

makefile:

foo: 
    echo SOMEVAR=$(SOMEVAR) > environment_linker_script 
    ld ... 

enviroment_linker_script:

SOMEVAR=xxx 

master_linker_script:

include environment_linker_script 

ifeq ($(SOME_VAR),0) ... 
Cuestiones relacionadas