【问题标题】:How do I build newlib for size optimization?如何构建 newlib 以优化大小?
【发布时间】:2017-09-05 08:17:33
【问题描述】:

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

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

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

【问题讨论】:

  • 您如何确定strstr 的大小?如果它真的那么大,我会感到惊讶。例如,目标文件的大小不能衡量代码大小。
  • 请注意,有时使用 -O2 编译会产生比 -Os 更小的二进制文件,只需尝试不同的编译器选项,直到你得到你想要的,和/或实现你可能想要使用的超级通用函数,你可以写一个可能要小得多的特定的。
  • @Clifford 查看最终可执行文件的链接器映射
  • @M.M :好吧,我猜它有那么大!在问题中指定 Newlib 的版本可能很有用。如果您查看源 strstr.c,则有两种实现; #if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) 启用的更简单/更小。请注意,对于长字符串,它也会显着变慢,但如果您担心代码大小,也许也可以避免使用长字符串?

标签: arm embedded gnu-toolchain newlib


【解决方案1】:

像这样配置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),但后者会继续前进,可能会导致崩溃。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • newlib-nano-1 和 newlib-nano-2 的 git repos 似乎不太活跃;官方“6-2017-q1-update”源包中的“newlib”部分的文件比这些存储库中的任何一个都晚,所以我猜他们有自己的私有(未版本化?)分支
    • @MM :是的,我也不清楚状态,v6-2107 发行说明为 Newlib 和 Newlib-nano 提供了相同的 git 参考(git://sourceware.org/git/ newlib-cygwin.git commit e046e4de145009ae6baf27f8e0553a666e6a8d3d) 表明 nano 可能已被吸收到主项目中。如果您使用的是 ARM 的预构建工具链,这可能不是问题,但我很感激您可能不想这样做。
    • 我找到了一篇关于使用 nano 构建工具链的文章。 istarc.wordpress.com/2014/07/21/…(同样是从 2014 年开始,还有一个单独的仓库)。
    • 好的,该链接还引用了相同的 newlib-nano-2 存储库(它是一个分支,但未修改)。下次有时间时,我将尝试从 v6-2017 批量 blob 构建 nano。 (实际上,检查这与我为 binutils 和 gcc 所做的区别可能会很有趣——我从它们各自的站点使用它们,而不是 ARM blob)
    猜你喜欢
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多