wake-up-neo.com

ld: nicht erkannte Option '--Push-state - nicht bei Bedarf'

Mein Build schlägt mit der folgenden Linker-Fehlermeldung fehl:

FAILED:: &&/usr/bin/g ++ -Wall -Wextra -Werror -g -fsanitize = undefined, Adresse -Wno-unused-parameter -fsanitize = undefined, Adresse -rdynamic * .o -o SCE -Wl, -rpath,/opt/qt59/lib /opt/qt59/lib/libQt5Widgets.so.5.9.1 /usr/local/lib/libprotobuf.a -lpthread -lutil -lutil-lgrpc ++ /opt/qt59/libQt5Gui.so.5.9.1 /opt/qt59/lib/libQt5Core.so.5.9.1 &&:
/usr/bin/x86_64-linux-gnu-ld: nicht erkannte Option '--Push-state - kein Bedarf' 

Sie können das vollständige Build-Protokoll hier sehen . Der Fehler befindet sich in Zeile 2211 und Versionen werden in Zeile 2104ff gedruckt.

Welches Tool verursacht den Fehler? 

  • Verwendet gcc 7.3.0 ein falsches Linker-Flag? Die ld Dokumentation zeigt an, dass --Push-state und --no-as-needed getrennte Befehle sind.
  • Ist ld 2.28 zu alt, um das Linkerflag zu verstehen? Das Änderungsprotokoll listet nichts auf, was verwandt scheint.
  • Der Befehl && /usr/bin/g++ sieht ungerade aus, er sollte /usr/bin/g++ sein. Die Verwendung von make anstelle von ninja zeigt den gleichen Verknüpfungsfehler.

Es baut auf Debian-Tests auf, die ebenfalls gcc 7.3.0 und ld 2.30 verwenden, aber es scheint keinen funktionierenden binutils-2.30 ppa für Ubuntu Trusty zu geben.

Wie baue ich mein Projekt erfolgreich auf Travis auf?

7
nwp

GCC 7 ist Fixed mit 7.3.0-16ubuntu3 (getestet an Ubuntu 18.04). Diese Version ist über den Ubuntu Toolchain Test PPA (für 16.04.1 und 14.04) verfügbar.

Nur mit Make getestet, aber es sollte auch mit Ninja funktionieren. Sowohl Sanitizer als auch ASan und UBsan wurden aktiviert.

Im changelog gibt es nicht viel mit diesem Problem zu tun:

gcc-7 (7.3.0-16ubuntu3) bionisch; Dringlichkeit = mittel

  • Update auf SVN 20180415 (r259389) vom gcc-7-Zweig .
    • Fixieren Sie PR libstdc ++/85222.
  • Entfernen Sie unseren eigenen PR libstdc ++/85222-Backport.

Aktualisieren:

GCC 7 (7.3.0-16ubuntu3) ist immer noch defekt auf Ubuntu 16.04 und früheren.

Was können Sie tun, um dies zu umgehen:

A. Update auf Ubuntu 18.04

Das Problem wurde in Ubuntu 18.04 (LTS) Gcc7 behoben.


B. Dockerize und Update auf Ubuntu 18.04

Ist ein Update nicht möglich, z. Auf einem CI-System ausgeführt, ist es immer noch eine Option, Docker und ein aktuelles Ubuntu zu verwenden.


C. Deaktivieren Sie das UB-Desinfektionsmittel

Das Problem tritt nur bei der Verwendung von GCC7 mit aktiviertem UB-Sanitizer auf. Wie tobias-brüll in den Kommentaren vermerkt: Drehen der UB Sanitizer aus verhindert den Fehler.


D. Verwenden Sie Gold Linker

Eine andere Problemumgehung, die von makerj veröffentlicht wurde: Die Verwendung von Gold Linker verursacht das Problem nicht.

Z.B. über CMake durch den CMAKE_EXE_LINKER_FLAGS :

cmake -DCMAKE_EXE_LINKER_FLAGS=-Fuse-ld=gold ..
5
ollo

Wenn die Option D (von ollo ) nicht funktioniert, versuchen Sie die nächsten Befehle:

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

Dies ist aus: https://github.com/Project-OSRM/osrm-backend/blob/master/scripts/travis/before_install.x86_64-asan.sh

Die Ausgabe wurde hier beschrieben: https://github.com/Project-OSRM/osrm-backend/issues/3216

0
pr3sto