如何重新构建GNU Arm嵌入式工具链中的newlib和newlib-nano?

9
我从https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads下载了“gcc-arm-none-eabi-6-2017-q2-update-win32-sha1.exe”(Windows)工具链并在Windows 10 PC上安装。安装文件夹中的“../share/doc/gcc-arm-none-eabi/”包含一个release.txt,其中写道:

此版本包括以下内容:

  • newlib和newlib-nano: git://sourceware.org/git/newlib-cygwin.git提交0d79b021a4ec4e6b9aa1a9f6db0e29a137005ce7

还有“../share/doc/gcc-arm-none-eabi/”中的readme.txt包含:

  • C库使用 *

该工具链附带两个基于newlib的预构建C库:一个是标准的newlib(libc.a),另一个是针对代码大小的newlib-nano(libc_nano.a)。

现在我想精确地重建“../arm-none-eabi/lib/thumb”中包含的所有libc.a和libc_nano.a

目前我可以使用“gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2”在Ubuntu上进行构建。

$ # Downloaded newlib-cygwin (with corresponding hash) into folder newlib-cygwin
$ mkdir build
$ cd build
$ ../newlib-cygwin/configure --target=arm-none-eabi --disable-newlib-supplied-syscalls
$ make

我该如何配置newlib,以构建在gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2中包含的libc.a和libc_nano.a的完全副本?

$ # Downloaded newlib-cygwin (with corresponding hash) into folder newlib-cygwin
$ mkdir build
$ cd build
$ ../newlib-cygwin/configure --target=arm-none-eabi --???
$ make

你必须按照自己的需求进行配置。如果你想使用newlib提供的系统调用,则不要禁用它们。在Windows上运行../newlib-cygwin/configure --target=arm-none-eabi失败了吗?出现了什么错误? - KamilCuk
不,它在Windows上运行不会失败,但是使用Cygwin构建库需要很长时间。是的,对我来说,我可以按照自己的意愿进行配置,但我想像GNU ARM工具链一样精确地配置它。唯一的问题是我不知道在哪里可以找到这些配置选项。 - ge45mue
3个回答

15
如果我理解正确,更详细的问题是:在构建gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2归档文件中包含的newlib库时,'GNU Arm Embedded Toolchain'开发人员使用了哪些配置选项?
这些是针对newlib的: --target=arm-none-eabi --enable-newlib-io-long-long --enable-newlib-register-fini --enable-newlib-retargetable-locking --disable-newlib-supplied-syscalls --disable-nls 而这些是针对newlib-nano的: --target=arm-none-eabi --enable-newlib-reent-small --disable-newlib-fvwrite-in-streamio --disable-newlib-fseek-optimization --disable-newlib-wide-orient --enable-newlib-nano-malloc --disable-newlib-unbuf-stream-opt --enable-lite-exit --enable-newlib-global-atexit --enable-newlib-nano-formatted-io --disable-nls 我是如何得到这些信息的呢?让我们来看一下整个过程:
这些软件包是在Launchpad上构建的,您可以在此处找到所有在Launchpad上发生的构建。我选择了2017年10月24日的gcc-arm-none-eabi 6-2017q2-1版本。在那里,我可以找到构建日志。我使用| grep "^+ " | grep "configure " | grep 'src/newlib'命令过滤了构建日志,并得到以下结果:

+ /<<PKGBUILDDIR>>/src/newlib/configure --target=arm-none-eabi --prefix=/<<PKGBUILDDIR>>/install-native --infodir=/<<PKGBUILDDIR>>/install-native/share/doc/gcc-arm-none-eabi/info --mandir=/<<PKGBUILDDIR>>/install-native/share/doc/gcc-arm-none-eabi/man --htmldir=/<<PKGBUILDDIR>>/install-native/share/doc/gcc-arm-none-eabi/html --pdfdir=/<<PKGBUILDDIR>>/install-native/share/doc/gcc-arm-none-eabi/pdf --enable-newlib-io-long-long --enable-newlib-register-fini --enable-newlib-retargetable-locking --disable-newlib-supplied-syscalls --disable-nls

我猜测第二行是将newlib配置为构建为newlib-nano (--enable-newlib-reent-small),第一行是将newlib配置为完整的newlib。 回答您的问题,要以相同的方式重新编译newlib和newlib-nano,请将我发布的选项传递给newlib的 ./configure 脚本。

1
非常感谢。我今天会尝试。我认为在 https://github.com/gnu-mcu-eclipse/arm-none-eabi-gcc-build/blob/master/scripts/container-gcc-functions-source.sh 中还有另一个可能的搜索选项。 - ge45mue
4
对于不在launchpad上的较新版本ARM工具链,如果您在ARM的下载页面下载“源代码压缩包”,则会有一个名为build-toolchain.sh的文件,并且其中有一个部分列出了newlib和newlib-nano的配置选项。您可以通过在脚本中搜索$SRCDIR/$NEWLIB/configure和$SRCDIR/$NEWLIB_NANO/configure来找到它们。 - tbejos
@tbejos 配置命令也包含在 ARM 的二进制软件包发布中。它们在存档的根目录下有一个以 *arm-none-eabi-manifest.txt 结尾的文件。该文件包含了 gcc、newlib 和其他捆绑软件包的配置标志集合。 - silvergasp

2

编译器配置的提示可以在以下位置找到:

  • $COMPILER_PATH/arm-none-eabi/include/newlib.h
  • $COMPILER_PATH/arm-none-eabi/include/newlib-nano/newlib.h

那里的#define与构建newlib时传递给“configure”的选项密切对应。


1

我认为提供2023年(针对GCC 10)ARM构建的newlib/newlib-nano的默认配置将是有用的:

对于Newlib:

--enable-newlib-io-long-long
--enable-newlib-io-c99-formats
--enable-newlib-reent-check-verify
--enable-newlib-register-fini
--enable-newlib-retargetable-locking
--disable-newlib-supplied-syscalls
--disable-nls

对于Newlib-nano:

--disable-newlib-supplied-syscalls
--enable-newlib-reent-check-verify
--enable-newlib-reent-small
--enable-newlib-retargetable-locking
--disable-newlib-fvwrite-in-streamio
--disable-newlib-fseek-optimization
--disable-newlib-wide-orient
--enable-newlib-nano-malloc
--disable-newlib-unbuf-stream-opt
--enable-lite-exit
--enable-newlib-global-atexit
--enable-newlib-nano-formatted-io
--disable-nls

参考: https://community.arm.com/support-forums/f/compilers-and-libraries-forum/53310/gcc-arm-none-eabi-what-were-the-newlib-compilation-options


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接