1

我正在构建一个以 Newlib 2.5.0 作为目标 C 库的 arm-eabi-gcc 工具链。

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

默认构建会生成一个strstr代码大小超过 1KB 的版本。

4

2 回答 2

3

Newlib 中有脂肪可以用 Newlib-nano 解决,它已经是 GCC ARM Embedded 的一部分,正如这里所讨论的(注意这篇文章是从 2014 年开始的,所以信息可能已经过时了,但似乎有 Newlib-当前v6-2017中也支持 nano)。

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

于 2017-04-10T16:16:14.000 回答
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_SPEEDor的实例__OPTIMIZE_SIZE__。基于快速 grep,这两个标志几乎相同。唯一的区别是该printf系列中的一种情况,如果为 传递了一个空指针%s,那么前者会将其转换为,(null)但后者会继续向前,可能会导致崩溃。

于 2017-04-10T10:18:45.650 回答