为什么不胳膊

我正在用“ -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没有特别的含义,你需要定义你的启动函数,没有像mallocprintf这样的标准C函数是除了可能的setjmp )。

阅读C99标准n1256草案。 它解释了第5.1.2.1节中的独立手段

链接地址: http://www.djcxy.com/p/86925.html

上一篇: Why doesn't arm

下一篇: c++