Ubuntu 18.04+GCC 7.3.0下链接BLAS库遇重定位错误求助
解决Ubuntu 18.04 + GCC 7.3.0下链接BLAS库的重定位错误问题
这个问题本质是Ubuntu 18.04开始GCC默认启用了PIE(位置无关可执行文件)编译模式,而你之前的编译流程没有适配这个变化导致的。
问题原因
PIE是一种系统安全特性,要求生成的可执行文件是位置无关的,以此降低恶意代码利用内存地址漏洞的风险。但你的benchmark.o和mine.o目标文件要么是在旧环境下编译的,要么编译时没添加位置无关参数,它们包含32位重定位信息,无法和PIE模式的链接流程兼容,所以触发了relocation R_X86_64_32 against '.bss' can not be used when making a PIE object的错误。
两种可行解决方案
方案一:重新编译源文件时添加位置无关参数
对所有源文件编译时加上-fPIC参数,生成支持PIE的目标文件:g++ -c -fPIC benchmark.cpp mine.cpp之后再用原来的链接命令(或者直接合并编译与链接步骤):
g++ -o output benchmark.o mine.o -lcblas方案二:链接时禁用PIE模式
如果不想修改编译步骤,可以直接在链接命令中添加-no-pie参数,强制关闭PIE要求:g++ -o output benchmark.o mine.o -lcblas -no-pie
额外建议
优先推荐方案一,因为PIE是现代Linux系统的默认安全配置,保持启用能提升程序的安全性。只有当依赖旧代码或无法修改的第三方库时,再考虑用方案二绕过PIE限制。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

