如何构建newlib以进行大小优化?

时间:2017-04-10 10:18:46

标签: arm embedded gnu-toolchain newlib

我正在使用Newlib 2.5.0构建arm-eabi-gcc工具链作为目标C库。

目标嵌入式系统更喜欢较小的代码大小而不是执行速度。如何配置newlib以支持更小的代码?

默认构建会产生类似代码大小超过1KB的strstr版本。

2 个答案:

答案 0 :(得分:2)

像这样配置newlib:

CFLAGS_FOR_TARGET="-DPREFER_SIZE_OVER_SPEED=1 -Os" \
../newlib-2.5.0/configure

(我省略了我用于配置的其余参数,它们不会根据此问题进行更改。)

没有配置标志,但配置脚本从环境中读取某些变量。 CFLAGS_FOR_TARGET表示为目标系统构建时使用的标志。

不要与CFLAGS_FOR_BUILD混淆,PREFER_SIZE_OVER_SPEED是构建系统需要在构建系统上执行任何辅助可执行文件以帮助构建过程时使用的标志。

我找不到任何官方文档,但搜索源代码时,它包含许多__OPTIMIZE_SIZE__printf的测试实例。基于快速grep,这两个标志几乎相同。唯一的区别是%s家族中的一个案例,如果为(null)传递空指针,那么前者会将其转换为{ "id_str": "123456", "name": "Some Name", "protected": false, "created_at": "Tue Mar 31 18:01:12 +0000 2009", "tweets" : [ { "created_at" : "Sat Apr 14 00:20:07 +0000 2012", "id_str" : 190957570511478784, "text" : "Tweet text", "comments": { "id_str":"2343", "text":"This is comment1" } }, { "created_at" : "Sat Apr 14 00:20:07 +0000 2012", "id_str" : 190957570511478784, "text" : "Tweet text", "comments": { "id_str":"2343", "text":"This is comment2" } } ] } ,但后者会向前推进,可能导致崩溃。

答案 1 :(得分:2)

Newlib中的胖子可以通过Newlib-nano解决,Newlib-nano已经是GCC ARM Embedded的一部分,正如所讨论的那样here(注意这篇文章是从2014年开始的,因此信息可能已过时,但在当前v6-2017中似乎也有Newlib-nano支持。

它删除了在C89之后添加的一些在基于MCU的嵌入式系统中很少使用的功能,简化了复杂功能,如格式化I / O,并从非宽字符特定功能中删除了广泛的字符支持。对于这个问题,关键是默认构建已经过大小优化(-Os)。