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.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
所以主要问题是这一行:
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 调用中使用不正确的间距。但是,当我更改它时,我不记得它在哪里。
这是我的 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.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
所以主要问题是这一行:
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 调用中使用不正确的间距。但是,当我更改它时,我不记得它在哪里。