LD 在使用 ARM gcc 时给出奇怪的错误并且找不到现有文件

LD giving strange error and not finding an existing file when using ARM gcc

这是我的 Makefile 执行的命令行:

arm-none-eabi-gcc bubblesort.c -O0 -mcpu=cortex-m0 -mthumb -Wl, -T ../boot_and_link/linker.ld -l ../boot_and_link/startup.o   

据我所知,它应该为 CortexM0 编译 bubblesort.c 然后 linker 你应该使用 linker.ld 作为 linker 脚本并且还应该link startup.o 编译输出 bubblesort.c.

我收到两个错误:

/usr/lib/gcc/arm-none-eabi/4.8/../../../arm-none-eabi/bin/ld: cannot find : No such file or directory
/usr/lib/gcc/arm-none-eabi/4.8/../../../arm-none-eabi/bin/ld: cannot find -l../boot_and_link/startup.o

第一个没看懂。 ld 告诉我它找不到:这没有意义,让我觉得我的 linker 脚本有错误。

第二个错误很奇怪,因为我的 linker 文件位于完全相同的位置,它找到了它,是的,我已经检查了文件的名称,它们是相同的。

以防万一我把我的 linker 脚本包括在内,因为它很短而且我自己写的(第一次)并且我正在学习如何编写它们。

MEMORY
{
  rom   :       ORIGIN = 0x00000000,    LENGTH = 8K
  ram   :       ORIGIN = 0x20004000,    LENGTH = 16K
  stack :       ORIGIN = 0x20003FFF,    LENGTH = 16K
}

SECTIONS
{
    .nvic_vector : { } >rom /*The vector table that is initialized in c code*/

    .text : 
    {
        *(.text)      
        /*_DATAI_BEGIN = .;*/
    } >rom

    .data : 
    {
    _DATA_LOAD = LOADADDR(.data);   /*The absolute address of the data section*/
        _DATA_BEGIN = .;        /*From where to begin the copy to RAM*/
        *(.data)      
        . = ALIGN(4);           /*Make sure the byte boundary is correctly aligned*/
        _DATA_END = .;          /*Where to end the copy to RAM*/
    } >ram AT >rom

    .bss :
    {
        _BSS_BEGIN = .;         /* Zero-filled run time allocate data memory */
        *(.bss)       
        _BSS_END = .;
    } > ram 

    .heap :
    {
        _HEAP = .;
    } > ram

    .stack :
    {
    . += LENGTH(stack);
    . = ALIGN(4);
        _STACKTOP = .;  /* The top of the stack is the last available section of memory*/
    } >stack

}  

如有任何帮助,我们将不胜感激。

你可以把编译和链接分开,这样更容易看

  • 编译器和链接器通用的标志
  • 仅为其中之一的标志

如果您有 main.cstartup.c,编译应该如下所示:

arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -Os -std=gnu99 -o startup.o -c startup.c

arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -Os -std=gnu99 -o main.o -c main.c

至于链接

arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -nostartfiles -T rom.ld -o main.elf startup.o main.o -lc -lm


如果你想在一行中:

arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -Os -std=gnu99 -nostartfiles -T rom.ld -o main.elf startup.c main.c

所以主要问题是这一行:

arm-none-eabi-gcc bubblesort.c -O0 -mcpu=cortex-m0 -mthumb -Wl, -T ../boot_and_link/linker.ld -l ../boot_and_link/startup.o   

这是错误的,因为 -l 开关用于 link 库,而不是仅仅指向另一个目标文件,这是我的意图。您需要将 linking 的所有文件指定为 linker 的普通普通参数。我最终这样做的方法很简单(采纳 Beryllium 的建议)将编译和 linking 分成两个步骤并使用两个单独的调用。以下是我的 makefile 运行 的命令:

<-------------------- Compiling C Source Files -------------------->                                                                                                                                                      
arm-none-eabi-gcc -O0 -c -mcpu=cortex-m0 -mthumb -g bubblesort.c -o bubblesort.o                                                                                                                                          
<-------------------- Linking files -------------------->                                                                                                                                                                 
arm-none-eabi-ld bubblesort.o ../boot_and_link/startup.o -nostartfiles -T ../boot_and_link/linker.ld -o bubblesort.elf 

这有效。

PD:第一个错误(它说找不到:没有这样的文件或目录)必须在 gcc 调用中使用不正确的间距。但是,当我更改它时,我不记得它在哪里。