【问题标题】:How to detect libc name and version in cross-compiler environments?如何在交叉编译器环境中检测 libc 名称和版本?
【发布时间】:2018-05-21 06:28:06
【问题描述】:

我的 linux 桌面上有一些交叉编译器。有些使用 glibc,有些使用 uclibc(将来可能还有其他 libcs)。

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

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

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

那么有没有人能够更可靠地检测到?

编辑:如果有人来这里专门寻找检测 musl libc,我在与此问题相关的 SO 上 answered another question

【问题讨论】:

  • 您可以检查预处理器宏。例如,gcc -dM -E - <<< "#include <features.h>" | grep -iE "(uclibc|glibc)"
  • @DaBler 该解决方案唯一的小问题是:1)它同时显示了 glibcuclibc 用于 MIPS32-uclibc 交叉编译器,2)我必须解析输出。跨度>

标签: c


【解决方案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 以外的库。

【讨论】:

  • 这大概就是我想要的。但是这个技巧不适用于 musl (wiki.musl-libc.org/faq.html)。对于大多数部分来说,这非常好。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-01-27
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2011-04-05
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多