在Debian·Ubuntu中使用Clang使用musl

musl是一种用于替代glibc的标准C库,是Alpine Linux的默认库。musl可以与clang配合使用,但在Debian和Ubuntu上,有针对gcc的musl-gcc包装器,却没有musl-clang包装器,因此我在下面提供了自己编写的包装器。如果遇到任何问题,请通过评论与我联系。由于musl是使用gcc进行编译的,所以需要libgcc.a库。libgcc.a库可以在libgcc-10-dev等软件包中找到。

#!/bin/sh

ARCH=aarch64
# or ARCH=x86_64 etc.
GCCVERSION=11

# Scrt1.o for dynamic PIE
# rcrt1.o for static PIE
# crt1.o for no PIE
LIBPREFIX=/usr/lib/${ARCH}-linux-musl
GNULIBPREFIX=/usr/lib/gcc/${ARCH}-linux-gnu/$GCCVERSION

if echo " $@" | fgrep -q -- ' -static'; then
  DYNLINKER=''
  if echo " $@" | fgrep -q -- ' -static-pie'; then
    CRT=${LIBPREFIX}/rcrt1.o
  else
    CRT=${LIBPREFIX}/crt1.o
  fi
else
  DYNLINKER="-Wl,-dynamic-linker,/lib/ld-musl-${ARCH}.so.1"
  if echo " $@" | fgrep -q -- ' -pie'; then
    CRT=${LIBPREFIX}/Scrt1.o
  else
    CRT=${LIBPREFIX}/crt1.o
  fi
fi
exec clang $DYNLINKER -nostdinc -isystem /usr/include/${ARCH}-linux-musl -nostdlib -nostdlib++ -nodefaultlibs -nostartfiles -L${LIBPREFIX} $CRT ${LIBPREFIX}/crti.o "$@" -lc ${GNULIBPREFIX}/libgcc.a ${LIBPREFIX}/crtn.o