如何查看libc版本?
How to check libc version?
此问题与 Why does pclose return prematurely?. I'd like to find out what version of libc
is used for a cross-compiled executable. There are limitations, described below, that make the answers at Check glibc version for a particular gcc compiler 不适用。
一种检查 libc
版本的建议方法是使用 gnu/libc-version.h
中声明的 gnu_get_libc_version()
函数。我的交叉工具链不包括 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__
和 __GLIBC_MINOR__
——但它们似乎也来自 libc-version.h
,它在我的交叉工具链中不存在,因为如上所述。
我的交叉工具链似乎只提供了libc.a
,没有libc.so
。
我尝试 运行 libc.a
通过 /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-nm
和 strings
grepping(不区分大小写)“版本”和“libc”,但没有找到任何看起来像识别版本的东西.
我最后尝试的是 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有多个different implementations,比如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,并且 this is intentional.
此问题与 Why does pclose return prematurely?. I'd like to find out what version of libc
is used for a cross-compiled executable. There are limitations, described below, that make the answers at Check glibc version for a particular gcc compiler 不适用。
一种检查
libc
版本的建议方法是使用gnu/libc-version.h
中声明的gnu_get_libc_version()
函数。我的交叉工具链不包括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__
和__GLIBC_MINOR__
——但它们似乎也来自libc-version.h
,它在我的交叉工具链中不存在,因为如上所述。
我的交叉工具链似乎只提供了libc.a
,没有libc.so
。
我尝试 运行 libc.a
通过 /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-nm
和 strings
grepping(不区分大小写)“版本”和“libc”,但没有找到任何看起来像识别版本的东西.
我最后尝试的是 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有多个different implementations,比如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,并且 this is intentional.