如何查看libc版本?

How to check libc version?

此问题与 Why does pclose return prematurely?. I'd like to find out what version of libc is used for a cross-compiled executable. There are limitations, described below, that make the answers at Check glibc version for a particular 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.a 通过 /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-nmstrings grepping(不区分大小写)“版本”和“libc”,但没有找到任何看起来像识别版本的东西.

我最后尝试的是 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版本?

您可能正在处理 glibc 以外的 libc 变体。 libc有多个different implementations,比如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,并且 this is intentional.