代码之家  ›  专栏  ›  技术社区  ›  Unmanned Player

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

c
  •  1
  • Unmanned Player  · 技术社区  · 6 年前

    我的Linux桌面上有一些交叉编译器。有些人使用glibc,有些人使用uclibc(将来可能会有其他的 libc S也是)。

    目前,我可以进入他们的sysroot目录并搜索 libc.so 并尝试找出它指向的文件名(例如 伦敦银行同业拆借利率 -gt; libuClibc-1.0.12.so )我去取他们的名字。但是,如果命名改变或者交叉编译器本身改变,这种情况不会持续太久。

    是否有更好/可靠的程序方法来检测 利比克 被目标交叉编译器使用?或者是否有任何自省工具可用于获取有关目标CERO的详细信息

    注意:这里有几个类似的问题,通常是指 #include <features.h> 文件或类似文件。如果生成的代码也可以在主机上运行,那就可以了。但不适用于交叉编译环境。

    那么,是否有人能够更可靠地检测到?

    1 回复  |  直到 6 年前
        1
  •  1
  •   DaBler    6 年前

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