musl 无法 link libc.a 进入共享库
musl fails to link libc.a into shared library
我有一个 C99 共享库,我想 link 在几个静态库中(通过 --whole-archive
)。 注意:所有静态库都是用-fPIC
构建的
我也想构建一个通用的 linux 二进制文件,因此决定使用 musl。当我尝试从 musl 在静态 libc.a
中 link 时,出现以下错误:
# 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
exit.lo 将用汇编程序编写,这就是为什么您的 CFLAGS='-fPIC' 没有达到您想要的效果。这要么是 1. 'musl' 中的错误,要么是 2. 故意的,它们不支持静态链接到 .so's.
我会认为这是无意的,并针对 'musl'
提交错误
如果您需要快速修复,您也可以自己编辑 asm。
您终于可以将 musl 配置为不使用 asm 进行构建了吗?
稍微偏离主题,但通用二进制文件的其他选项是:
- 只需在您支持的 Linux 最旧版本上链接 glibc。
- 与其纠结于对 'musl' 的依赖,不如直接使用 Linux 内核 api。
重新编译musl只要你自己的代码加上CFLAGS="-fPIC -Wa,-mrelax-relocations=no"
(你的binutils
版本必须>=2.27)。
我有一个 C99 共享库,我想 link 在几个静态库中(通过 --whole-archive
)。 注意:所有静态库都是用-fPIC
我也想构建一个通用的 linux 二进制文件,因此决定使用 musl。当我尝试从 musl 在静态 libc.a
中 link 时,出现以下错误:
# 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
exit.lo 将用汇编程序编写,这就是为什么您的 CFLAGS='-fPIC' 没有达到您想要的效果。这要么是 1. 'musl' 中的错误,要么是 2. 故意的,它们不支持静态链接到 .so's.
我会认为这是无意的,并针对 'musl'
提交错误如果您需要快速修复,您也可以自己编辑 asm。
您终于可以将 musl 配置为不使用 asm 进行构建了吗?
稍微偏离主题,但通用二进制文件的其他选项是:
- 只需在您支持的 Linux 最旧版本上链接 glibc。
- 与其纠结于对 'musl' 的依赖,不如直接使用 Linux 内核 api。
重新编译musl只要你自己的代码加上CFLAGS="-fPIC -Wa,-mrelax-relocations=no"
(你的binutils
版本必须>=2.27)。