无法解决的`R_X86_64_NONE`搬迁

时间:2018-02-09 13:27:17

标签: c++ elf unresolved-external binutils

我在CentOS 7上使用Devtoolset-7并且已经构建了Boost 1.65.1。 但是当我链接我的应用程序时,我有以下内容:

/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt/rh/devtoolset-7/root/usr/lib64/libboost_unit_test_framework.a(compiler_log_formatter.o)(.text._ZN5boost9unit_test5utils11string_castINS0_13basic_cstringIKcEEEESsRKT_[_ZN5boost9unit_test5utils11string_castINS0_13basic_cstringIKcEEEESsRKT_]+0x3c): unresolvable R_X86_64_NONE relocation against symbol `_ZTVSt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4'
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status

搜索有关R_X86_64_NONE的更多信息并未给出任何有价值的结果:大多数similar questions没有任何答案或准确解释这是什么以及如何解决它。

所以我的问题是:

  • 这个错误究竟意味着什么?
  • 什么是R_X86_64_NONE以及为什么“没有重新定位”(根据bintils来源)ELF标题中是否存在符号类型?

附录

  • 链接单元测试可执行文件时出错,链接到我的静态库和Boosts的静态库(单元测试框架)
  • 所有静态库(Boost和我的一个)都使用-fPIC选项
  • 构建

PS。我真的希望这个问题能够一次又一次地解决(已经打过几次,但这次更新到最新的binutils并没有帮助)。 (将对此问题的任何活动开始赏金)

1 个答案:

答案 0 :(得分:7)

来自more

/usr/bin/strip

注意/opt/rh/devtoolset-7/root/usr/bin/strip,而不是strip。因此使用系统R_X86_64_REX_GOTPCRELX命令。 42对应于#include <iostream> void dot () { std::cout << '.'; } 重定位,它由DTS binutils生成为优化。

重现此方法的一种简单方法是使用此C ++文件:

-O2 -fpic

如果使用X86_64_REX_GOTPCRELX进行编译,则会为_ZNSt8ios_base4InitD1Ev生成/usr/bin/strip -g重定位。在其上运行R_X86_64_NONE会将其转换为eu-readelf -r。这可以使用strip验证。

您可以使用RPM告诉您使用

使用DTS %if 0%{?scl:1} %define __strip %{_bindir}/strip %endif
%undefine __brp_strip_static_archive
在RPM spec文件中

,或者您可以添加

class yourComponent extends React.Component {
constructor(){
//bind in the constructor
this.handleRefreshOrgs = this.handleRefreshOrgs.bind(this)
  }
}

跳过完全剥离静态库(这可能是正确的事情)。