ld: нераспознанная опция '--push-state - без необходимости "

Моя сборка завершается ошибкой со следующим сообщением об ошибке компоновщика:

  

FAILED: & & /usr /bin /g ++ -Wall -Wextra -Werror -g -fsanitize = undefined, адрес -Wno-неиспользуемый параметр -fsanitize = undefined, адрес -rdynamic * .o -o SCE -Wl, -rpath, /opt /qt59 /lib /opt/qt59/lib/libQt5Widgets.so.5.9.1 /usr/local/lib/libprotobuf.a -lpthread -lutil -lgrpc ++ /opt/qt59/lib/libQt5Gui.so.5.9.1 /opt /qt59 /lib/libQt5Core.so.5.9.1 & & :
  /usr /bin /x86_64-linux-gnu-ld: нераспознанная опция «--push-state - без необходимости»

Вы можете посмотреть полный журнал сборки здесь . Ошибка в строке 2211, а версии напечатаны в строках 2104ff.

Какой инструмент вызывает ошибку?

  • Использует ли gcc 7.3.0 неправильный флаг компоновщика? ld документация указывает, что --push-state и --no-as-needed - это отдельные команды.
  • ld 2.28 слишком стар, чтобы понимать флаг компоновщика? журнал изменений не содержит ничего похожего.
  • Команда && /usr/bin/g++ выглядит странно, она должна быть /usr/bin/g++. Использование make вместо ninja показывает то же самое ошибка связи.

Он правильно построен на тестировании Debian, которое также использует gcc 7.3.0 и ld 2.30, но, похоже, нет работающего binutils-2.30 ppa для Ubuntu Trusty.

Как мне успешно построить свой проект на Travis?

7 голосов | спросил nwp 25 PMpWed, 25 Apr 2018 17:22:49 +030022Wednesday 2018, 17:22:49

2 ответа


0

GCC 7 исправлен с помощью 7.3.0-16ubuntu3 (протестировано в Ubuntu 18.04 ). Эта версия доступна через PPA-тест Ubuntu Toolchain (для 16.04 .1 и 14.04).

Протестировано только с Make, но оно должно работать и с Ninja. Включены оба Sanitizer, ASan и UBsan.

В журнале изменений мало что связано с этой проблемой хотя:

  

gcc-7 (7.3.0-16ubuntu3) бионический; Актуальность = средняя

     
  • Обновление до SVN 20180415 (r259389) из gcc-7-branch.      
    • Исправьте PR libstdc ++ /85222.
    •   
  •   
  • Удалите наш собственный PR-каталог libstdc ++ /85222.
  •   

Обновление:

GCC 7 ( 7.3.0-16ubuntu3 ) все еще не работает в Ubuntu 16.04 и ранее .

Что можно сделать, чтобы обойти это:

A. Обновление до Ubuntu 18.04

Проблема устранена в Gcc7 Ubuntu 18.04 (LTS) .


В. Dockerize и обновление до Ubuntu 18.04

Если обновление невозможно, например, Работая в системе CI, все еще можно использовать Docker и современную Ubuntu.


С. Отключить UB Sanitizer

Проблема возникает только при использовании GCC7 с включенным UB Sanitizer. Как tobias-brüll отметил в комментариях: Отключение UB Sanitizer предотвращает ошибку.


D. Используйте Gold Linker

Другой обходной путь, опубликованный makerj : использование Gold Linker не вызывает проблемы.

Eg. CMake передайте его через CMAKE_EXE_LINKER_FLAGS :

cmake -DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=gold ..
ответил ollo 15 Maypm18 2018, 22:32:18
0

Если опция D (из ответа ollo ) не работает, попробуйте выполнить следующие команды:

sudo add-apt-repository ppa:jonathonf/binutils --yes
sudo apt-get update -qq --yes
sudo apt-get install -qq --yes --force-yes binutils

Это от: https://github.com/Project-OSRM/osrm-backend/blob/master/scripts/travis/before_install.x86_64-asan.sh

И проблема была раскрыта здесь: https://github.com/Проект-OSRM /OSRM-бэкенд /вопросы /3216

ответил pr3sto 29 SatEurope/Moscow2018-12-29T15:59:59+03:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2018 15:59:59 +0300 2018, 15:59:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132