UEFI 编译时 DisablePaging64.obj 模块编译失败报错问题 解决办法

文章描述了一位用户在Ubuntu18.04虚拟机中编译UEFI时遇到的错误,该错误涉及到nasm编译器的一个警告和一个错误。用户通过分析发现是nasm版本过低导致的问题。升级nasm到2.15.*及以上版本后,解决了函数未定义的错误,但随后又遇到了新的错误。最终,通过升级nasm至最新版本成功编译UEFI。
摘要由CSDN通过智能技术生成

先附上报错内容:

……
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而没有这个问题,没测试不敢妄下定论,欢迎评论区补充交流。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值