UDK BaseTools

一,UDK編譯時所用到的工具爲以下:

build.exe

trim.exe

GenFw.exe

VfrCompile.exe

GenFds.exe

GenSec.exe

GenFfs.exe

GenFv.exe

VS工具(cl.exe, lib.exe, ml.exe,link.exe)


二,編譯過程

說明文檔裏,把編譯過程分成兩部分:1,所代碼編譯成EFI模塊。 2,將各EFI模塊組成一個FD。用代碼的語言表示,就是build.exe Modules和build.exe Fds。可是我覺得把編譯過程分成三部分更符合coder的思維:1,使用VS將源碼編譯成二進制文件。2,使用BaseTools裏的工具將二進制轉成EFI格式。3,將EFI格式文件轉成FFS,並組成FV,最後組成一個完整的FD。

下面是以我個人的視角,來分析的編譯過程,可能會有出錯的地方,大家用一種批判的眼光來看待吧:

1,輸入edksetup.bat--nt32時,該批處理會將VS的路徑和EFI下的BaseTools添加到環境變量路徑,以後再使用一些命令時,不用再加絕對路徑。

2,  編譯第一步

輸入build.exe命令即可編譯.

Build.exe是一個主命令工具,提供了一個收集不同編譯選項的命令。一般來講,它檢查我們所設的環境變量,收集target.txt裏面的配置信息,解析dsc,dec,inf,target.txt,tools-def.txt。利用VS的nmake.exe產生C和H源文件並且爲各個模塊產生Makefiles;利用cl.exe,ml.exe,lib.exe,link.exe將各個模塊編譯成二進制文件。

下面是一些比較集合式的參數:

ALL          編譯所有東西.

GenC         產生C文件,AutoGen.C,AutoGen.h.

GenMake      產生Makefile文檔,

Fds          產生FD文件.

Libraries    編譯庫文件

Modules      編譯指定的模塊

Clean        只刪除nmake產生的文件

CleanAll     刪除所有產生的文件

 

圖1,第一步編譯



2,  編譯第二步

編譯過後,使用GenFw.exe,將link和lib後的文件轉成efi文件。同時使用vfrcompile.exe將vfr源文件編譯成ifr。

 

圖2,GenFw和vfrCompile編譯




2,  編譯第三步

GenFds可以產生Ffs,Fv,FD和Section data。它收集txt,dsc,fdf,dec和inf文件。FDF文件必須遵守正確的FDF規格。

編譯的第一階段產生PE32/PE32+/Coff二進制文件。GenFds執行第二階段的編譯,通過FDF文件的規則定義編譯使用第一階段產生的二進制文件。EFI文件被編成FFS文件,FFS文件組成FV,各個FV區域組成一個或多個FD。

必須指定輸出目錄,GenFds將產生一個FV目錄,包括FFS目錄,FV文件,FV INF文件和FD文件。FFS目錄包括所有的模塊目錄,裏面包含FFS和SECTION文件。

GenFds所有的輸出都必須在FV目錄裏。所使用的文件爲$(outputDir)\$(Arch) \ $(ActivePlatfromName) \$(ModuleName) \$(ModuleName) \DEBUG的所有文件。

1.  如果Arch指定, GenFds將使用編譯時指定的,而不是target.txt裏寫死的。

2.  如果workspace沒有指定,GenFds工具將使用操作系統指定的。

3.  如果ActivePlatform指定,GenFds將使用編譯時指定的,而不是target.txt裏寫死的。

 

圖3.編譯第三步


這一步是整個編譯的最後一步。它使用Flash map圖fdf文件和-t的工具,產生-a架構的FD文件。我們從該圖中可以看到很多-D的參數。有EFI_SOURCE,EDK_SOURCE,TOOL_CHAIN_TAG,TOOLCHAIN,TARGET,WORKSPACE,EDK_TOOLS_PATH,ARCH,ECP_SOURCE,都是一些編譯所使用的宏定義。GenFds根據它們可以編譯出我們想要的FD。

編譯過程中會調用其它一些編譯工具,如GenSec.exe,GenFfs,GenFv。

由此可以看出,原來Sec部分代碼,還需要單獨的一個工具進行處理,看來,在真實平臺的BIOS代碼,SEC的二進制內容會被調程,甚至機器碼都有修改過。我試過在修改BIOS執行的前幾條指令,然後查看二進制,在JMP之前的指令可以修改。但JMP指令的地址值無論怎麼修改都會被編譯器改變爲其他值。

GenFfs和GenFv也是編譯過程必須用過的工具。一個FD包括N個FV,一個FV包括N個FFS,一個FFS包括一個Module或N個Section。每個FFS都有唯一的GUID標識的HEADER,這樣,我們只要知道某個FV的地址,便可以找出所有的FFS了。

UDK2014的編譯流程大概就是這些了。


發佈了28 篇原創文章 · 獲贊 21 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章