我的 Linux 桌面上有一些交叉编译器。有些使用 glibc,有些使用 uclibc(将来可能会有其他libc
s too).
目前,我可以进入他们的 sysroot 目录并搜索libc.so
并尝试查找它指向哪个文件名(例如libc.so
-> libuClibc-1.0.12.so
)然后我获取他们的名字。但如果命名发生变化或者交叉编译器本身发生变化,这种情况不会持续太久。
是否有更好/可靠的编程方式来检测名称和版本libc
被目标交叉编译器使用?或者是否有任何内省工具可用于获取有关目标 ceros 的详细信息
注意:这里有一些类似的问题,通常指向#include <features.h>
文件或类似文件。如果生成的代码也可以在主机上运行,那么效果很好。但不适合交叉编译环境。
那么有人能够更可靠地检测到吗?
编辑:如果有人来这里专门寻找检测 musl libc,我已经回答了另一个问题 https://stackoverflow.com/questions/58177815/how-to-actually-detect-musl-libc/60471114#60471114与这个问题相关的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 以外的库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)