为什么arm-none-eabi-gcc不能搜索我的自定义_start符号?

时间:2015-10-22 09:22:39

标签: c gcc arm

我正在使用“ -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]

1 个答案:

答案 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)之外,没有printfsetjmp等标准C函数可用。

阅读C99标准n1256草案。它解释了§5.1.2.1

中的独立意味着什么