參考文檔:《Build Options》
1. 通用部分
BL2/BL31/BL31:指定生成fip文件的BL2/BL31/BL32鏡像路徑,指定后則不需要編譯BL2鏡像。
BL2_AT_EL3:使能后BL2鏡像會運行在EL3異常等級。
BL2_IN_XIP_MEM:使能后BL2會運行在XIP存儲設備上。只需要在RAM上初始化讀寫段,RO代碼段不需要拷貝。
BL32_EXTRA1/BL32_EXTRA2:生成fip的TOS Extra1/Extra2鏡像路徑。
DISABLE_BIN_GENERATION:禁止生成二進制鏡像,默認為0。如果為1,則默認只輸出ELF格式鏡像。
EL3_PAYLOAD_BASE:指定EL3鏡像的入口地址,跳過后面鏡像讀取加載流程。
ENABLE_ASSERTIONS:配置編譯時是否使能assert()。1表示將assert()編譯在版本內;0表示關閉assert()。
ENABLE_BACKTRACE:配置編譯版本是否支持backtrace dump功能。
ENABLE_LTO:僅在AARch64平台可用,配置是否支持鏈接時優化(Link Time Optimization)功能。
ENABLE_PIE:配置是否使能位置無關可執行代碼功能,默認為0。僅支持BL2_AT_EL3、BL31、BL32。
ENABLE_STACK_PROTECTOR:配置GCC stack protection選項,允許值為all、strong、default、none。
FIP_NAME:指定FIP文件名稱,默認為fip.bin。
FWU_FIP_NAME:指定FWU FIP文件名稱,默認為fwu_fip.bin。
LDFLAGS:用戶添加鏈接命令選項。
PLAT:指定編譯ATF的平台配置,必須要plat/下的對應目錄匹配,並包含一個platform.mk文件。
PRELOADED_BL33_BASE:從預加載的BL33鏡像啟動,入口地址由此配置指定。
PROGRAMMABLE_RESET_ADDRESS:1允許復位vector address可配置,0是固定。默認為0。
RESET_TO_BL31:使用BL31作為復位vector,而不是使用BL1入口。0使用BL1入口地址,1使用BL31入口地址。默認為0。
SPD:指定ATF中編譯的Secure Payload Dispatcher名稱,跟services/spd下目錄一致。目錄下需要包含一個同名的<spd-value>.mk文件。
SPIN_ON_BL1_EXIT:1表示BL1退出時進入無限循環,0表示不使用無限循環。使用1可以在鏡像加載完成、MMU和Cache都關閉的時候,接入調試器進行調試。
2. 安全相關
ROT_KEY:指定包含ROT PEM格式私鑰的文件並且強制生成公鑰hash。
SAVE_KEYS:告訴證書生成工具將秘鑰保存到指定文件。
GENERATE_COT:決定是否編譯並執行TBB中對每個COT生成認證信息的工具cert_create。默認為0。
- TRUSTED_BOARD_BOOT=1且GENERATE_COT=1:
- TRUSTED_BOARD_BOOT=0且GENERATE_COT=1:
- TRUSTED_BOARD_BOOT=1且GENERATE_COT=0:
COT:如果使能Trusted Boot,選擇意向Chain of Trust,默認為tbbr。
CREATE_KEYS:在GENERATE_COT=1時,告訴證書生成工具生成新key,以免遇到未指定或無效key的情況。可選0或1,默認為1。
DYN_DISABLE_AUTH:具備在運行時關閉TBB鏡像驗證功能,僅在開發階段有意義。
OPENSSL_DIR:提供用來做鏡像簽名和加密工具的openssl安裝目錄。
2.1 簽名
通過KEY_ALG和KEY_SIZE選擇簽名算法和秘鑰位寬,哈希算法由HASH_ALG指定。
KEY_ALG:允許用於選擇生成PKCS秘鑰以及簽名所使用的算法,支持選項有rsa、rsa_1_5、ecdsa。默認為rsa,兼容TBBR的PKCS#1 RSA2.1。
KEY_SIZE:允許用戶選擇KEY_ALG指定算法的秘鑰大小。
KEY_ALG |
Possible key sizes |
---|---|
rsa |
1024, 2048(default), 3072, 4096 |
ecdsa |
unavailable |
BL31_KEY/BL32_KEY/BL33_KEY:在GENERATE_COT=1使能后,指定BL31/BL32/BL33 PEM格式私鑰文件。如果指定SAVE_KEYS=1,則用於保存key。
NON_TRUSTED_WORLD_KEY:在GENERATE_COT=1時生效,指定Non-Trusted World PEM格式私鑰文件。
TRUSTED_WORLD_KEY:在GENERATE_COT=1時生效,指定Trusted World PEM格式私鑰文件。
2.2 加密相關
通過DECRYPTION_SUPPORT選擇加密算法,以及ENC_KEY選擇秘鑰,ENCRYPT_BL31/ENCRYPT_BL32選擇加密鏡像。
DECRYPTION_SUPPORT:允許用戶使用經過驗證的解密算法來對啟動過程中的鏡像解密。兩種選項aes_gcm或none。none表示關閉解密功能。是否支持其他aes模式擴展,取得性能和安全平衡?
ENC_KEY:一個32字節(256位)的對稱秘鑰,可以是SSK或BSSK方式。
ENC_NONCE:一個12字節(96位)的nonce或IV秘鑰。nonce是一個只被使用一次的任意或非重復的隨機數值。
ENCRYPT_BL31/ENCRYPT_BL32:在DECRYPTION_SUPPORT打開后,表示是否對BL31/BL32鏡像進行加密。
FW_ENC_STATUS:指定鏡像加密秘鑰管理方式。0,一類設備使用相同的SSK(Secrete Symmetric Key);1,每個設備使用獨有的BSSK(Binding Secret Symmetric Key)。
2.3 哈希
HASH_ALG:選擇hash算法選項,可選sha256、sha384、sha512。默認為sha256。
2.4 中斷
EL3_EXCEPTION_HANDLING:設置為1時,異常處理將由EL3進行處理;設置為0時,EL3將不會進行異常處理,結果是進行panic。
SEC_INT_DESC_IN_FCONF:用於決定是否使用關鍵配置框架配置Group 0和Group 1位安全中斷。
GICV2_G0_FOR_EL3:不同於GICv3,GICv2沒有EL3專用中斷。將GICV2_G0_FOR_EL3置為1,則表示期望GICv2 Group 0中斷發送到EL3。這意味着所有GICv2 Group 0中斷被送到EL3,並且Secure Payload中斷需要被同步送到S.EL1處理。默認值為0,表示Group 0中斷默認被S.EL1處理。
HANDLE_EA_EL3_FIRST:置為1,則外部異常和SError中斷會被EL3捕獲。置為0,異常則會陷入當前EL(如果當前EL是EL0,則會陷入EL1。)
SP_MIN_WITH_SECURE_FIQ:
TSP_NS_INTR_ASYNC_PREEMPT:
3. 調試
編譯調試版本:
make PLAT=<platform> DEBUG=1 V=1 all
DEBUG:選擇編譯調試版本還是發布版本,0發布版本,1調試版本。
ARM GCC默認使用DWARF 4調試符號。某些工具可能不支持,可以通過-gdwarf-<version>來指定DWARF版本,比如為2或3。
某些時候甚至需要關閉編譯優化來定位問題,使用-O0。
CFLAGS='-O0 -gdwarf-2' \ make PLAT=<platform> DEBUG=1 V=1 all