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的编译流程大概就是这些了。


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值