BIOS 编译过程:C文件到EFI文件
上一篇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文件相关推荐
- 编译过程中,termcap.h 文件找不到路径 licli.a终于生成
编译过程中,termcap.h 文件找不到路径 查看是linux 源码下找不到termcap.h文件 安装了所有关于*cap*的源码包也不起作用 今天终于解决了这个问题,搜termca ...
- 280049 CLB编译过程不产生CLB.vcd文件问题解决办法
280049 CLB编译过程不产生CLB.vcd文件问题解决办法 最近在用280049使用CLB模块时,碰到按照TI官方文件提供的过程进行编译时不会产生CLB.vcd文件的情况. 1.TI官方论坛对这 ...
- UltraISO打开Ubuntu镜像ISO文件只有EFI文件夹
问题 在安装Ubuntu时,需要先制作U盘启动盘,在用软碟通UltraISO打开Ubuntu镜像ISO文件只有EFI文件夹. 原因 UltraISO软件版本过低. 解决办法 重新安装新版本的Ultra ...
- 关于编译过程中生成的中间文件和库文件
看到网上一些对库文件比较好的说法,把它整理一下: 函数和数据被编译为机器码之后存入一个二进制文件中,在使用目标文件(obj)或者静态库(lib)时,链接器从目标文件或静态库中找到这些代表函数和数据的二 ...
- MDK编译过程和文件详解
MDK编译过程 编译生成的不同的文件将在后面进行详细说明 1) 编译:MDK软件使用的编译器是armcc和armasm,它们根据每个c/c++和汇编文件编译成对应的以".o"为后缀 ...
- c语言缺少函数头怎么办,c语言编译时如何解决缺少头文件和库的问题
问题原因: 我们都知道我们写一个程序不可能所有东西都重头去开发,因此我们会使用一些其它人写好的文件或者说叫做库函数等.但是有时候因为路径的设置不对,或者是文件的丢失,或者是文件版本不对,或者是文件的编 ...
- gcc编译c文件_Linux下C语言程序的编译过程
Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...
- MDK 的编译过程及文件类型全解
出处:MDK 的编译过程及文件类型全解 MDK 的编译过程及文件类型全解 ------(在arm9的开发中,这些东西都是我们自己搞定的,但是在windows上,IDE帮我们做好了,了解这些对深入开发是 ...
- GCC编译过程以及对应FILE文件表
gcc/g++在执行编译工作的时候,总共需要4步 (1).预处理:生成.i的文件[预处理器cpp] (2).编译:将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] (3).汇编:有汇编变 ...
- C++头文件和源文件,编译过程
源文件如何根据#include来关联头文件 1.系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找. #include <xxx.h> 2.用户自定义的文件用双引号括起来, ...
最新文章
- linux访问文档根目录之外的网页_开发文档加载不再卡顿,亿点点提升
- [MEGA DEAL] 2020年完整的Java Master Class Bundle(96%)
- Flash Builder 创建CSS
- OCR系列——文本检测任务
- 技术动态 | 事理图谱,下一代知识图谱
- mongodb和mysql的对比_MongoDB和MySQL的区别
- 红包指定分配金额php,php仿微信红包分配算法的实现方法_PHP
- java map函数指针_C 函数指针与回调函数
- (王道408考研数据结构)第五章树-第三节2:二叉树构造和重建
- 简单易懂的破解脱壳从0开始
- [2010-8-24]
- 获取 Adobe Creative Cloud 2023 创意应用软件,解锁无限创造力
- 矩阵分解(5)-- 正定矩阵与半正定矩阵
- SIM卡高速PCB设计指南
- 盗版win10右下角去水印_轻松去掉Win10桌面右下角的测试模式水印
- JavaScript 上万条数据 导出Excel文件 页面卡死
- js获取月的第一天、最后一天
- 重新思考:在ResNet与Transformer均适用的跳跃连接
- SQL Server数据库学习总结及T-SQL语法使用实战
- linux yum和apt,yum和apt-get用法及区别