我正在使用“ -nostdlib ”编译以下代码。我的理解是arm-none-eabi-gcc不会使用 _start in“crt0.o”,但它会使用用户定义的_start 。为此,我希望创建一个start.S文件并放入_start符号。
但如果我编译下面显示的代码而没有从我这边定义的_start符号,我没有得到任何警告。我期待“警告:找不到输入符号_start;”
问题:
1)为什么我没有得到警告? GCC从哪里获得_start符号?
2)如果gcc从某个地方的某个文件中获取了_start符号,你能让我知道如何让GCC使用我的start.S文件中的_start吗?
$ cat test.c
int main()
{
volatile int i=0;
i = i+1;
return 0;
}
$ cat linker.ld
MEMORY
{
ram : ORIGIN = 0x8000, LENGTH = 20K
}
SECTIONS
{
.text : { *(.text*) } > ram
.bss : { *(.bss*) } > ram
}
$ arm-none-eabi-gcc -Wall -Werror -O2 -mfpu = neon-vfpv4 -mfloat-abi = hard -march = armv7-a -mtune = cortex-a7 -nostdlib -T linker.ld test。 c -o test.o
$ arm-none-eabi-gcc --version
arm-none-eabi-gcc(适用于ARM嵌入式处理器的GNU工具)4.9.3 20150529>(发布)[ARM / embedded-4_9-branch revision 224288]
答案 0 :(得分:3)
使用arm-none-eabi-gcc -v -Wall -Werror -O2
编译并链接 ....以了解编译器正在做什么(以及它正在使用哪个crt0; crt0
可能有_start
调用main
,_start
可能是您的链接器的默认入口点。
请注意-nostdlib
与(缺少)C standard library有关;也许你想在一个独立的环境中编译(见this),然后use -ffreestanding
(在这种情况下main
没有特别的意义,你需要定义你的起始函数[s],除了malloc
)之外,没有printf
或setjmp
等标准C函数可用。
阅读C99标准n1256草案。它解释了§5.1.2.1
中的独立意味着什么