如何重建 GNU Arm Embedded Toolchain 的 newlib 和 newlib-nano
Posted
技术标签:
【中文标题】如何重建 GNU Arm Embedded Toolchain 的 newlib 和 newlib-nano【英文标题】:How to rebuild newlib and newlib-nano of GNU Arm Embedded Toolchain 【发布时间】:2018-10-13 17:08:27 【问题描述】:我从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 个人电脑。
安装文件夹在“../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 库使用 *此工具链发布时包含两个预构建的 C 库,基于 newlib:一个是标准的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 以构建 libc.a 和 gcc-arm-none-eabi-6-2017-q2-update-linux.tar 中包含的 libc_nano.a 的精确副本。 bz2?
$ # Downloaded newlib-cygwin (with corresponding hash) into folder newlib-cygwin
$ mkdir build
$ cd build
$ ../newlib-cygwin/configure --target=arm-none-eabi --???
$ make
【问题讨论】:
你必须按照你想要的方式配置它。如果您想要 newlib 提供的系统调用调用,请不要禁用它们。../newlib-cygwin/configure --target=arm-none-eabi
是否无法在 Windows 上运行?什么错误?
不,它不会在 Windows 上运行失败,但是使用 cygwin 构建库需要很长时间。是的,对我来说很明显我可以按照自己的意愿配置它,但我喜欢像 GNU ARM 工具链一样配置它。唯一的问题是我不知道在哪里可以找到这个配置选项。
【参考方案1】:
如果我理解正确,一个更详细的问题是: 'GNU Arm Embedded Toolchain' 开发人员在构建 gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2 存档中提供的 newlib 库时使用了哪些配置选项? 这些用于 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 上构建的,您可以从中找到在 lanuchpad 上发生的所有builds。我选择了gcc-arm-none-eabi 6-2017q2-1 from 2017-10-24。在那里我可以找到buildlog。我用| grep "^+ " | grep "configure " | grep 'src/newlib'
grep了构建日志,剩下的是:
+ /<<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
+ /<<PKGBUILDDIR>>/src/newlib/configure --target=arm-none-eabi --prefix=/<<PKGBUILDDIR>>/build-native/target-libs --disable-newlib-supplied-syscalls --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
有点福尔摩斯,我推断第二行是 newlib 配置为构建为 newlib-nano (--enable-newlib-reent-small
),第一行是 newlib 配置为构建为完整的 newlib。
要回答您的主题问题,以相同的方式重新编译 newlib 和 newlib-nano 将我在上面发布的选项传递给 newlib ./configure
脚本。
【讨论】:
非常感谢。我今天会试试。我认为另一种可能在 github.com/gnu-mcu-eclipse/arm-none-eabi-gcc-build/blob/master/… 中搜索 对于不在启动板上的较新版本的 ARM 工具链,如果您下载“Source Tarball”,则在 ARM 的下载页面上有一个名为 build-toolchain.sh 的文件,其中有一个部分包含newlib 和 newlib-nano 的配置选项。您可以通过分别在脚本中搜索 $SRCDIR/$NEWLIB/configure 和 $SRCDIR/$NEWLIB_NANO/configure 来找到它们以上是关于如何重建 GNU Arm Embedded Toolchain 的 newlib 和 newlib-nano的主要内容,如果未能解决你的问题,请参考以下文章
ARM 编译器 Arm Compiler for Embedded 6 相关工具链简介
Performance measurements for hypervisors on embedded ARM processors
编译时如何更改 makefile 诊断消息 [GNU ARM GCC, Eclipse make.exe]