先附上报错内容:
……
stable202005/MdePkg/Include/X64 /home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.c
"gcc" -MMD -MF /home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/DisablePaging64.obj.deps \
-E -x assembler-with-cpp -include AutoGen.h \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/BaseLib/X64 \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/BaseLib \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/DEBUG \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Include \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Test/UnitTest/Include \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Include/X64 \
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/BaseLib/X64/DisablePaging64.nasm > \
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/DisablePaging64.ii
Trim --trim-long --source-code \
-o /home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/DisablePaging64.iii \
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/DisablePaging64.ii
"nasm" -I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/BaseLib/X64/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/BaseLib/X64/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/BaseLib/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/DEBUG/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Include/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Test/UnitTest/Include/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Include/X64/ \
-f elf64 \
-o /home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/DisablePaging64.obj \
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/DisablePaging64.iii
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/\
DisablePaging64.iii:54: warning: label alone on a line without a colon might be in error [-w+orphan-labels]
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/\
DisablePaging64.iii:35: error: symbol `InternalX86DisablePaging64.0' undefined
GNUmakefile:771: recipe for target '/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/DisablePaging64.obj' failed
make: *** [/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/DisablePaging64.obj] Error 1
build.py...
: error 7000: Failed to execute command
make tbuild [/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib]
build.py...
: error F002: Failed to build module
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/BaseLib/BaseLib.inf [X64, GCC5, DEBUG]
- Failed -
……
(这UEFI编译打印就长的离谱,上述代码片并非原始输出,为阅读方便本人加了换行。)
- 省流助手: 将nasm升级到2.15.*以上
wget http://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2
tar xfj nasm-2.15.05.tar.bz2
cd nasm-2.15.05/
./autogen.sh
./configure --prefix=/usr/local/
make
sudo make install
原始链接:devel@edk2.groups.io | Build failure
想解决问题的人,看到这里就可以了,下面是我的废话部分问题解决流程。
问题起因
在Ubuntu 18.04虚拟机中搭建UEFI编译环境的时候,按照流程安装完软件,配置环境变量一切都很顺利。但在编译示例build -a X64 -t GCC5 -p OvmfPkg/OvmfPkgX64.dsc
的时候,出现了报错,如开头所示。
复现
手动运行前面的命令,包括gcc和Trim都没有出现问题,而nasm部分出现了和原来同样的错误:
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/\
DisablePaging64.iii:54: warning: label alone on a line without a colon might be in error [-w+orphan-labels]
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/\
DisablePaging64.iii:35: error: symbol `InternalX86DisablePaging64.0' undefined
warning暂且不论,DisablePaging64.iii的第35行报了未定义的错误。
32 global ASM_PFX(InternalX86DisablePaging64)
33 ASM_PFX(InternalX86DisablePaging64):
34 cli
35 lea rsi, [.0] ; rsi <- The start address of transition code
36 mov edi, [rsp + 0x28] ; rdi <- New stack
……
56 ; Start of transition code
57 .0:
58 mov esp, eax ; set up new stack
59 mov rax, cr0
……
而事实上,通过grep
命令查找,这个函数好好的被声明在tianocore/edk2/MdePkg/Library/BaseLib/BaseLibInternals.h
中,且在编译中,这个路径也被好好的包含在内,为什么会出现未定义的问题呢?
ASM_PFX函数定义
由于从nasm
文件编译到iii
文件的过程中,这部分的ASM_PFX伪指令被去除,所以最开始以为是InternalX86DisablePaging64这个函数的问题。但是无论是删除nasm
文件的ASM_PFX还是给iii
文件添加ASM_PSF都无法通过编译。故 排除汇编语法的问题
(说来也是,谁给我的勇气怀疑这么老牌的开源代码的语法问题)
软件版本
Github上面对搭建环境的描述Using EDK II with Native GCC中,对GCC版本的描述为GCC4.x,而Ubuntu默认的GCC为7.5.0,可选安装gcc-5。另外,对于Python的版本,也有
“install Python 3.7 or later (https://www.python.org/) to run python tool from source
Python 2.7.10 or later can still be used with PYTHON_HOME"
的描述。更换版本之后问题依旧。
我也尝试过stuart的编译方法,同样按照Github上的方式安装虚拟环境,但是折在了stuart_setup -c .pytool/CISettings.py
这一步。故 排除软件版本的问题
“.0”——死磕nasm
回到报错输出,注意到行数35以及报错函数InternalX86DisablePaging64.0
,这一步lea
是加载有效地址,[.0]
会返回标号为.0部分的相对地址偏移,所以或许这部分的问题出在了标号的名称上面:由于标号以“.”起始,nasm在编译的过程中将其认作InternalX86DisablePaging64
的子函数进而未在.h文件中找到预声明。(好合理)
按照这个思路我将.0
改为了一个纯字母标号,编译后成功通过……了这一部分。
新的错误
过了DisablePaging64.obj的编译之后,新的错误诞生了
"nasm" -I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/BaseLib/X64/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/BaseLib/X64/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/BaseLib/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/DEBUG/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Include/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Test/UnitTest/Include/ \
-I/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Include/X64/ \
-f elf64 -o /home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/\
LongJump.obj \
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/\
LongJump.iii
Building ... /home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf [X64]
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/\
LongJump.iii:44: error: parser: instruction expected
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/\
LongJump.iii:49: error: parser: instruction expected
make: *** [GNUmakefile:798: /home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/X64/LongJump.obj] Error 1
build.py...
: error 7000: Failed to execute command
make tbuild [/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/Build/OvmfX64/DEBUG_GCC5/X64/MdePkg/Library/BaseLib/BaseLib]
build.py...
: error F002: Failed to build module
/home/ubuntu/work/UEFIWorkspace/edk2-edk2-stable202005/MdePkg/Library/BaseLib/BaseLib.inf [X64, GCC5, DEBUG]
- Failed -
新的问题指向了LongJump中的44行和49行:
41 push rdx ; save rdx
42
43 mov rdx, [rcx + 0xF8] ; rdx = target SSP
44 rdsspq rax
45 sub rdx, rax ; rdx = delta
46 mov rax, rdx ; rax = delta
47
48 shr rax, 3 ; rax = delta/sizeof(UINT64)
49 incsspq rax
50
51 pop rdx ; restore rdx
这两行的语句很难让人找到语法的问题 (又开始了又开始了) ,因此还是回到传统的信息检索方法上。
前人栽树
信息检索很成功,有了这个问题,我终于在互联网上面找到了类似的问题。在一个issue中,有人提到了LongJump的问题,如是回复:
Unfortunately, there was a change in the EDK2 minimum NASM level to 2.15.05 and so you will have to move up to that level if you want to build the latest OVMF binary (see https://edk2.groups.io/g/devel/topic/89637409#87359).
于是,最终答案出现。
最终的解决方法
手动编译安装nasm 2.15.*
wget http://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2
tar xfj nasm-2.15.05.tar.bz2
cd nasm-2.15.05/
./autogen.sh
./configure --prefix=/usr/local/
make
sudo make install
安装后,可以通过nasm -v
命令来验证版本是否更新。
再次编译UEFI,即可顺利完成编译。高版本nasm未作测试,欢迎在评论区补充~
结语
在中文互联网上面完全没找到有这个问题的解法,官方Github上的也没有人提过类似的issue,解决的过程姑且算是曲折,继而为帮助道友少走弯路,撰经验记录帖于此,望能有所裨益。
另,鄙人的虚拟机是18.04版本,这个版本apt安装的nasm版本默认就是2.13.*,所以会遇到这个问题;不排除其他高版本Ubuntu默认安装高版本的nasm而没有这个问题,没测试不敢妄下定论,欢迎评论区补充交流。