relocation R_X86_64_32 against, Shared Libs
-
Nabend,
ich habe ein kleines Tutorial zu Libs unter Linux gelesen: http://www.tutorials.de/forum/linux-tutorials/243221-libs-unter-linux.html
Doch leider kommt es bei der Erstellung von Shared Libs zu ein paar Problemen:
Wenn ich die Shared Lib erstellen will mit:$ gcc -shared -o libtest.so hallo.o knut.o
so bekomme ich diese Fehlermeldung:
/usr/bin/ld: hallo.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
hallo.o: could not read symbols: Bad value
collect2: ld gab 1 als Ende-Status zurückIn hallo.c steht:
#include <stdio.h> void halloWelt() { printf("Hallo Welt!\n"); }
Und in knut.c steht:
#include <stdio.h> void knut() { printf("Knut schmeckt gut!\n"); }
Ich habe bereits gesucht, aber bin größtenteils nur auf Bugreports gestoßen, die zu anderen Programmen gehören, wie z.B. MySQL.
$ gcc -v
gibt folgendes aus:
Es werden eingebaute Spezifikationen verwendet.
Ziel: x86_64-unknown-linux-gnu
Konfiguriert mit: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++,treelang --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic
Thread-Modell: posix
gcc-Version 4.3.3 (GCC)Ich dachte ja daran, dass eventuell eine 32bit-gcc Version auf meinem Rechner gelandet ist, aber diese Ausgabe sagt etwas anderes....
Bei mir läuft ein Archlinux 64 bit System auf einer AMD64-CPU.
Wie kann ich das fixen?
Danke,
Gruß
Squall
-
du musst die dateien mit der option -fPIC des gcc compilieren. steht eh in der fehlermeldung.
code für shared libraries und auch zum teil für position independent executables (ein sicherheitsfeature) verwenden position independent code (pic). dh, die adresse im adressraum des prozesses wird erst zur laufzeit bestimmt und nicht schon zur zeit der compilierierung bzw. des linkens.
-
Nabend besserwisser. Das hatte ich schon ausprobiert, allerdings dachte ich, ich müsse -fPIC auf die Kompilierungsanweisung für die Shared-Lib nehmen.
Nun ja, es funktioniert nun, danke.