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

时间:2018-05-21 06:28:06

标签: c

我的linux桌面上有一些交叉编译器。有些人使用glibc,有些人使用uclibc(以后可能会有其他libc)。

目前,我可以进入他们的sysroot目录并搜索libc.so并尝试查找它指向的文件名(例如。libc.so - > libuClibc-1.0.12.so)和我取他们的名字。但如果命名更改或交叉编译器本身发生更改,这将不会持续很长时间。

是否有更好/可靠的编程方法来检测目标交叉编译器使用的libc的名称和版本?或者是否有任何内省工具可用于获取有关目标ceros的详细信息

注意:这里有一些类似的问题,通常指向#include <features.h>文件或类似文件。如果生成的代码也可以在主机上运行,​​那么这很好。但不适合交叉编译环境。

所以有人能够更可靠地检测出来吗?

1 个答案:

答案 0 :(得分:1)

要在编译时检测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以外的库。

相关问题