这是我的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
}
任何帮助将不胜感激。
答案 0 :(得分:0)
您可以将编辑和链接分开,然后更容易看到
如果您有main.c
和startup.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调用中使用不正确的间距。但是,当我改变它时,我无法回想起它的位置。