首页 > 解决方案 > 如何查看 libc 版本?

问题描述

这个问题与为什么 pclose 过早返回有关?. 我想知道libc用于交叉编译的可执行文件的版本。如下所述,存在一些限制,使得Check glibc version for a specific gcc compiler的答案不适用。

$ /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-gcc -print-file-name=libc.so
libc.so
$
$ /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-gcc -print-file-name=foo.bar
foo.bar
$ # I really do not have a foo.bar file in existence
$ ldd
sh: can't execute 'ldd': No such file or directory

我的跨工具链似乎只提供libc.a,不提供libc.so
我尝试运行它并对“版本”和“libc”libc.a进行grepping(不区分大小写),但没有找到任何看起来像识别版本的东西。/path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-nmstrings

我尝试的最后一件事是strings /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-gcc | grep GLIBC,它给了我:

GLIBC_2.3
GLIBC_2.2
GLIBC_2.1
GLIBC_2.0
EGLIBC configuration specifier, serves multilib purposes.

但是该解决方案并没有得到很高的评价,并且它还有一条评论表明它并没有真正为您提供版本。我真的不明白这个答案或其回应评论,所以我不知道如何理解它的有效性。

问题:鉴于以上所有情况,是否有任何确定的方法来确定用于此跨平台交叉编译的 libc 版本?

标签: ccross-compilinglibc

解决方案


您可能正在处理除 glibc 之外的 libc 变体。libc有多种不同的实现,例如 musl 或 uclibc。

这是一个 Bash 脚本,它可以检测你的编译器是使用 glibc 还是 uclibc,如果它检测到任何一个,它就会告诉你版本。

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

来源。)

如果您使用的是 musl,不幸的是,此脚本将报告“其他内容”。没有办法使用预处理器宏来检测 musl,这是故意的


推荐阅读