web-dev-qa-db-fra.com

ld: option non reconnue '--Push-state - no-as-need'

Ma construction échoue avec le message d'erreur suivant de l'éditeur de liens:

FAILED: &&/usr/bin/g ++ -Wall -Wextra -Werror -g -fsanitize = undefined, adresse -Wno-Miller-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 -lgrpc ++ /opt/qt59/lib/libQt5Gui.so.5.1.1 /opt/qt59/lib/libQt5Core.so.5.9.1 &&:
/usr/bin/x86_64-linux-gnu-ld: option non reconnue '--Push-state - no-as-required' 

Vous pouvez voir le journal de construction complet ici . L'erreur est à la ligne 2211 et les versions sont imprimées aux lignes 2104ff.

Quel outil provoque l'erreur? 

  • Est-ce que gcc 7.3.0 utilise un indicateur d'éditeur de liens incorrect? La documentation ld indique que --Push-state et --no-as-needed sont des commandes distinctes.
  • ld 2.28 est-il trop ancien pour comprendre le drapeau de l'éditeur de liens? Le change log ne répertorie rien qui semble être lié.
  • La commande && /usr/bin/g++ a l'air bizarre, elle devrait être /usr/bin/g++. Utiliser make au lieu de ninja montre la même erreur de liaison.

Il repose correctement sur les tests Debian qui utilisent également gcc 7.3.0 et ld 2.30, mais il ne semble pas exister de binutils-2.30 ppa fonctionnel pour Ubuntu Trusty.

Comment construire avec succès mon projet sur Travis?

7
nwp

GCC 7 est corrigé avec 7.3.0-16ubuntu3 (testé sur Ubuntu 18.04). Cette version est disponible via le Ubuntu Toolchain Test PPA (pour 16.04.1 et 14.04).

Testé uniquement avec Make, mais il devrait également fonctionner avec Ninja. Sanitizer, ASan et UBsan, activés.

Il n'y a pas beaucoup de problèmes liés à ce problème dans le changelog quoique:

gcc-7 (7.3.0-16ubuntu3) bionique; urgence = moyenne

  • Mise à jour du fichier SVN 20180415 (r259389) à partir de la branche gcc-7 .
    • Correction PR libstdc ++/85222.
  • Supprimez notre propre backport PR libstdc ++/85222.

Mettre à jour:

GCC 7 (7.3.0-16ubuntu3) est toujours cassé sur Ubuntu 16.04 et versions antérieures.

Que pouvez-vous faire pour contourner ce problème:

A. Mise à jour vers Ubuntu 18.04

Le problème est résolu sur Ubuntu 18.04 (LTS) 'Gcc7.


B. Dockerize et mise à jour vers Ubuntu 18.04

Si une mise à jour n'est pas possible, par exemple. fonctionnant sur un système CI, il est toujours possible d’utiliser Docker et d’un Ubuntu à jour.


C. Désactiver le désinfectant UB

Le problème ne se produit que lorsque vous utilisez GCC7 avec UB Sanitizer activé. Comme tobias-brüll noté dans les commentaires: Tourner le UB Sanitizer désactivé empêche l'erreur.


D. Utilisez Gold Linker

Une autre solution de contournement publiée par makerj : L'utilisation de Gold Linker ne pose pas le problème.

Par exemple. sur CMake transmettez-le à travers le CMAKE_EXE_LINKER_FLAGS :

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

Si l'option D (de la réponse de ollo ) ne fonctionne pas, essayez les commandes suivantes:

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

C'est à partir de: https://github.com/Project-OSRM/osrm-backend/blob/master/scripts/travis/before_install.x86_64-asan.sh

Et le problème a été décrit ici: https://github.com/Project-OSRM/osrm-backend/issues/3216

0
pr3sto