1

いくつかの静的ライブラリにリンクしたい C99 共有ライブラリがあります ( 経由--whole-archive)。:すべての静的ライブラリは-fPIC

また、ユニバーサル Linux バイナリをビルドしたいので、musl を使用することにしました。musl から静的にリンクしようとするとlibc.a、次のエラーが発生します。

# 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

私のmuslビルドは次のようになります:

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
4

2 に答える 2

1

exit.lo はアセンブラーで記述されるため、 CFLAGS='-fPIC' が意図した効果を発揮しません。これは、1. 'musl' のバグまたは 2. 意図的なものであり、.so への静的リンクをサポートしていません。

私はそれが意図的ではないと仮定し、「musl」に対してバグを報告します

すぐに修正が必要な場合は、自分で asm を編集することもできます。

最後に、musl を asm なしでビルドするように構成できるでしょうか?

トピックから少し外れますが、ユニバーサル バイナリのその他のオプションは次のとおりです。

  1. サポートしている最も古いバージョンの Linux で glibc にリンクするだけです。
  2. 「musl」への依存に苦労するのではなく、Linux カーネル API を直接使用するだけです。
于 2016-09-07T12:00:45.947 に答える