解决 relocation R_X86_64_PC32 against undefined symbol `__ehdr_start‘ can not be used when making...

问题背景

在Debian编译LLVM时,出现如下错误:

relocation R_X86_64_PC32 against undefined symbol `__ehdr_start’ can not be used when making a shared object; recompile with -fPIC

该问题指出在链接生成动态库时,有的 .o 文件没有添加 -fPIC 编译。

该问题比较奇怪,因为使用的时同一套构建指令,只有在 Debian出现问题。
然后打印出详细的构建日志,也发现所有的 .o 文件在编译期间都添加了 -fPIC 。

感觉可能是系统的问题。

查找原因

经过搜索,发现是系统的 ld 链接器存在bug
验证步骤:

  1. 查看系统的链接器版本
    可以看到和文章中提到的版本一致。
# ld -v
GNU ld (GNU Binutils for Debian) 2.31.1
  1. 准备如下文件
$ cat test.cpp
extern char __ehdr_start;
int main() {
  char x = __ehdr_start;
}
  1. 使用默认链接器
    报错如下:
# g++ -shared -fPIC -o test test.cpp 
/usr/bin/ld: /tmp/ccWvJyV9.o: relocation R_X86_64_PC32 against undefined symbol `__ehdr_start' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status
  1. 使用 gold 链接器
    可以正常执行完成
# g++ -fuse-ld=gold -shared -fPIC -o test test.cpp
# echo $?
0

至此,可以验证此系统此版本的链接器存在bug。

解决方案

  1. 更换 gold 或 lld 等其他链接器
  2. 升级 ld

参考:

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lylhw13_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值