问题复现

在某台机器的路径/path/a下成功build某stable版本下的edk2 BaseTools工具链,清除相关环境变量(甚至清除/path/a下edk2目录)后在同一台机器的新路径/path/b下build相同版本的edk2 BaseTools时出现如下错误:

edk2$ make -C BaseTools
...
g++ -o ../bin/VfrCompile  AParser.o DLexerBase.o ATokenBuffer.o EfiVfrParser.o VfrLexer.o VfrSyntax.o VfrFormPkg.o VfrError.o V
frUtilityLib.o VfrCompiler.o -L../libs -lCommon
/usr/bin/ld: ../libs/libCommon.a(CommonLib.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PI
E object; recompile with -fPIE
/usr/bin/ld: ../libs/libCommon.a(EfiUtilityMsgs.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making
 a PIE object; recompile with -fPIE
/usr/bin/ld: ../libs/libCommon.a(ParseInf.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PIE
 object; recompile with -fPIE
collect2: error: ld returned 1 exit status
make[2]: *** [GNUmakefile:42: ../bin/VfrCompile] Error 1

错误提示在构建VfrCompile时生成的object文件无法用来生成PIE object(参考GCC中的pie和fpie选项),需要添加-fPIE选项。

解决方法

根据Makefile的内容可知,目前版本stable-202302的BaseTools编译选项在BaseTools/Source/C/Makefiles/header.makefile,可以根据自己机器的Compiler Family在BUILD_CFLAGS上添加该-fPIE选项。添加后即可成功编译这套工具链。

edk2$ make -C BaseTools
...
estValidUtf8File (CheckUnicodeSourceFiles.Tests) ... ok
testValidUtf8FileWithBom (CheckUnicodeSourceFiles.Tests) ... ok

----------------------------------------------------------------------
Ran 282 tests in 0.637s

OK

疑问

目前不太清楚为什么在确认环境变量干净的情况下,在同一台机器的不同目录下构建两套edk2工具链为什么会出现这个错误。

同时,在删除原有/path/a目录下的edk2文件后,在/path/b目录下clone 更新版本stable的edk2时没有发生如上错误。但是在保留/path/b工具链的情况下,在/path/c下clone相同版本的edk2时又发生了如上关于relocation的错误。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