如何重新编译GNU Arm嵌入式工具链的newlib与newlib-nano?
嘿,针对你用的这款gcc-arm-none-eabi 6-2017-q2版本,重新编译里面的newlib和newlib-nano其实不难,跟着下面的步骤来就行:
1. 先搞定编译依赖
在Windows上搞这类交叉编译,推荐用MSYS2环境,它的包管理比老的MinGW方便多了。先装好MSYS2,然后打开MSYS2的终端,安装必要的编译工具:
pacman -S base-devel git mingw-w64-x86_64-gcc mingw-w64-x86_64-make autoconf automake libtool
这些工具是编译newlib的基础,缺一不可。
2. 拉取对应版本的newlib源码
你已经从release.txt里拿到了准确的commit哈希0d79b021a4ec4e6b9aa1a9f6db0e29a137005ce7,直接克隆仓库并切换到这个版本:
git clone git://sourceware.org/git/newlib-cygwin.git cd newlib-cygwin git checkout 0d79b021a4ec4e6b9aa1a9f6db0e29a137005ce7
这样就能确保你编译的newlib和工具链自带的版本完全一致。
3. 配置编译参数(区分newlib和newlib-nano)
newlib是交叉编译库,必须指定目标平台为arm-none-eabi,而且newlib和newlib-nano的配置参数不一样,分开来搞:
编译标准版newlib
建议用out-of-tree编译(也就是在源码外新建编译目录),这样不会污染源码文件:
mkdir build-newlib && cd build-newlib ../newlib-cygwin/configure --target=arm-none-eabi --prefix=/path/to/your/install --enable-multilib
这里的--prefix是你想把编译好的newlib安装到的路径,比如可以设为D:/my-newlib,或者直接指向你现有工具链的安装目录(替换前记得备份原文件)。
编译newlib-nano
newlib-nano是精简版的newlib,核心是开启了一堆精简优化选项,配置命令要加上这些参数:
mkdir build-newlib-nano && cd build-newlib-nano ../newlib-cygwin/configure --target=arm-none-eabi --prefix=/path/to/your/nano-install --enable-multilib --enable-newlib-nano-malloc --disable-newlib-fvwrite-in-streamio --disable-newlib-fseek-optimization --disable-newlib-wide-orient --enable-lite-exit --enable-newlib-global-atexit --enable-newlib-nano-formatted-io
这些参数都是官方定义的newlib-nano标准配置,能让生成的库体积大幅缩小,适合嵌入式场景。
4. 编译+安装
配置完成后,就可以开始编译了,用多线程编译能快不少:
make -j$(nproc) # 自动用你电脑的所有核心编译 make install
如果是编译newlib-nano,就在对应的build-newlib-nano目录下执行同样的命令。
5. 替换现有工具链的newlib(可选)
要是你想让原来的gcc-arm-none-eabi工具链直接用你编译的版本,只需要把安装目录下的arm-none-eabi文件夹里的内容,覆盖到现有工具链的对应目录(比如gcc-arm-none-eabi-6-2017-q2-update/arm-none-eabi),替换前一定要备份原文件,避免搞坏原工具链。
内容的提问来源于stack exchange,提问作者ge45mue

