64 Bit und -fPIC
-
Hallo
Ich versuche mir eine statisch verlinkte Library (gcc -static ...) zu basteln und bekomme eine Fehlermeldung, "recompile with -fPIC".
gnu/4.5.2/crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/crtbeginT.o: could not read symbols: Bad value collect2: ld returned 1 exit status
Mir ist halbwegs klar, was ich zu tun habe - die Library ausfindig machen die ohne -fPIC kompiliert wurde und sie neu erstellen. Nur dummerweise ist meine Lib von etwa 20 anderen Libs abhaengig, und alle stammen von anderen Projekten. Wie finde ich also die Library, welche das Problem verursacht? Kann ich irgendwie gcc fragen?
[Edit: dieses crtbeginT.o kommt nicht von mir und ich habe auch keine Ahnung welche Lib das braucht]
-
crtbeginT.o gehört zu gcc. Wie sieht denn das komplette Kommando aus?
evtl. reicht ja auch ein --static-libgcc bzw. --static-libstdc++ statt -static.
-
Nicht erschecken, die Kommandos werden automatisch erzeugt. -static-libgcc/libstd++ hat leider keinen Unterschied gemacht.
// hier ist das Kommando... gcc codec_jni.o ffmpeg_jni.o format_jni.o protocol_jni.o swscale_jni.o -L/home/besigg/workspace/ffmpeg-0.6 -L/home/besigg/workspace/ffmpeg-0.6/libswscale -L/home/besigg/workspace/ffmpeg-0.6/libavcodec -L/home/besigg/workspace/ffmpeg-0.6/libavformat -L/home/besigg/workspace/ffmpeg-0.6/libavutil -L/home/besigg/workspace/codec/native/common -L/home/besigg/workspace/codec/native/ffmpeg -L/usr/lib/jvm/java-6-sun-1.6.0.24/include -L/usr/lib/jvm/java-6-sun-1.6.0.24/include/linux -lswscale -lavformat -lavcodec -lavutil -static -shared -Wl -fPIC,-soname,libvdproject_codec_ffmpeg.so -o /home/besigg/workspace/codec/dist/linux-amd64/libvdproject_codec_ffmpeg.so // ... und das ist was rauskommt /usr/bin/ld: /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4Exception in thread "main" .5.2java.lang.IllegalStateException: cannot execute command gcc codec_jni.o ffmpeg_jni.o format_jni.o protocol_jni.o swscale_jni.o -L/home/besigg/workspace/ffmpeg-0.6 -L/home/besigg/workspace/ffmpeg-0.6/libswscale -L/home/besigg/workspace/ffmpeg-0.6/libavcodec -L/home/besigg/workspace/ffmpeg-0.6/libavformat -L/home/besigg/workspace/ffmpeg-0.6/libavutil -L/home/besigg/workspace/codec/native/common -L/home/besigg/workspace/codec/native/ffmpeg -L/usr/lib/jvm/java-6-sun-1.6.0.24/include -L/usr/lib/jvm/java-6-sun-1.6.0.24/include/linux -lswscale -lavformat -lavcodec -lavutil -static -shared -Wl -fPIC,-soname,libvdproject_codec_ffmpeg.so -o /home/besigg/workspace/codec/dist/linux-amd64/libvdproject_codec_ffmpeg.so at org.vdproject.build.NativeLib.execute(NativeLib.java:185) at org.vdproject.build.NativeLib.link(NativeLib.java:345) at org.vdproject.build.NativeLib.gcc(NativeLib.java:261) at org.vdproject.build.NativeLib.create(NativeLib.java:133) at org.vdproject.build.NativeLibGenerator.compileFFmpegCodec(NativeLibGenerator.java:335) at org.vdproject.build.NativeLibGenerator.main(NativeLibGenerator.java:59) /crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/crtbeginT.o: could not read symbols: Bad value collect2: ld returned 1 exit status
-
-static und -shared zusammen scheint nicht besonders sinnvoll zu sein. Vielleicht hilft dir ja das hier.
-
Danke, der Link hilft sogar sehr. Es funktioniert jetzt.
IMHO -static und -shared widersprechen sich nicht unbedingt. In einem weiteren Schritt werden dann alle Libraries zusammenkopiert und in ein Archiv verpackt. Dank dem -static sollte das dann auf verschiedenen Platformen ohne Probleme laufen (nicht allen, aber das ist fuer diesen speziellen Fall egal). Und mit dem -shared kann ich die Library doch ueber JNI ansprechen.