musl无法将libc.a链接到共享库

时间:2016-07-07 17:03:09

标签: linux gcc shared-libraries static-libraries musl

我有一个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

2 个答案:

答案 0 :(得分:1)

exit.lo将用汇编语言编写,这就是为什么你的CFLAGS =' - fPIC'没有你想要的效果。这是1.“musl”中的错误或2.故意的错误,并且它们不支持静态链接到.so的。

我认为这是无意的,并提出了反对'musl'的错误

如果您需要快速修复,也可以自己编辑asm。

最后,您可以将musl配置为不使用asm进行构建吗?

稍微偏离主题,但通用二进制文件的其他选项是:

  1. 只需在您支持的最旧版Linux上与glibc链接即可。
  2. 不要挣扎于对'musl'的依赖,而是直接使用Linux内核api。

答案 1 :(得分:0)

只要使用CFLAGS="-fPIC -Wa,-mrelax-relocations=no"(您的binutils版本必须为> = 2.27)重新编译musl。