将 LTO 与 arm-none-eabi 和 newlib-nano 一起使用



我正在为STM32F103开发一个裸机嵌入式项目,我正在使用GNU ARM嵌入式版本7-2017-q4-major工具链。我目前正在通过GNU ARM Eclipse进行编译。

我正处于需要开始优化项目以提高速度的地步,作为第一件事,我当然尝试打开所有优化器标志。其他一切正常,但是当我尝试使用-flto打开链接时间优化时,我在最后一步收到链接器错误:

Invoking: Cross ARM C++ Linker
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -O3 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -Wall -Wextra  -g3 -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"../ldscripts" -Wl,-Map,"Project.map" -Xlinker --cref --specs=nano.specs -o "Project.elf"  ./tiny-mt/tinymt/tinymt32.o  ... .o   
/Users/me/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/thumb/v7-m/libg_nano.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
/Users/me/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/thumb/v7-m/libg_nano.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
collect2: error: ld returned 1 exit status
make: *** [Project.elf] Error 1

这显然是由于newlib-nano没有用LTO编译?

那么我该如何让它工作呢?我想我可以尝试自己编译 newlib-nano 并添加必要的标志(并更改工具以使用 -gcc-ar 等(,但我想象/希望有人已经这样做了?我的谷歌富不足以找到任何有用的东西。

nosys.specs指定链接-lnosys应该为_fstat和_isatty以及其他标准/POSIX函数提供存根实现。
从 gcc 手动链接选项:

-llibrary在
链接时搜索名为library的库。在
命令中编写此选项的位置会有所不同;链接器按指定的顺序搜索和处理库和对象文件。因此,'foo.o -lz bar.o' 在文件 foo.o 之后但在 bar.o 之前搜索库 'z'。如果 bar.o 引用 'z' 中的函数,则可能不会加载这些函数。

因此,如果您--specs=nano.specs移动到 link 命令的末尾,您的源代码应与-lnosys链接并正确使用 libnosys 库中的_isatty_fstat实现。喜欢这个:

arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -O3 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -Wall -Wextra  -g3 -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"../ldscripts" -Wl,-Map,"Project.map" -Xlinker --cref -o "Project.elf"  ./tiny-mt/tinymt/tinymt32.o  ... .o --specs=nano.specs

我可以猜到没有LTO编译的newlib-nano与它无关。我正在使用带有 newlib-nano 的 LTO 的多个项目,它们工作得很好。通常 LTO 工作得非常好,删除了抽象函数层,是可预测的,优化非常好,但我只有 2 年的使用它经验。如果我真的需要速度(并且可以忍受非标准行为(,我会使用-Ofast -flto -fno-fat-lto-objects

相关内容

  • 没有找到相关文章

最新更新