Я думаю, что это немного поздно, но вот решение:
#! /bin/sh
tmpf=/tmp/musl.log
# Detect Musl C library.
libc=$(ldd /bin/ls | grep 'musl' | head -1 | cut -d ' ' -f1)
if [ -z $libc ]; then
# This is not Musl.
rm -f ${tmpf}
exit 1
fi
$libc >${tmpf} 2>&1
vstr=$(cat ${tmpf} | grep "Version" | cut -d ' ' -f2)
v_major=$(echo $vstr | cut -d '.' -f1)
v_minor=$(echo $vstr | cut -d '.' -f2)
v_patch=$(echo $vstr | cut -d '.' -f3)
rm -f ${tmpf}
echo "-D__MUSL__ -D__MUSL_VER_MAJOR__=${v_major} -D__MUSL_VER_MINOR__=${v_minor} -D__MUSL_VER_PATCH__=${v_patch}"
Этот сценарий оболочки извлекает некоторую интересную информацию и выводит -D
понятные значения, поэтому заголовки/исходные файлы могут извлечь из них пользу. Видеть,
$ ./detect-musl.sh
-D__MUSL__ -D__MUSL_VER_MAJOR__=1 -D__MUSL_VER_MINOR__=1 -D__MUSL_VER_PATCH__=24
Пожалуйста, вызовите это раньше в вашем Makefile и соответствующим образом настройте CFLAGS
.
Этот скрипт выполняет скрипт ldd
, получает библиотеку, в имени которой есть musl
, а затем выполняет ее. Все библиотеки libc исполняемые (поскольку они буквально содержат _start()
) и даже производят вывод. Обычно это информация о версии. Например, GNU показывает это:
$ /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1) stable release version 2.27.
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 7.3.0.
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.
и, musl показывает это:
$ /lib/ld-musl-x86_64.so.1
musl libc (x86_64)
Version 1.1.24
Dynamic Program Loader
Usage: /lib/ld-musl-x86_64.so.1 [options] [--] pathname [args]
Я протестировал свой скрипт на Alpine и Linux Mint, и он работает нормально.
Как и вы, я ненавижу, когда педантичные идеологии мешают практичности. Если вы найдете лучшее решение, пожалуйста, опубликуйте его. :)
Изменить: в случае кросс-компиляции ldd
не может работать. Требуется немного дополнительной работы, когда вы создаете тестовую программу и читаете ее ссылки ELF, а затем проверяете, содержит ли она строку musl libc
. Подробнее см. во фрагменте GitHub.
person
Unmanned Player
schedule
01.03.2020
vfork()
? Имейте в виду, что спецификация POSIX.1-2008 объявила его устаревшим, и даже до этого на него распространялись обширные ограничения. - person   schedule 01.10.2019vfork()
возвращается. - person Joshua   schedule 01.10.2019