这个问题与为什么帕克普过早回来?有关。我想了解一下在跨编译的可执行文件中使用了什么版本的libc 。有一些限制,如下所述,使得检查glibc版本是否有特定的gcc编译器的答案不适用。
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 existenceldd --version。我的目标平台没有ldd$ ldd
sh: can't execute 'ldd': No such file or directory__GLIBC__和__GLIBC_MINOR__ --但它们似乎也来自于libc-version.h,正如上面所述,libc-version.h并不存在于我的跨工具链中。我的跨工具链似乎只提供libc.a,而不是libc.so。
我试着通过libc.a通过/path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-nm和strings对“版本”和"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版本的确定方法?
发布于 2020-07-06 18:13:22
您可能正在处理libc的变体,而不是glibc。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。
https://stackoverflow.com/questions/62732447
复制相似问题