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

时间:2015-03-10 13:03:23

标签: c gcc linker arm

这是我的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.ld作为链接描述文件,并且还应该将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告诉我它找不到:哪个没有意义,让我觉得我的链接器脚本中有错误。

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

以防万一我的链接器脚本因为它很短而且我自己编写(第一次)并且我正在学习如何编写它们。

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

}  

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以将编辑和链接分开,然后更容易看到

  • 标记编译器和链接器的共同标记
  • 仅针对其中一个
  • 标记

如果您有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

答案 1 :(得分:0)

所以主要问题是这一行:

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切换用于链接库而不是仅指向另一个目标文件,这是我的意图。您需要指定所有要链接的文件作为链接器的普通常规参数。我最终做到这一点的方式很简单(采用Beryllium的建议)将编译和链接分成两个步骤并使用两个单独的调用。以下是我的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调用中使用不正确的间距。但是,当我改变它时,我无法回想起它的位置。