如何在交叉编译环境中检测libc的名称和版本?

3
我在我的Linux桌面上有几个交叉编译器。有些使用glibc,有些使用uclibc(将来可能还会有其他libc)。目前,我可以进入它们的sysroot目录并搜索libc.so,然后尝试找到它指向的文件名(例如libc.so -> libuClibc-1.0.12.so),并提取它们的名称。但是如果命名更改或交叉编译器本身更改,这种方法将不再有效。是否有更好/可靠的编程方法来检测目标交叉编译器正在使用的libc的名称和版本?或者是否有任何内省工具可用于获取有关目标ceros的详细信息?注意:这里有一些类似的问题,通常指向#include 文件或类似文件。如果生成的代码也可以在主机上运行,则可以正常工作。但不适用于交叉编译环境。那么有人能够更可靠地检测吗?

编辑:以防有人在这里寻找特定的musl libc检测方法,我在SO上回答了另一个问题与这个问题有关。


1
你可以检查预处理器宏。例如,gcc -dM -E - <<< "#include <features.h>" | grep -iE "(uclibc|glibc)" - DaBler
@DaBler,这种解决方案唯一的小问题是:1)它显示了MIPS32-uclibc交叉编译器的glibcuclibc,2)我必须解析输出。 - Unmanned Player
1个回答

5
为了在编译时检测libc的名称和版本,您可以检查预处理器宏。以下脚本仅是概念验证:
GCC_FEATURES=$(gcc -dM -E - <<< "#include <features.h>")

if grep -q __UCLIBC__ <<< "${GCC_FEATURES}"; then
    echo "uClibc"
    grep "#define __UCLIBC_MAJOR__" <<< "${GCC_FEATURES}"
    grep "#define __UCLIBC_MINOR__" <<< "${GCC_FEATURES}"
    grep "#define __UCLIBC_SUBLEVEL__" <<< "${GCC_FEATURES}"
elif grep -q __GLIBC__ <<< "${GCC_FEATURES}"; then
    echo "glibc"
    grep "#define __GLIBC__" <<< "${GCC_FEATURES}"
    grep "#define __GLIBC_MINOR__" <<< "${GCC_FEATURES}"
else
    echo "something else"
fi
请先进行uClibc测试,因为uClibc定义了宏以模仿glibc。 另一个可能性是在交叉编译器环境中调用ldd --version(glibc版本在括号内)。但我不确定这是否适用于除glibc之外的库。

这大致是我在寻找的。但这种技巧对musl不起作用(https://wiki.musl-libc.org/faq.html)。对于大多数部分来说,这非常棒。谢谢。 - Unmanned Player
补充一点,您可以在定义了_GNU_SOURCE的情况下包含features.h,并检查是否定义了__USE_GNU来测试musl libc,因为musl libc直接使用_GNU_SOURCE来保护暴露GNU扩展,这与大多数其他主要的Linux libc不同。 - nfries88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接