2016-07-07 18 views
0

Ich habe eine C99 shared Bibliothek, die ich in einigen statisch statischen Bibliotheken (über --whole-archive) verknüpfen möchte. Hinweis: Alle statischen Bibliotheken sind mit -fPICmusl schlägt fehl, libc.a in shared library zu verknüpfen

gebaut Ich möchte auch eine universelle Linux-Binärdatei erstellen und habe daher beschlossen, musl zu verwenden. Wenn ich versuche, in der statischen libc.a von MUSL zu verbinden bekomme ich folgende Fehlermeldung: sieht

# Building shared library tgt/Linux-x86_64/mylib/lib/mylib.so 
/root/mylib/./tgt/Linux-x86_64/libmusl/bin/musl-gcc -Wl,-whole-archive -L./tgt/Linux-x86_64/libmusl/lib -L./tgt/Linux-x86_64/libz/lib -L./tgt/Linux-x86_64/libssl/lib -L./tgt/Linux-x86_64/libsasl/lib -L./tgt/Linux-x86_64/librdkafka/lib -L./tgt/Linux-x86_64/libcurl/lib -L./tgt/Linux-x86_64/libgjalloc/lib -L./tgt/Linux-x86_64/libavro/lib -L./tgt/Linux-x86_64/libunwind/lib -l:libc.a -l:libpthread.a -l:libz.a -l:libssl.a -l:libcrypto.a -l:libsasl2.a -l:libm.a -l:librt.a -l:libcrypt.a -l:libunwind-x86_64.a -l:librdkafka.a -l:libcurl.a -l:libgjalloc.a -l:libavro.a -Wl,-no-whole-archive -shared -fPIC -o tgt/Linux-x86_64/mylib/lib/mylib.so ./tgt/Linux-x86_64/mylib/obj/myfile.o ./tgt/Linux-x86_64/mylib/obj/myotherfile.o ./tgt/Linux-x86_64/mylib/obj/cJSON.o 
/usr/bin/ld: ./tgt/Linux-x86_64/libmusl/lib/libc.a(exit.lo): relocation R_X86_64_PC32 against undefined hidden symbol `__fini_array_start' can not be used when making a shared object 
/usr/bin/ld: final link failed: Bad value 
collect2: error: ld returned 1 exit status 
make: *** [tgt/Linux-x86_64/mylib/lib/mylib.so] Error 1 

Mein MUSL build wie:

cd mystatic_libs_build_dir/musl; \ 
./configure CFLAGS='-fPIC' \ 
--enable-shared \ 
--enable-static \ 
--prefix=/root/mylib/tgt/Linux-x86_64/libmusl; \ 
make; make install; 
# libmusl is available 

Antwort

1

exit.lo wird in Assembler geschrieben werden, warum Ihre CFLAGS ist = '- fPIC' hat nicht den beabsichtigten Effekt. Dies ist entweder 1. ein Fehler in "musl" oder 2. absichtlich und sie unterstützen keine statische Verknüpfung in .so's.

Ich würde davon ausgehen, dass es unbeabsichtigt ist und einen Fehler gegen ‚MUSL‘

Sie könnten auch die asm selbst bearbeiten Datei, wenn Sie schnell ein Update benötigen.

Endlich können Sie möglicherweise Musl konfigurieren, um ohne asm zu bauen?

etwas off topic, aber auch andere Optionen für eine Universal Binary sind:

  1. einfach gegen glibc Verknüpfung auf die älteste Version von Linux, die Sie unterstützen.
  2. Anstatt mit einer Abhängigkeit von 'Musl' zu kämpfen, einfach die Linux-Kernel-APIs direkt verwenden.