上一篇Blog介绍了exe的生成,从C 到 exe可以通过“cl /c”来编译到“obj”,然后再“link”到exe。如果用到其他lib的话,还需要用“/I<dir> add to include search path”来添加相应的lib文件。

这里我们写了一个最精简的Pkg,里面有个最精简的UEFI app,用来探究C文件到EFI文件的过程。这个UEFI app 代码只有“Hello.inf”和“Hello.c”两个文件,使用了最少的lib,以方便看流程:

#include <Uefi.h>EFI_STATUS
EFIAPI
Main (IN EFI_HANDLE        ImageHandle,IN EFI_SYSTEM_TABLE  *SystemTable)
{return EFI_SUCCESS;
}

用“build > log.txt”可以把build log记录下来分析,log里面跟这个app相关的命令有以下几条:

 "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Vc\bin\cl.exe" /Fod:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\OUTPUT\.\Hello.obj /nologo /arch:IA32 /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Id:\udk2017_25818\AppPkgSample\Hello  /Id:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG  /Id:\udk2017_25818\MdePkg  /Id:\udk2017_25818\MdePkg\Include  /Id:\udk2017_25818\MdePkg\Include\Ia32 d:\udk2017_25818\AppPkgSample\Hello\Hello.c"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Vc\bin\cl.exe" /Fod:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\OUTPUT\.\AutoGen.obj /nologo /arch:IA32 /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Id:\udk2017_25818\AppPkgSample\Hello  /Id:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG  /Id:\udk2017_25818\MdePkg  /Id:\udk2017_25818\MdePkg\Include  /Id:\udk2017_25818\MdePkg\Include\Ia32 d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG\AutoGen.c"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Vc\bin\lib.exe" /NOLOGO /LTCG /OUT:d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\OUTPUT\Hello.lib @d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\OUTPUT\object_files.lst"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Vc\bin\link.exe" /OUT:d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG\Hello.dll /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:X86 /LTCG /DLL /ENTRY:_ModuleEntryPoint /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data  @d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\OUTPUT\static_library_files.lst"GenFw" -e UEFI_APPLICATION -o d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG\Hello.efi d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG\Hello.dll

这个过程就是EFI编译的过程,我们来分析每一步的意义,每一个命令接收了什么东西,产出了什么东西,都要搞清楚。

第一步:命令"cl.exe",输入:Hello.c,输出:Hello.obj. 主要参数:/Fo 生成obj文件,/c 只编译不链接,/I 设定搜索目录。如下:

"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Vc\bin\cl.exe" /Fod:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\OUTPUT\.\Hello.obj /nologo /arch:IA32 /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Id:\udk2017_25818\AppPkgSample\Hello  /Id:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG  /Id:\udk2017_25818\MdePkg  /Id:\udk2017_25818\MdePkg\Include  /Id:\udk2017_25818\MdePkg\Include\Ia32 d:\udk2017_25818\AppPkgSample\Hello\Hello.c

第二步:命令"cl.exe",输入:AutoGen.c,输出:AutoGen.obj ,如下:

 "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Vc\bin\cl.exe" /Fod:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\OUTPUT\.\AutoGen.obj /nologo /arch:IA32 /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Id:\udk2017_25818\AppPkgSample\Hello  /Id:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG  /Id:\udk2017_25818\MdePkg  /Id:\udk2017_25818\MdePkg\Include  /Id:\udk2017_25818\MdePkg\Include\Ia32 d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG\AutoGen.c

第三步:命令"lib.exe",输入:Hello.obj&AutoGen (见objobject_files.lst),输出:Hello.lib。如下:

"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Vc\bin\lib.exe" /NOLOGO /LTCG /OUT:d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\OUTPUT\Hello.lib @d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\OUTPUT\object_files.lst

其中,object_files.lst内容如下,可见用到了第一步的Hello.obj和第二步的AutoGen.obj:

d:/udk2017_25818/Build/AppPkgSample/RELEASE_VS2013x86/IA32/AppPkgSample/Hello/Hello/OUTPUT/Hello.obj
d:/udk2017_25818/Build/AppPkgSample/RELEASE_VS2013x86/IA32/AppPkgSample/Hello/Hello/OUTPUT/AutoGen.obj

第四步:命令"link.exe",输入:“static_library_files.lst”里面的lib文件,输出:Hello.dll。如下:

"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Vc\bin\link.exe" /OUT:d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG\Hello.dll /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:X86 /LTCG /DLL /ENTRY:_ModuleEntryPoint /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data  @d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\OUTPUT\static_library_files.lst

其中,static_library_files.lst内容如下,可见用到了第三步生成的Hello.lib:

d:/udk2017_25818/Build/AppPkgSample/RELEASE_VS2013x86/IA32/MdePkg/Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/BaseMemoryLib.lib
d:/udk2017_25818/Build/AppPkgSample/RELEASE_VS2013x86/IA32/MdePkg/Library/BasePcdLibNull/BasePcdLibNull/OUTPUT/BasePcdLibNull.lib
d:/udk2017_25818/Build/AppPkgSample/RELEASE_VS2013x86/IA32/MdePkg/Library/BaseLib/BaseLib/OUTPUT/BaseLib.lib
d:/udk2017_25818/Build/AppPkgSample/RELEASE_VS2013x86/IA32/MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull/OUTPUT/BaseDebugLibNull.lib
d:/udk2017_25818/Build/AppPkgSample/RELEASE_VS2013x86/IA32/MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib/OUTPUT/UefiBootServicesTableLib.lib
d:/udk2017_25818/Build/AppPkgSample/RELEASE_VS2013x86/IA32/MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint/OUTPUT/UefiApplicationEntryPoint.lib
d:/udk2017_25818/Build/AppPkgSample/RELEASE_VS2013x86/IA32/AppPkgSample/Hello/Hello/OUTPUT/Hello.lib

