GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kompilierung schlägt mit Verschiebung fehl R_X86_64_32 gegen `.rodata.str1.8' kann nicht verwendet werden, wenn ein gemeinsames Objekt erstellt wird

Tun Sie, was der Compiler Ihnen sagt, d. h. mit -fPIC neu kompilieren . Um zu erfahren, was dieses Flag bewirkt und warum Sie es in diesem Fall benötigen, lesen Sie die Optionen zur Codegenerierung des GCC-Handbuchs.

Kurz gesagt, der Begriff positionsunabhängiger Code (PIC) bezieht sich auf den generierten Maschinencode, der speicheradressenunabhängig ist, d. h. keine Annahmen darüber trifft, wo er in den RAM geladen wurde. Nur positionsunabhängiger Code soll in gemeinsam genutzte Objekte (SO) aufgenommen werden, da sie in der Lage sein sollten, ihre Position im RAM dynamisch zu ändern.

Schließlich können Sie darüber auf Wikipedia lesen auch.


In meinem Fall trat dieser Fehler auf, weil ein make Befehl erwartete, gemeinsam genutzte Bibliotheken abzurufen (*.so Dateien) aus einem entfernten Verzeichnis, das durch LDFLAGS gekennzeichnet ist Umgebungsvariable. Dort waren fälschlicherweise nur statische Bibliotheken verfügbar (*.la oder *.a Dateien).

Daher lag mein Problem nicht bei dem Programm, das ich kompilierte, sondern bei den entfernten Bibliotheken, die es abzurufen versuchte. Daher musste ich kein Flag hinzufügen (z. B. -fPIC ) zur Kompilierung, die durch den Verschiebungsfehler unterbrochen wurde. Vielmehr habe ich die Remote-Bibliothek neu kompiliert, damit die gemeinsam genutzten Objekte verfügbar waren.

Im Grunde war es ein getarnter Datei-nicht-gefunden-Fehler.

In meinem Fall musste ich einen falsch platzierten --disable-shared entfernen Schalten Sie die configure ein Aufruf für das erforderliche Programm, da gemeinsam genutzte und statische Bibliotheken beide standardmäßig erstellt wurden.

Mir ist aufgefallen, dass die meisten Programme beide Arten von Bibliotheken gleichzeitig erstellen, also ist meine wahrscheinlich ein Eckfall. Generell kann es sein, dass Sie je nach Voreinstellung lieber Shared Libraries aktivieren müssen.

Um Ihre spezielle Situation mit Kompilierungsschaltern und Standardwerten zu untersuchen, würde ich die Zusammenfassung vorlesen, die mit ./configure --help | less angezeigt wird , normalerweise im Abschnitt Optionale Funktionen. Ich habe oft festgestellt, dass diese Lektüre zuverlässiger ist als Installationsanleitungen, die nicht aktualisiert werden, während sich Abhängigkeitsprogramme weiterentwickeln.


Mit -no-pie behoben Option in der Linker-Phase:

g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...

Linux
  1. CentOS/RHEL:Mount-Befehl schlägt mit „mount:does not contains SELinux labels“ fehl

  2. Dynamische Shared Library-Kompilierung mit g++

  3. Linux-Fehler beim Laden gemeinsam genutzter Bibliotheken:Gemeinsam genutzte Objektdatei kann nicht geöffnet werden:Keine solche Datei oder dieses Verzeichnis

  4. dynamic_cast schlägt fehl, wenn es mit dlopen/dlsym verwendet wird

  5. Gemeinsam genutzten Posix-Speicher entfernen, wenn er nicht verwendet wird?

Erkennen Sie veraltete gemeinsam genutzte Bibliotheken im Speicher mit UChecker

So listen Sie gemeinsam genutzte Bibliotheken auf, die von ausführbaren Dateien in Linux verwendet werden

Bash-Anfängerserie Nr. 7:Entscheidungsfindung mit If Else- und Case-Anweisungen

Nohup für Python-Skript funktioniert nicht, wenn es im Hintergrund mit &ausgeführt wird

Kann über LAN ping/ssh, aber nicht mit Wi-Fi

Kann mprotect() verwendet werden, um die Berechtigungen von .rodata zu ändern?