musl团队声称不需要检测musl libc的方法,因为它们只实现标准功能,没有需要检测的怪癖。
直到今天,这种说法很可能是正确的,但它不再是正确的。正常的特性检测不起作用,因为特性在那里,但是损坏了,我不想去探测它,因为我不想在编译时要求root,并且不允许交叉编译。已经用最小化的示例代码报告了这个错误,维护人员根本不想修复它,也不会接受我的补丁。
我不会惩罚其他的libc,因为musl有一个被破坏的特性。
从逻辑上讲我想做的是
#if MUSL || APPLE
pid = fork();
#else
pid = vfork();
#endif因为Mac有一个不值得信任的vfork(),所以我已经有了#if APPLE。
告诉我vfork()不好是没有意义的。自2008年以来,情况发生了变化,无论涉及的复杂性如何,只要有可能,vfork()都是更好的选择。一些来源:https://gist.github.com/nicowilliams/a8a07b0fc75df05f684c23c18d7db234
发布于 2020-03-01 09:05:49
我想这有点晚了,但这里有一个解决方案:
#! /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}"这个shell脚本提取一些有趣的信息,并打印出-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]我已经在阿尔卑斯山和Linux Mint上测试了我的脚本,它似乎工作得很好。
像你一样,我讨厌书呆子气的意识形态阻碍了实用性。如果你找到了更好的解决方案,请随时上传。:)
编辑:在交叉编译的情况下,ldd无法工作。还有一些额外的工作,你需要生成一个测试程序并读出它的ELF链接,然后检查它是否包含musl libc字符串。有关详细信息,请参阅GitHub代码片段。
https://stackoverflow.com/questions/58177815
复制相似问题