c - 如何查看 libc 版本?
问题描述
这个问题与为什么 pclose 过早返回有关?. 我想知道libc
用于交叉编译的可执行文件的版本。如下所述,存在一些限制,使得Check glibc version for a specific gcc compiler的答案不适用。
检查
libc
版本的一种建议方法是使用gnu_get_libc_version()
在gnu/libc-version.h
. 我的跨工具链不包括libc-version.h
.另一个建议的解决方案是使用该
-print-file-name
gcc
选项。链接问题中的这个答案完全不适合我:
$ /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-gcc -print-file-name=libc.so
libc.so
$
$ /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-gcc -print-file-name=foo.bar
foo.bar
$ # I really do not have a foo.bar file in existence
- 另一个建议的解决方案是只做
ldd --version
. 我的目标平台没有ldd
:
$ ldd
sh: can't execute 'ldd': No such file or directory
- 另一个建议的解决方案是查看
__GLIBC__
and__GLIBC_MINOR__
- 但这些似乎也来自libc-version.h
,如上所述,我的跨工具链中不存在它。
我的跨工具链似乎只提供libc.a
,不提供libc.so
。
我尝试运行它并对“版本”和“libc”libc.a
进行grepping(不区分大小写),但没有找到任何看起来像识别版本的东西。/path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-nm
strings
我尝试的最后一件事是strings /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-gcc | grep GLIBC
,它给了我:
GLIBC_2.3
GLIBC_2.2
GLIBC_2.1
GLIBC_2.0
EGLIBC configuration specifier, serves multilib purposes.
但是该解决方案并没有得到很高的评价,并且它还有一条评论表明它并没有真正为您提供版本。我真的不明白这个答案或其回应评论,所以我不知道如何理解它的有效性。
问题:鉴于以上所有情况,是否有任何确定的方法来确定用于此跨平台交叉编译的 libc 版本?
解决方案
您可能正在处理除 glibc 之外的 libc 变体。libc有多种不同的实现,例如 musl 或 uclibc。
这是一个 Bash 脚本,它可以检测你的编译器是使用 glibc 还是 uclibc,如果它检测到任何一个,它就会告诉你版本。
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
(来源。)
如果您使用的是 musl,不幸的是,此脚本将报告“其他内容”。没有办法使用预处理器宏来检测 musl,这是故意的。
推荐阅读
- node.js - 请求和响应功能。节点
- c++ - 如何设置 char [ ] 以便在我们输入任何字符或不输入任何字符时都会给出输出。代码如下
- reactjs - 反应谷歌地图没有在指定的纬度,经度上打开,而是在随机的地方
- javascript - 当我要在 js 中创建一个机器人并且我无法修复它时,会发生此错误。有人能帮我吗?
- javascript - AWS Lambda 上的 FabricJS 节点 - 字体未出现在数据 uri 图像上
- arrays - 无法找到二和问题的正确输出
- html - 如何在嵌入 html 的右侧预填充 youtube 播放列表视频
- outlook - Outlook VSTO - 创建邮件并将其保存在收件箱中 - 使用 Outlook Redemption 设置发件人
- python - 如何在不丢失迄今为止获得的数据的情况下停止 Jupyter Notebook 循环
- kotlin - 并发修改如何与协程一起工作?