[LINUX] Wenn "kann beim Erstellen eines PIE-Objekts nicht verwendet werden" in make angezeigt wird

Als ich ein Benutzerprogramm aus Makefile erstellte, um es durch Ubuntu 18.04 von Amazon Lightsail zu ersetzen, beschwerte sich der Linker.

Phänomen

$ 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。 -Mit fPIC neu kompilieren.
/usr/bin/ld:Letzter Link fehlgeschlagen:Es gibt keinen Abschnitt, der der Ausgabe entspricht
collect2: error: ld returned 1 exit status
Makefile:14: recipe for target 'foo' failed
make: *** [foo] Error 1

Als ich es nachgeschlagen habe, scheint es, dass es ab Version 6 von gcc standardmäßig in ** PIE ** (Position Independent Executable) geändert wurde. ** PIE ** ist eine ausführbare Datei, die nur aus ** PIC ** -Objektdateien (Position Independent Code) besteht. Wenn Sie also Code haben, der nicht ** PIC ** ist, schlägt die Verknüpfung fehl.

Bestätigung

Werfen wir einen Blick auf die Konfigurationsoption, als gcc erstellt wurde.

$ 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) 

Sie können sehen, dass es "--enable-default-pie" gibt. Natürlich ist ** PIE ** standardmäßig aktiviert. (** PIE ** ist auf CPU-Architekturen, die nicht funktionieren, deaktiviert.)

Auf der anderen Seite war die Konfiguration der für die Entwicklung verwendeten Maschine nicht vorhanden, und die Version von gcc war als 5er-Serie ziemlich alt.

$ 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)

Bewältigung

Sie müssen es nicht im ** PIE ** -Format ablegen, also fügen Sie einfach -no-pie zu LDFLAGS im Makefile hinzu.

Recommended Posts

Wenn "kann beim Erstellen eines PIE-Objekts nicht verwendet werden" in make angezeigt wird
pd.tseries.offsets.DateOffset kann sehr langsam sein, wenn es nicht mit Vorsicht verwendet wird
Skripte, die bei der Verwendung von Bottle in Python verwendet werden können
Kann verwendet werden, wenn aws-cli verfügbar ist, jq jedoch nicht verfügbar ist. Jp.py.
Erstellen Sie eine Spinbox, die mit Tkinter in Binär angezeigt werden kann
Ein Timer (Ticker), der im Feld verwendet werden kann (kann überall verwendet werden)
Erstellen Sie eine Spinbox, die mit Tkinter in HEX angezeigt werden kann
[Python3] Code, der verwendet werden kann, wenn Sie ein Bild in einer bestimmten Größe ausschneiden möchten
Wenn Sie eine Windows-App (exe) erstellen möchten, die jetzt nur mit Python verwendet werden kann
Persönliche Notizen zu Pandas-bezogenen Vorgängen, die in der Praxis verwendet werden können
Was tun, wenn NotADirectoryError: [Errno 20] Kein Verzeichnis: 'xdg-settings' wird im Jupyter-Notizbuch angezeigt
Funktionen, die in der for-Anweisung verwendet werden können
Wenn das ausgewählte Objekt in bpy.context.selected_objects nicht zurückgegeben wird
Grundlegende Algorithmen, die bei Wettkampfprofis eingesetzt werden können
Um Japanisch mit Python in der Docker-Umgebung verwenden zu können
ANTs Bildregistrierung, die in 5 Minuten verwendet werden kann
Kann bei Wettkampfprofis eingesetzt werden! Python-Standardbibliothek
Kann mit AtCoder verwendet werden! Eine Sammlung von Techniken zum Zeichnen von Kurzcode in Python!
[Python3] Code, der verwendet werden kann, wenn Sie die Größe von Bildern Ordner für Ordner ändern möchten
[Python] Argumente mit variabler Länge können beim Entpacken iterierbarer Elemente verwendet werden
Goroutine (parallele Steuerung), die im Feld eingesetzt werden kann
Goroutine, die im Feld verwendet werden kann (errgroup.Group Edition)
Lassen Sie uns ein Diagramm erstellen, auf das mit IPython geklickt werden kann
Über die Sache, dass Fackelzusammenfassung wirklich verwendet werden kann, wenn ein Modell mit Pytorch erstellt wird
Suchthinweis: max (max (Liste)) darf nicht verwendet werden, wenn der Wert eines zweidimensionalen Arrays maximiert wird
Wenn Sie neu in der Programmierung sind, warum machen Sie nicht vorerst ein "Spiel"? Die Geschichte