0

我一直致力于将一个项目从在 Win10 机器上运行的 Visual Studio/VisualGDB 移植到在 Ubuntu 16.04 上运行的 CMake/GCC 构建系统。完整的构建最终将在 Cortex-M4 上运行。

在这个过程中,我遇到了一个链接器问题,其中 libc 中的多个引用未定义

{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-sbrkr.o): In function `_sbrk_r':
    sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-writer.o): In function `_write_r':
    writer.c:(.text._write_r+0x10): undefined reference to `_write'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-closer.o): In function `_close_r':
    closer.c:(.text._close_r+0xc): undefined reference to `_close'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-fstatr.o): In function `_fstat_r':
    fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-isattyr.o): In function `_isatty_r':
    isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-lseekr.o): In function `_lseek_r':
    lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-readr.o): In function `_read_r':
    readr.c:(.text._read_r+0x10): undefined reference to `_read'

我使用以下标志:

标志:

-fdata-sections -ffunction-sections -std=gnu99 -mabi=aapcs -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16

ASM_FLAGS:

-x assembler-with-cpp

LDFLAGS:

-static -Wl,--gc-sections -mabi=aapcs -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 --specs=nano.specs -lc -lnosys

这些标志来自原始的 VisualGDB-build 构建没有任何问题。

我发现当使用--specs=nosys.specs代替时nano.specs,构建完成,但是在目标上运行时,内部某处触发了硬故障__libc_init_array()

我怀疑这是由于 和 之间的差异nano.specsnosys.specs但是由于上面提到的链接器问题,我无法验证这一点。我尝试了这种组合<...> --specs=nono.specs --specs=nosys.specs -lc -lnosys,没有任何运气。

有谁知道为什么这适用于 VisualGDB 而不是 CMake/GCC?据我了解,VisualGDB 仍然使用arm-none-eabi吗?这当然是我使用的相同工具链(测试版本 4.9.3 和 6.3.1)

4

0 回答 0