UEFI Tips: EDK2 Stable202002

前一段试验了新出的 EDK2 Stable202002 版本,可以在 https://github.com/tianocore/edk2/releases/tag/edk2-stable202002 看到,有如下的更新:

New Features

因为有朋友经常遇到环境配置上面的问题,因此,这次直接提供一个 EDK202002 +Win10 + VS2015 的镜像文件。有需要的朋友可以下载之后从 VirtualBox 启动。

链接: https://pan.baidu.com/s/1asiGrFGwyhZ91u9OepCxXg 提取码: m73e

=========================================================

20201019 补充 简单介绍一下 VS2019编译这套代码的方法

为了编译成功,除了 VS2019 还需要安装下面2个软件:

1. Python 3.8 (安装时注意选择 Add python to path)

2.安装 Nasm (安装完后检查一下,如果默认目录不是在C:根目录下,那么需要将全部文件拷贝到 c:\nasm下)

3. 运行 edksetup rebuild  生成编译工具

接下来就遇到奇怪的问题了,当我们使用 build -a X64 -p EmulatorPkg\EmulatorPkg.dsc -t VS2019 命令后,编译中会有如下的错误:

        "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.26.28801\bin\Hostx86\x64\link.exe" /out:"c:\buildbs\s202002\Build\EmulatorX64\DEBUG_VS2019\X64\WinHost.exe" /base:0x10000000 /pdb:"c:\buildbs\s202002\Build\EmulatorX64\DEBUG_VS2019\X64\WinHost.pdb" /ALIGN:4096 /FILEALIGN:4096 /SUBSYSTEM:CONSOLE /EXPORT:InitializeDriver=_ModuleEntryPoint /BASE:0x10000  @c:\buildbs\s202002\Build\EmulatorX64\DEBUG_VS2019\X64\EmulatorPkg\Win\Host\WinHost\OUTPUT\static_library_files.lst
Microsoft (R) Incremental Linker Version 14.26.28806.0
Copyright (C) Microsoft Corporation.  All rights reserved.

c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/EmulatorPkg/Win/Host/WinHost/OUTPUT/WinHost.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/BaseLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/BaseMemoryLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BasePcdLibNull/BasePcdLibNull/OUTPUT/BasePcdLibNull.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull/OUTPUT/BaseDebugLibNull.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull/OUTPUT/PeCoffExtraActionLibNull.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/EmulatorPkg/Library/SecPpiListLib/SecPpiListLib/OUTPUT/SecPpiListLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BasePrintLib/BasePrintLib/OUTPUT/BasePrintLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BasePeCoffLib/BasePeCoffLib/OUTPUT/BasePeCoffLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/EmulatorPkg/Library/ThunkPpiList/ThunkPpiList/OUTPUT/ThunkPpiList.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/EmulatorPkg/Library/ThunkProtocolList/ThunkProtocolList/OUTPUT/ThunkProtocolList.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/EmulatorPkg/Library/SecPeiServicesLib/SecPeiServicesLib/OUTPUT/SecPeiServicesLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib/OUTPUT/FrameBufferBltLib.lib
LINK : warning LNK4108: /ALIGN specified without /DRIVER; image may not run
LINK : warning LNK4001: no object files specified; libraries used
LINK : warning LNK4068: /MACHINE not specified; defaulting to X86
LINK : error LNK2001: unresolved external symbol _ModuleEntryPoint
c:\buildbs\s202002\Build\EmulatorX64\DEBUG_VS2019\X64\WinHost.lib : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.26.28801\bin\Hostx86\x64\link.exe"' : return code '0x460'
Stop.

这是生成模拟器的最后一个动作,但是在 Link 的时候遇到了问题。

偶然发现,在 \EmulatorPkg\Win\VS2017\   有  BuildVS.bat 这个文件,内容如下:

cd ../../../

@call edksetup.bat

build -p EmulatorPkg\EmulatorPkg.dsc -t VS2017 %*

如果我们使用 build -a X64 -p EmulatorPkg\EmulatorPkg.dsc -t VS2017 那么是可以编译通过的。

经过比对,最终发现在 \EmulatorPkg\Win\Host\WinHost.inf 有对 VS2017 编译工具特别的处理。根据这个提示,在文件中加入针对 VS2019 的特别处理如下:

  MSFT:*_VS2019_X64_DLINK_FLAGS      = /LIBPATH:"%VCToolsInstallDir%lib\x64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:AMD64 /LTCG Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib

即可通过编译。

《UEFI Tips: EDK2 Stable202002》有17个想法

    1. 嗯,我用 VS2015 没问题。如果你用 VS2019 编译这个版本的 EmulatorPkg 是有问题的。你可以先试试 \EmulatorPkg\Win\VS2017\ 下面的 BuildVS.bat 编译出来的是 IA32 位的,然后你用 build -a X64 -p EmulatorPkg\EmulatorPkg.dsc -t VS2017 (虽然你装的2019 但是命令仍然可以使用),编译 X64 试试看。

          1. 我跟了下WinNtGopThreadWindowProc,发现不响应WM_KEYDOWN消息,但WM_PAINT,WM_LBUTTONDOWN这些消息都可以正常进来,只要一按键盘,消息队列就不再响应任何消息,很奇怪,这里应该跟UEFI部分没关系

          2. 挺奇怪的啊,建议换一套 code 还有换一个编译器看看?还有一个可能就是你的编译器和 sdk 不匹配?

  1. 如果你人在台灣, 是無法連上百度雲取得下載連結的, 可以透過公開的 proxy 或是 vpn 連上任何一國外(日本, 美國都可以), 然後再連到文章的百度雲連結就可以看到檔案了.

      1. 上述動作只為了取得連結, 接著同步到自己的百度雲, 再來就不需要了.
        下載檔案可以直接透過百度雲的同步軟體下載回來.

发表评论

电子邮件地址不会被公开。 必填项已用*标注