本文主要是介绍UEFI之Basetools技巧总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
概要
在EDK2中没有编写Makefile的过程,终止是通过Basetools生成编译文件和Makefile的,但是在我们使用中总是感觉没有使用Makefile顺手,所以这里进行总结;
生成静态库进行编译
这个过程就是,我编译生成一个静态库.lib
文件,然后提供别人或自己在以后的编译中使用,省去了重新编译的时间,也可以实现只提供静态库和.h给别人使用;
这里以OpensslLib.inf为例,由于OpensslLib编译非常的慢,所以我就将它做成了一个静态库;
[Defines]INF_VERSION = 0x00010005BASE_NAME = OpensslLibMODULE_UNI_FILE = OpensslLib.uniFILE_GUID = C873A7D0-9824-409f-9B42-2C158B992E69MODULE_TYPE = BASEVERSION_STRING = 1.0LIBRARY_CLASS = OpensslLib
# DEFINE OPENSSL_FLAGS = -DL_ENDIAN -DOPENSSL_SMALL_FOOTPRINT -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DNO_SYSLOG[Binaries.MIPS64EL]Lib|OpensslLib.lib
[Binaries.LOONGARCH64]Lib|OpensslLib_LA.lib
Binaries
就是指定静态库的,后面可以跟架构类型;下面指定静态库的位置和名字,在dsc
文件中指定即可完成编译;如下:
OpensslLib | Capsule/Library/OpensslLib/OpensslLib.inf
类似的方法也可以将.efi
添加进行编译;如下:
[Binaries.MIPS64EL]Efi|OpensslLib..efi
在inf指定头文件目录
正常思路是在dec
中指定头文件的目录,但是有时我们的头文件不想所有文件都包含,因为那样会出现定义冲突,所以想在inf中指定include的路径,想法是在BuildOptions
的FLAGS中添加,但是发现这个只能实现但.h 的添加,
GCC:*_*_LOONGARCH64_CC_FLAGS == -IInclude/Library
会报错,无法进行编译;发现在编译Openssl时生成一个cc_resp.txt
文件,里面都是编译中要链接的路径,不只是dec中指定的,但是也没有找到其他的地方;
现在的解决办法,添加一个单独的dec进行实现,如下:
Universal/Capsule/Capsule.dec
[Defines]DEC_SPECIFICATION = 0x00010005PACKAGE_NAME = CryptoPkgPACKAGE_UNI_FILE = CryptoPkg.uniPACKAGE_GUID = 36470E80-36F2-4ba0-8CC8-937C7D9FF888PACKAGE_VERSION = 0.98[Includes]Include/BaseCryptLib[Includes.Common.Private]Library/OpensslLib/openssl/includeLibrary/OpensslLib/openssl/crypto/include[LibraryClasses]## @libraryclass Provides basic library functions for cryptographic primitives.##BaseCryptLib|Include/Library/BaseCryptLib.h
指定编译或链接对应的.h
在inf文件中
[BuildOptions]
GCC:*_*_LOONGARCH64_CC_FLAGS == -include Include/Library/BaseCryptLib.h
CC 是编译中使用
DLINK 是链接使用
FDF 中直接包含文件
- 直接包含二进制文件
在对应的Section 下添加如下内容
!include AmiModulePkg/NVRAM/NvramFdfFileStatement.txt
NvramFdfFileStatement.txt 内容如下:
FILE RAW = CEF5B9A3-476D-497f-9FDC-E98143E0422C {$(OUTPUT_DIRECTORY)/Nvram.bin}
- 直接包含文件
FILE RAW = 812136D3-4D3A-433A-9418-29BB9BF78F6E { # gEdkiiSystemFmpCapsuleConfigFileGuid
Universal/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
}
更多详细使用可以查看UEFI之FDF
篇
驱动中的依赖
写驱动时在哪inf文件中必须包含[Depex]
,作用是指定依赖的服务或设备,如何没有,驱动是不加载的,输出如下:
Driver 4A9B9DB8-EC62-4A92-818F-8AA0246D246E was discovered but not loaded!!
Driver AE587172-CC15-48E1-8BE0-29DDF05C6A1F was discovered but not loaded!!
Driver 8F2C127E-117D-484B-8A44-FBD911BE125E was discovered but not loaded!!
Driver 129F6AA7-AB69-4CB8-AED1-40985001115E was discovered but not loaded!!
Driver BC0B9FB8-97CF-4B17-9A9E-F574E62CBCC4 was discovered but not loaded!!
Driver 43788BEB-638F-434C-8A84-46D33A589E76 was discovered but not loaded!!
想强制加载,如下:
[Depex]TRUE#gEfiDxeIpmiTransportProtocolGuid
这篇关于UEFI之Basetools技巧总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!