2012-06-07 65 views
8

鏈接器腳本可以訪問makefile/shell變量並根據上述變量做出決定嗎?鏈接器腳本中的Make或Shell變量

例如,假設我想在不使用其他鏈接描述文件的情況下更改下面的RAM區域的起始位置,是否可以使用make變量來執行此操作?

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

回答

0

我對此表示懷疑,儘管它取決於您使用的鏈接器。鏈接器可能會從make中讀取一些導出的變量,但正如我所說的,所有這些都取決於特定的鏈接器功能。另一個想法可能是,只要鏈接文件不會太複雜,一個選項就是使用makefile實際生成它。有很多例子你可以谷歌關於makefiles生成頭文件,你可以按照相同的路徑來生成一個鏈接器文件。

+0

我使用LD(從GCC到該信託基金)。我想過生成腳本,但我希望不要過多地修改周圍的製作基礎架構。無論如何,我決定只是有另一個鏈接腳本,並根據make變量在鏈接階段選擇其中一個或另一個。這是比生成腳本更簡單的解決方案。儘管感謝您的回答。 – jkayca

0

如果解決方案在makefile中確定幾個鏈接器腳本中哪一個腳本不夠用,那麼在make中生成腳本可能是一個可行的選擇。

該解決方案依賴於GNU make的逐字變量,該變量被導出到環境變量並被$$引用。 我使用這個定義路徑變量將用於包括像這樣在另一個鏈接腳本鏈接腳本:

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) 

說明:這是生成文件的一部分,只有在生成文件使用$(作品LDSCRIPT)作爲所有相關規則的先決條件。

2

ld不會從環境中導入任何變量,所以它不能直接使用它們。要做到這一點,最好的辦法是與您要導出的環境變量,創建自己的鏈接腳本,並有原始鏈接腳本把它作爲這樣:

生成文件:

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

enviroment_linker_script:

SOMEVAR=xxx 

master_linker_script:

include environment_linker_script 

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