第五步:命令"GenFw",输入:Hello.dll,输出:Hello.efi。如下:

"GenFw" -e UEFI_APPLICATION -o d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG\Hello.efi d:\udk2017_25818\Build\AppPkgSample\RELEASE_VS2013x86\IA32\AppPkgSample\Hello\Hello\DEBUG\Hello.dll

BIOS 编译过程:C文件到EFI文件相关推荐

  1. 编译过程中,termcap.h 文件找不到路径 licli.a终于生成

    编译过程中,termcap.h      文件找不到路径   查看是linux  源码下找不到termcap.h文件 安装了所有关于*cap*的源码包也不起作用 今天终于解决了这个问题,搜termca ...

  2. 280049 CLB编译过程不产生CLB.vcd文件问题解决办法

    280049 CLB编译过程不产生CLB.vcd文件问题解决办法 最近在用280049使用CLB模块时,碰到按照TI官方文件提供的过程进行编译时不会产生CLB.vcd文件的情况. 1.TI官方论坛对这 ...

  3. UltraISO打开Ubuntu镜像ISO文件只有EFI文件夹

    问题 在安装Ubuntu时,需要先制作U盘启动盘,在用软碟通UltraISO打开Ubuntu镜像ISO文件只有EFI文件夹. 原因 UltraISO软件版本过低. 解决办法 重新安装新版本的Ultra ...

  4. 关于编译过程中生成的中间文件和库文件

    看到网上一些对库文件比较好的说法,把它整理一下: 函数和数据被编译为机器码之后存入一个二进制文件中,在使用目标文件(obj)或者静态库(lib)时,链接器从目标文件或静态库中找到这些代表函数和数据的二 ...

  5. MDK编译过程和文件详解

    MDK编译过程 编译生成的不同的文件将在后面进行详细说明 1) 编译:MDK软件使用的编译器是armcc和armasm,它们根据每个c/c++和汇编文件编译成对应的以".o"为后缀 ...

  6. c语言缺少函数头怎么办,c语言编译时如何解决缺少头文件和库的问题

    问题原因: 我们都知道我们写一个程序不可能所有东西都重头去开发,因此我们会使用一些其它人写好的文件或者说叫做库函数等.但是有时候因为路径的设置不对,或者是文件的丢失,或者是文件版本不对,或者是文件的编 ...

  7. gcc编译c文件_Linux下C语言程序的编译过程

    Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...

  8. MDK 的编译过程及文件类型全解

    出处:MDK 的编译过程及文件类型全解 MDK 的编译过程及文件类型全解 ------(在arm9的开发中,这些东西都是我们自己搞定的,但是在windows上,IDE帮我们做好了,了解这些对深入开发是 ...

  9. GCC编译过程以及对应FILE文件表

    gcc/g++在执行编译工作的时候,总共需要4步 (1).预处理:生成.i的文件[预处理器cpp] (2).编译:将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] (3).汇编:有汇编变 ...

  10. C++头文件和源文件,编译过程

    源文件如何根据#include来关联头文件  1.系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找. #include <xxx.h> 2.用户自定义的文件用双引号括起来, ...

最新文章

  1. linux访问文档根目录之外的网页_开发文档加载不再卡顿,亿点点提升
  2. [MEGA DEAL] 2020年完整的Java Master Class Bundle(96%)
  3. Flash Builder 创建CSS
  4. OCR系列——文本检测任务
  5. 技术动态 | 事理图谱,下一代知识图谱
  6. mongodb和mysql的对比_MongoDB和MySQL的区别
  7. 红包指定分配金额php,php仿微信红包分配算法的实现方法_PHP
  8. java map函数指针_C 函数指针与回调函数
  9. (王道408考研数据结构)第五章树-第三节2:二叉树构造和重建
  10. 简单易懂的破解脱壳从0开始
  11. [2010-8-24]
  12. 获取 Adobe Creative Cloud 2023 创意应用软件,解锁无限创造力
  13. 矩阵分解(5)-- 正定矩阵与半正定矩阵
  14. SIM卡高速PCB设计指南
  15. 盗版win10右下角去水印_轻松去掉Win10桌面右下角的测试模式水印
  16. JavaScript 上万条数据 导出Excel文件 页面卡死
  17. js获取月的第一天、最后一天
  18. 重新思考:在ResNet与Transformer均适用的跳跃连接
  19. SQL Server数据库学习总结及T-SQL语法使用实战
  20. linux yum和apt,yum和apt-get用法及区别

热门文章

  1. 搭载自研芯片马里亚纳 MariSilicon X,OPPO Find X5系列正式发布
  2. 信息安全原理复习资料
  3. loadrunner11下载
  4. 数据库宿舍管理系统MySQL表_数据库课程设计报告—宿舍管理系统.doc
  5. zbar扫描二维码,条维码
  6. 扫描二维码,下载Android安装包
  7. 如何自学软件编程?零基础自学编程入门指南
  8. 阿里图标css的使用中的使用方法,iconfont阿里巴巴矢量图标库的正确使用方法
  9. 网页跳转代码的三种方法
  10. 从PHP门外汉---菜鸟---高手的进阶之路