UEFI 之 HelloWorld

本文讲述了在UEFI应用开发中遇到的UefiMain函数名冲突问题,如何通过添加EFIAPI宏来修复,并详细介绍了编译、链接和调试EmulatorPkg的过程。涉及了INF文件配置、源代码管理及Emulator的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础的Hello World

main.c
/*main.c */
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/UefiApplicationEntryPoint.h>

EFI_STATUS
EFIAPI
UefiMain (
          IN EFI_HANDLE        ImageHandle,
          IN EFI_SYSTEM_TABLE  *SystemTable
          )
{
   SystemTable -> ConOut-> OutputString(SystemTable -> ConOut, L"HelloWorld\n"); 
   return EFI_SUCCESS;
}
main.inf
##

[Defines]
  INF_VERSION                    = 0x00010005
  BASE_NAME                      = main                   #输出文件的名字为 main.efi
  FILE_GUID                      = 6987936E-ED34-ffdb-AE97-1FA5E4ED2117
  MODULE_TYPE                    = UEFI_APPLICATION #模块类型:UEFI_DRIVER,DXE_DRIVER,DXE_RUNTIME_DRIVER,UEFI_APPLICATION,BASE,等
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = UefiMain               #入口函数

  UEFI_HII_RESOURCE_SECTION      = TRUE
#
# The following information is for reference only and not required by the build tools.
#
#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
#

# 源文件
[Sources]
  main.c

# .dec里面定义 include的路径
[Packages]
  MdePkg/MdePkg.dec

#要链接的库
[LibraryClasses]
  UefiApplicationEntryPoint
  UefiLib

[Protocols] 
[FeaturePcd]
[Pcd.common]
[Guids]
 
#编译选项, = 表示选项附加到默认选项后面。 == 表示仅使用所定义的选项,弃用默认选项。
[BuildOptions]
  #MSFT:*_*_*_CC_FLAGS ==  /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1ib2 /GL  /EHs-c- /GR- /GF /Gy /Zi /Gm /D EFI_SPECIFICATION_VERSION=0x0002000A /D TIANO_RELEASE_VERSION=0x00080006 /FAs /Oi-
  #MSFT:*_*_*_CC_FLAGS =   /wd4804 
  #MSFT:Debug_*_IA32_CC_FLAGS = 
  #MSFT:Debug_*_X64_CC_FLAGS = 
  #MSFT:Release_*_IA32_CC_FLAGS = 
  #MSFT:Release_*_IA32_CC_FLAGS = 
  #MSFT:Release_*_IA32_DLINK_FLAGS = 
  #GCC:Release_*_IA32_CC_FLAGS = 
将inf加入到EmulatorPkg/EmulatorPkg.dsc进行比编译
[Components]
Demo/01_helloworld/main.inf

编译

source edkenv.sh
EmulatorPkg/build.sh
运行

运行Emulator后进入Shell命令行

EmulatorPkg/build.sh run
(gdb) r

Continue进入命令行
Shell> fs0: 进入fs0 目录
Emulator默认的fs0目录在edk2/Build/Emulator/DEBUG_GCC5/X64
FS0:\> main.efi

问题

问题一:
将inf加入到EmulatorPkg/EmulatorPkg.dsc进行编译出现如下问题;

edk2/Demo/01_helloworld/main.c:7:1: error: conflicting types for ‘UefiMain’
 UefiMain (
 ^
In file included from <command-line>:0:0:
edk2/Build/Emulator/DEBUG_GCC5/X64/Demo/01_helloworld/main/DEBUG/AutoGen.h:67:1: note: previous declaration of ‘UefiMain’ was here
make: 对“tbuild”无需做任何事。
 UefiMain (

解决,是由于在函数名前少了一个宏EFIAPI

EFI_STATUS
EFIAPI
UefiMain (
          IN EFI_HANDLE        ImageHandle,
          IN EFI_SYSTEM_TABLE  *SystemTable
          )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值