2012-06-07 21 views
8

È possibile che uno script del linker acceda alle variabili makefile/shell e prenda una decisione in base alla suddetta variabile?Crea o variabili di shell nello script Linker

Ad esempio, si supponga di voler modificare l'inizio dell'area RAM in basso senza utilizzare uno script di linker differente, sarebbe possibile utilizzare una variabile make per fare ciò?

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

risposta

0

Ne dubito anche se dipenderebbe dal linker che si sta utilizzando. Potrebbe essere possibile per il linker leggere alcune variabili esportate da make ma come ho detto tutto ciò dipenderebbe dalla specifica funzionalità del linker. Un'altra idea potrebbe essere fino a quando il file linker non sarà troppo complicato, una possibilità sarebbe quella di generarlo usando il makefile. Ci sono molti esempi su cui potresti fare a google per fare in modo che i makefile generino i file di intestazione, potresti seguire lo stesso percorso per generare un file linker.

+0

sto usando ld (dal GCC a olset). Ho pensato di generare lo script ma speravo di non modificare troppo l'infrastruttura di make circostante. Comunque, ho deciso di avere semplicemente un altro script linker e scegliere uno o l'altro durante la fase di collegamento basata su una variabile make. Era una soluzione più semplice rispetto alla generazione dello script. Grazie per la tua risposta però. – jkayca

0

Se la soluzione di decidere all'interno del makefile quale uno dei vari script del linker non è sufficiente, la generazione dello script all'interno di make potrebbe essere un'opzione valida.

Questa soluzione si basa sulle variabili letterali di make di GNU, che vengono esportate in variabili di ambiente e fanno riferimento a $$. Sto usando questo per la definizione di una variabile del percorso da utilizzare per includere uno script del linker in un altro script del linker in questo 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) 

Spiegazione: questa è una parte del makefile e funziona solo se i makefiles utilizzare $ (LDSCRIPT) come prerequisito in tutte le regole pertinenti.

2

ld non importa alcuna variabile dall'ambiente, quindi non può utilizzarli direttamente. Il modo migliore per farlo è quello di creare il proprio script del linker con le variabili di ambiente che si desidera esportare, e hanno lo script del linker originale includerlo come così:

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) ... 
Problemi correlati