2017-04-10 68 views
1

我正在用Newlib 2.5.0构建一个arm-eabi-gcc工具链作为目标C库。如何构建尺寸优化的newlib?

目标嵌入式系统倾向于更小的代码大小上执行速度。如何配置newlib以支持较小的代码大小?

默认的构建不一样的东西产生的一个版本strstr即超过1KB的代码大小。

+1

你如何确定'strstr'的​​大小?如果真的那么大,我会感到惊讶。例如,目标文件的大小不是代码大小的度量。 – Clifford

+0

请注意,有时使用-O2进行编译会生成比-Os更小的二进制文件,只要尝试使用不同的编译器选项,直到获得所需内容,或者实现您可能想要使用的超级函数,就可以编写一个特定的函数可能要小得多。 –

+0

@Clifford在最终可执行文件的链接器映射中查找 –

回答

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__。基于快速grep,这两个标志几乎完全相同。唯一的区别是在printf家庭,如果一个空指针传递的%s,那么前者将它提前在翻译成(null)但后者公牛,可能导致飞机坠毁的情况。

1

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

它消除C89后增加了一些功能,很少在基于MCU的嵌入式系统中使用的,简化了复杂的功能,例如格式化的I/O,并删除从非宽字符特定功能宽字符支持。关键问题在于这个问题,默认版本已经优化了尺寸(-Os)。

+0

newlib-nano-1和newlib-nano-2的git repos似乎不太活跃;官方的“6-2017-Q1-更新”源代码包“newlib”的部分比任何这些回购后来过时的文件,所以我想他们有它自己的私人(无版本?)叉 –

+0

@MM:是我的状态也不太清楚,v6-2107发行说明给出了Newlib和Newlib-nano(git:// sourceware)的相同git参考。org/git/newlib-cygwin.git commit e046e4de145009ae6baf27f8e0553a666e6a8d3d)表明nano可能被纳入主项目。如果您使用ARM的预建工具链,也许不是问题,但我明白您可能不想这样做。 – Clifford

+0

我发现了一篇关于用nano构建工具链的文章。 https://istarc.wordpress.com/2014/07/21/stm32f4-build-your-toolchain-from-scratch/(从2014年开始,尽管还有一个单独的回购)。 – Clifford