[LINUX] Si "ne peut pas être utilisé lors de la création d'un objet PIE" apparaît dans make

Lorsque j'ai créé un programme utilisateur à partir de Makefile pour le remplacer par Ubuntu 18.04 d'Amazon Lightsail, l'éditeur de liens s'est plaint.

phénomène

$ uname -a
Linux example 5.3.0-1023-aws #25~18.04.1-Ubuntu SMP Fri Jun 5 15:18:30 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ make
gcc -g -I../include -c foo.c
gcc -g -o foo foo.o bar.o -L ../lib -lwebsockets -lmysqlclient
/usr/bin/ld: bar.o: relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object。 -Recompilez avec fPIC.
/usr/bin/ld:Échec du dernier lien:Il n'y a pas de section correspondant à la sortie
collect2: error: ld returned 1 exit status
Makefile:14: recipe for target 'foo' failed
make: *** [foo] Error 1

Il semble qu'il a changé pour créer un lien en tant que ** PIE ** (Position Independent Executable) par défaut à partir de la version 6 de gcc. ** PIE ** est un fichier exécutable constitué uniquement de fichiers objet ** PIC ** (Position Independent Code). Donc, si vous avez du code qui n'est pas ** PIC **, le lien échouera.

Vérification

Jetons un coup d'œil à l'option de configuration lorsque gcc a été construit.

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 

Vous pouvez voir qu'il y a --enable-default-pie. Certes, ** PIE ** est activé par défaut. (** PIE ** est désactivé sur les architectures CPU qui ne fonctionnent pas)

D'un autre côté, la configuration de la machine utilisée pour le développement ne l'avait pas, et la version de gcc était assez ancienne en tant que série 5.

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)

Faire face

Vous n'êtes pas obligé de le mettre au format ** PIE **, alors ajoutez simplement -no-pie à LDFLAGS dans Makefile.

Recommended Posts

Si "ne peut pas être utilisé lors de la création d'un objet PIE" apparaît dans make
pd.tseries.offsets.DateOffset peut être assez lent s'il n'est pas utilisé avec prudence
Scripts pouvant être utilisés lors de l'utilisation de Bottle en Python
Peut être utilisé lorsque aws-cli est disponible mais que jq n'est pas disponible jp.py
Créez une Spinbox qui peut être affichée en binaire avec Tkinter
Un minuteur (ticker) qui peut être utilisé sur le terrain (peut être utilisé n'importe où)
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
[Python3] Code qui peut être utilisé lorsque vous souhaitez découper une image dans une taille spécifique
Si vous souhaitez créer une application Windows (exe) qui peut être utilisée maintenant en utilisant uniquement Python
Notes personnelles des opérations liées aux pandas qui peuvent être utilisées dans la pratique
Que faire si NotADirectoryError: [Errno 20] Pas un répertoire: 'xdg-settings' apparaît dans le notebook jupyter
Fonctions pouvant être utilisées dans l'instruction for
Lorsque l'objet sélectionné dans bpy.context.selected_objects n'est pas renvoyé
Algorithmes de base utilisables par les pros de la compétition
Pour pouvoir utiliser le japonais avec Python dans l'environnement Docker
Enregistrement d'image ANT qui peut être utilisé en 5 minutes
Peut être utilisé chez les pros de la compétition! Bibliothèque standard Python
Peut être utilisé avec AtCoder! Une collection de techniques pour dessiner du code court en Python!
[Python3] Code qui peut être utilisé lorsque vous souhaitez redimensionner des images dossier par dossier
[Python] Les arguments de longueur variable peuvent être utilisés lors de la décompression des éléments itérables
Goroutine (contrôle parallèle) utilisable sur le terrain
Goroutine utilisable sur le terrain (édition errgroup.Group)
Faisons un diagramme sur lequel on peut cliquer avec IPython
À propos du fait que le résumé de la torche peut être vraiment utilisé lors de la construction d'un modèle avec Pytorch
Note addictive: max (max (list)) ne doit pas être utilisé lors de la maximisation de la valeur d'un tableau à deux dimensions
Si vous êtes novice en programmation, pourquoi ne pas créer un "jeu" pour le moment? L'histoire