我正在为STM32F103进行裸机嵌入式项目,并且正在使用GNU ARM Embedded version 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编译的?
那么我该如何运作呢?我想我可以尝试compiling newlib-nano myself并添加必要的标志(并更改工具以使用-gcc-ar等),但是我想像/希望有人已经这样做了?我的google-fu不足以找到任何有用的信息。
最佳答案
nosys.specs指定与-lnosys链接,应为_fstat和_isatty以及其他标准/ posix函数提供存根实现。
从gcc manual link options:
因此,如果将--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
。关于c++ - 将LTO与arm-none-eabi和newlib-nano一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50716121/