【问题标题】:Cortex-M3 (EFM32GG) - ARM-GCC Linker Flags for Newlib-NanoCortex-M3 (EFM32GG) - Newlib-Nano 的 ARM-GCC 链接器标志
【发布时间】:2020-10-20 14:00:32
【问题描述】:

我分析了一个由 Simplicity Studio 生成的项目(Silicon Labs 的 Eclipse IDE 变体,用于他们的微控制器)。

我为基于 arm-none-eabi-gcc 工具链的 ASM/C/C++ 项目使用了默认设置。

对于 G++-Linker-Flags,他们做了一些在我看来非常奇怪的事情:他们打算链接 newlib-nano(即标准库的小版本)。

但是,通常您需要决定是否打算使用重定向并因此链接到 nosys.specs,这也会使您的二进制文件更大,或者是 nano.specs 的简约版本。

但是,他们确实列出了这两个选项,这对我来说没有意义。所以我检查了另一个项目设置(这是在 STM32 的 CM3 上),他们显然也是这样做的。这是为什么呢?

如果我不打算使用重定向(例如文件系统、printf/_write 等),我是否需要列出 nosys.specs?

其他问题:这些标志的顺序是否重要,或者这只是您要添加的所有选项的列表?

-g3 -gdwarf-2 -mcpu=cortex-m3 -mthumb -T "${BuildArtifactFileBaseName}.ld" --specs=nosys.specs -Xlinker --gc-sections -Xlinker -Map="${BuildArtifactFileBaseName}.map" --specs=nano.specs

【问题讨论】:

    标签: gcc linker cortex-m3


    【解决方案1】:

    但是,他们确实列出了这两个选项,这对我来说没有意义。

    这很有意义。如果没有 nosys,您需要提供大量函数的定义或使用其他库,例如 semihostig。

    简单例子:(main.c 就是 hello world 程序)

    piotr@PiotrLaptop02:~$ arm-none-eabi-gcc --specs=nano.specs main.c
    /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc_nano.a(lib_a-exit.o): in function `exit':
    /build/newlib-CVVEyx/newlib-3.3.0/build_nano/arm-none-eabi/newlib/libc/stdlib/../../../../../newlib/libc/stdlib/exit.c:64: undefined reference to `_exit'
    /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc_nano.a(lib_a-sbrkr.o): in function `_sbrk_r':
    /build/newlib-CVVEyx/newlib-3.3.0/build_nano/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/sbrkr.c:51: undefined reference to `_sbrk'
    /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc_nano.a(lib_a-writer.o): in function `_write_r':
    /build/newlib-CVVEyx/newlib-3.3.0/build_nano/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/writer.c:49: undefined reference to `_write'
    /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc_nano.a(lib_a-closer.o): in function `_close_r':
    /build/newlib-CVVEyx/newlib-3.3.0/build_nano/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/closer.c:47: undefined reference to `_close'
    /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc_nano.a(lib_a-fstatr.o): in function `_fstat_r':
    /build/newlib-CVVEyx/newlib-3.3.0/build_nano/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/fstatr.c:55: undefined reference to `_fstat'
    /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc_nano.a(lib_a-isattyr.o): in function `_isatty_r':
    /build/newlib-CVVEyx/newlib-3.3.0/build_nano/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/isattyr.c:52: undefined reference to `_isatty'
    /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc_nano.a(lib_a-lseekr.o): in function `_lseek_r':
    /build/newlib-CVVEyx/newlib-3.3.0/build_nano/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/lseekr.c:49: undefined reference to `_lseek'
    /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/9.2.1/../../../arm-none-eabi/lib/libc_nano.a(lib_a-readr.o): in function `_read_r':
    /build/newlib-CVVEyx/newlib-3.3.0/build_nano/arm-none-eabi/newlib/libc/reent/../../../../../newlib/libc/reent/readr.c:49: undefined reference to `_read'
    collect2: error: ld returned 1 exit status
    piotr@PiotrLaptop02:~$ arm-none-eabi-gcc --specs=nano.specs --specs=nosys.specs main.c
    piotr@PiotrLaptop02:~$  
    

    如您所见,没有 nosys 它不会链接。

    【讨论】:

    • 嗨@P__J__,感谢您的回答。所以在嵌入式目标上,像 exit/_exit 这样的调用对我来说很有意义,我声明它们,因为这样我可以重定向例如退出到优雅芯片重置等。所以,如果我重载它们,这可以吗?因此只链接到 nano.specs?
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2018-10-13
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多