c - 如何在交叉编译器环境中检测 libc 名称和版本?
问题描述
我的 linux 桌面上有一些交叉编译器。有些使用 glibc,有些使用 uclibc(将来也可能有其他libc
s)。
目前,我可以进入他们的 sysroot 目录并搜索libc.so
并尝试找到它指向的文件名(例如libc.so
-> libuClibc-1.0.12.so
)并获取他们的名字。但是如果命名改变或交叉编译器本身改变,这不会持续很长时间。
是否有更好/可靠的编程方式来检测libc
目标交叉编译器正在使用的名称和版本?或者是否有任何自省工具可用于获取有关目标 ceros 的详细信息
注意:这里有一些类似的问题通常指向#include <features.h>
文件或类似问题。如果生成的代码也可以在主机上运行,那效果很好。但不适合交叉编译环境。
那么有没有人能够更可靠地检测到呢?
编辑:如果有人来这里寻找专门检测 musl libc 的机会,我已经回答了与这个问题相关的另一个关于 SO 的问题。
解决方案
要在编译时检测 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 以外的库。
推荐阅读
- python - Python gRPC从客户端取消一元流调用
- python - 在hackerearth中用Python获取输入
- python - 在 Python 中,使用静态方法实现抽象方法的优缺点是什么?
- python - 在python中删除重复分隔符之间的字符串
- c - Linux 上 64 位进程中的地址
- ios - 使用 AVAssetDownloadURLSession 进行离线下载的正确进度
- angular - 带有初始化 oninit 的未定义数组
- angular - Angular - 扩展服务并使用它的方法
- angularjs - 如何为角度应用选择单选按钮
- wordpress - WP Plugin Advanced Gutenberg 的 Accordion - 防止打开第一个 Accordion