edk2编译BaseTools出错relocation R_X86_64_32 against `.rodata.str1.1‘ can not be used when making a PIE
/usr/bin/ld: ../libs/libCommon.a(CommonLib.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PIE object; recompile with -fPIE
问题复现
在某台机器的路径/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的错误。
- update:可能的出错原因 Ref Link
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)