如何检查libc版本?

如何检查libc版本?,c,cross-compiling,libc,C,Cross Compiling,Libc,这个问题涉及到我想知道交叉编译的可执行文件使用的是什么版本的libc。下面描述了一些限制,使得下面的答案不适用 检查libc版本的一种建议方法是使用gnu-get\u-libc\u-version()中声明的gnu/libc-version.h函数。我的交叉工具链不包括libc version.h 另一个建议的解决方案是使用-print file namegcc选项。链接问题中的这个答案完全不适用于我: 另一个建议的解决方案是只做ldd--version。我的目标平台没有ldd:

这个问题涉及到我想知道交叉编译的可执行文件使用的是什么版本的
libc
下面描述了一些限制,使得下面的答案不适用

  • 检查
    libc
    版本的一种建议方法是使用
    gnu-get\u-libc\u-version()中声明的
    gnu/libc-version.h
    函数。我的交叉工具链不包括
    libc version.h

  • 另一个建议的解决方案是使用
    -print file name
    gcc
    选项。链接问题中的这个答案完全不适用于我:

  • 另一个建议的解决方案是只做
    ldd--version
    。我的目标平台没有
    ldd
  • 另一个建议的解决方案是查看
    \uuuu GLIBC\uuuu
    \uuuu GLIBC\u MINOR\uuuu
    ——但它们似乎也来自
    libc version.h
    ,如上文所述,它不存在于我的跨工具链中
我的交叉工具链似乎只提供
libc.a
,而不是
libc.so

我尝试通过
/path/to/toolschains/ARM-cortex-m3-4.4/bin/ARM-uclinuxeabi-nm
字符串
对“version”和“libc”进行grepping(不区分大小写),但没有找到任何类似于识别版本的内容

我最后尝试的是
strings/path/to/toolschains/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有多种,如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

GCC\u FEATURES=$(GCC-dM-E-The
strings
很可能只是告诉您编译器可执行文件本身是针对(主机)链接的glibc。这不会告诉你它生成的可执行文件的用途。听起来可能你的目标平台根本没有使用glibc,但可能是一些完全不相关的C库,所以glibc的东西可能没有任何用处。C库的每个实现都会自行决定如何报告其版本编号(如果有);据我所知,没有标准接口。所以你需要找出你安装的C库并阅读它的文档。哇,感谢你为研究这个问题付出的努力。对另一个问题的评论表明你可能正在处理uclibc。你能试着检查一下它是否提供了正确的版本吗?@NateEldredge-编译器/工具链是否完全独立于
libc
?我认为这是因为编译器是(交叉编译风格的)
gcc
,这意味着它是一个
gnu
工具链,因此也包括
gnu
libc
。@StoneThrow:不,编译器和C库通常是互不可知的。只要它们都遵循正确的ABI,任何组合都应该有效。
GLIBC_2.3
GLIBC_2.2
GLIBC_2.1
GLIBC_2.0
EGLIBC configuration specifier, serves multilib purposes.
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