webentwicklung-frage-antwort-db.com.de

Umzug R_X86_64_32S gegen '.rodata' ... Beim Kompilieren auf einer 64-Bit-Plattform

Ich habe also etwas auf 32-Bit programmiert und gestern musste ich eine DLL erstellen, und ich hatte ein paar Probleme damit. Ich habe sie trotzdem gelöst hier .

Leider auch wenn ich dachte, dass alles nach allem funktionierte, fand ich das nicht so, als ich mein Programm und das Makefile auf einen anderen Computer verlegte, was auf 64bit läuft, da Sie wissen, was passiert ist ...

Mein Problem hängt also mit dem Umzug wegen 64bit zusammen

/usr/bin/ld: MyClass.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
MyClass.o: could not read symbols: Bad value

und hier ist mein makefile

MyProgram: main.o chkopts
    -${CLINKER} -o [email protected] $< ${MYLIB} ${PETSC_MAT_LIB}
    ${RM} main.o

    export LD_LIBRARY_PATH=${LIBADD}:$LD_LIBRARY_PATH

LibMyProgram.so: MyClass.o  chkopts
    -${CLINKER}  -shared -Wl,-soname,${SONAME} -o ${VERS}   *.o  ${PETSC_MAT_LIB}

    mv ${VERS} ${LIBADD}
    ln -sf ${LIBADD}${VERS} ${LIBADD}${SOWOV}
    ln -sf ${LIBADD}${VERS} ${LIBADD}${SONAME}

Ich habe versucht, -fPIC in CFLAGS, CPPFLAGS und sogar LDFLAGS hinzuzufügen. Ich habe auch versucht, -fPIC vor und nach -shared zu setzen.

-${CLINKER} -shared -fPIC -Wl,-soname,${SONAME} -o ${VERS}   *.o  ${PETSC_MAT_LIB}

Ich bekomme aber nur den gleichen Fehler wie zuvor.

Wenn ich CFLAGS = -fPIC verwende, erhalte ich eine ähnliche Fehlermeldung:

.../petsc/petsc-3.2-p6/Arch-linux2-cxx-debug/lib/libpetsc.a(err.o): relocation R_X86_64_32 against `ompi_mpi_comm_self' can not be used when making a shared object; recompile with -fPIC.

Ich habe über alle Themen gelesen, die mit meinem Problem sogar sehr ähnlich sind, aber ich konnte das nicht herausfinden.

25
Mare

Die Lösung bestand darin, alles mit -fPIC zu kompilieren und gemeinsame Objekte mit -shared zu verknüpfen.

Fügen Sie -fPIC zu CFLAGS oder CXXFLAGS für make-basierte Projekte hinzu.

4
Mare

Das gleiche Problem ist aufgetreten, als ich versuche, eine gemeinsam genutzte Bibliothek zu erstellen, die eine statische Bibliothek verknüpfen muss. 

Ich habe das Problem durch Hinzufügen von -fPIC zu CXXFLAGS gelöst, um .o-Dateien zu kompilieren, die in der statischen Bibliothek archiviert werden.

9
user2391685

Beim Versuch, xmlrpc-c-1.06.41 in CentOS 6.5 zu kompilieren, bin ich auf dasselbe Verbindungsproblem gestoßen, das durch Folgendes gelöst wurde: In ./src/cpp habe ich Makefile: Zeile 142 in geändert

CXXFLAGS = $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD) -shared -fPIC

Weitere Informationen zu den Flaggen finden Sie hier link

4
Saeed

Ich treffe auch dieses Problem ... Wenn ich versuche, @Mare und @ user2391685 zu verwenden, kann es gut funktionieren:

Verwenden Sie -fPIC, wenn Sie sich in .o-Datei befinden: Beispiel:

gcc -Wall -fPIC -c hello.c -I./ -I/usr/lib/jvm/Java/include/ -I/usr/lib/jvm/Java/include/linux/

Dann können Sie eine .so-Datei erstellen:

gcc -Wall -rdynamic -shared -o libhello.so hello.o Main.h -I/usr/lib/jvm/Java/include/ -I/usr/lib/jvm/Java/include/linux/
1
Strong

Wenn dieses Problem nach dem Hinzufügen von "-fPIC" weiterhin besteht, versuchen Sie, alle .o-Dateien zu säubern, und führen Sie den Vorgang erneut aus

1
Xin