UEFI之Basetools技巧总结

2024-05-29 03:48
文章标签 总结 技巧 uefi basetools

本文主要是介绍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技巧总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012559

相关文章

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举