为什么不胳膊
我正在用“ -nostdlib ”编译下面的代码。 我的理解是arm-none-eabi-gcc不会在“crt0.o”中使用_start,但它会使用用户定义的_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 /嵌入式4_9分支修订版224288]
编译并链接到arm-none-eabi-gcc -v -Wall -Werror -O2
....以了解编译器正在做什么(以及它使用的是哪个crt0;该crt0
可能有一个_start
调用你的main
,也是_start
可能是您的链接器的默认入口点)
注意-nostdlib
与C标准库(缺少)有关; 也许你想在一个独立的环境中编译(见这个),然后使用-ffreestanding
(在这种情况下main
没有特别的含义,你需要定义你的启动函数,没有像malloc
或printf
这样的标准C函数是除了可能的setjmp
)。
阅读C99标准n1256草案。 它解释了第5.1.2.1节中的独立手段
链接地址: http://www.djcxy.com/p/86925.html上一篇: Why doesn't arm
下一篇: c++