Неразрешимое перемещение `R_X86_64_NONE`

я использую Devtoolset-7 на CentOS 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 не дает никаких ценных результатов: в основном похожие вопросы без какого-либо ответа или точного объяснения, что это такое и как его решить.

Итак, мои вопросы:

  • что на самом деле означает эта ошибка?
  • что такое R_X86_64_NONE и почему в заголовках ELF всегда существует тип символа «нечего перемещать» (согласно источникам bintils)?

добавление:

  • Произошла ошибка при связывании исполняемого файла модульных тестов, который связан с моей статической библиотекой и статическими библиотеками Boosts (инфраструктура модульных тестов)
  • Все статические библиотеки (Boost и моя одна) построены с -fPIC вариант

PS. Я действительно хочу, чтобы этот вопрос был решен раз и навсегда (уже ударил несколько раз, но на этот раз обновление до последней версии binutils не помогает). (начнется вознаграждение за любую деятельность по этому вопросу)

8

Решение

От Журнал сборки опубликован в багзилловской ошибке Red Hat:

[19:15:01]W:     [Step 8/12] + /usr/lib/rpm/check-buildroot
[19:15:01]W:     [Step 8/12] + /usr/lib/rpm/brp-scl-compress /opt/rh/devtoolset-7/root
[19:15:01]W:     [Step 8/12] + /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip
[19:16:40]W:     [Step 8/12] /usr/bin/strip: /work/build/BUILDROOT/devtoolset-7-boost-1.65.1-4.el7.centos.x86_64/opt/rh/devtoolset-7/root/usr/lib64/libboost_container.a(global_resource.o): invalid relocation type 42
[19:16:40]W:     [Step 8/12] /usr/bin/strip: BFD version 2.25.1-32.base.el7_4.2  assertion fail elf64-x86-64.c:341

Заметка /usr/bin/stripне /opt/rh/devtoolset-7/root/usr/bin/strip, Итак, система strip команда используется. 42 соответствует R_X86_64_REX_GOTPCRELX перемещение, которое генерируется DTS binutils в качестве оптимизации.

Простой способ воспроизвести это с помощью этого файла C ++:

#include <iostream>

void
dot ()
{
std::cout << '.';
}

Если скомпилировать с -O2 -fpic, он будет производить X86_64_REX_GOTPCRELX переезд для _ZNSt8ios_base4InitD1Ev, Бег /usr/bin/strip -g на что превратит это в R_X86_64_NONE, Это можно проверить с помощью eu-readelf -r,

Вы можете использовать RPM, чтобы сказать использовать DTS strip с помощью

%if 0%{?scl:1}
%define __strip %{_bindir}/strip
%endif

в файле спецификации RPM, или вы можете добавить

%undefine __brp_strip_static_archive

полностью пропустить удаление статической библиотеки (что в любом случае, вероятно, является правильным).

7

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector