Sto*_*row 4 c libc cross-compiling
这个问题与为什么 pclose 提前返回有关?。我想知道libc交叉编译的可执行文件使用的是哪个版本。如下所述,存在一些限制,使得检查特定 gcc 编译器的 glibc 版本中的答案不适用。
检查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
Run Code Online (Sandbox Code Playgroud)
ldd --version. 我的目标平台没有ldd:$ ldd
sh: can't execute 'ldd': No such file or directory
Run Code Online (Sandbox Code Playgroud)
__GLIBC__和__GLIBC_MINOR__- 但这些似乎也来自libc-version.h,它不存在于我的跨工具链中,如上所述。我的跨工具链似乎只提供libc.a,而不提供libc.so。
我尝试运行它libc.a并grep /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-nm(strings不区分大小写)“version”和“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.
Run Code Online (Sandbox Code Playgroud)
但该解决方案并未得到高度支持,而且它还有一条评论表明它并没有真正为您提供版本。我不太理解这个答案或其回应评论,所以我不知道如何理解它的有效性。
问题:考虑到上述所有内容,是否有任何明确的方法来确定用于此跨平台交叉编译的 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
Run Code Online (Sandbox Code Playgroud)
(来源。)
如果您使用 musl,不幸的是这个脚本将报告“其他内容”。无法使用预处理器宏来检测 musl,这是故意的。