edk2编译BaseTools出错relocation R_X86_64_32 against `.rodata.str1.1‘ can not be used when making a PIE

问题复现

在某台机器的路径/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的错误。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值