我正在用“-nostdlib”编译下面的代码。我的理解是arm none eabi gcc不会在“crt0.o”中使用“u start”,但它将使用用户定义的“u start”。为此,我希望创建一个start.S文件,并放置开始符号。
但是如果我编译下面显示的代码时没有从我这边定义的开始符号,我就不会收到任何警告。我期待着“警告:找不到入口符号”开始
问题:
1)为什么我没有收到警告?海合会从哪里得到的开始符号?
2)如果gcc从某个地方得到了一个文件的开始符号,你能告诉我如何让gcc使用从我的开始文件开始的开始符号吗?
$cat测试.c
int main()
{
volatile int i=0;
i = i+1;
return 0;
}
$cat链接器.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—版本
arm none eabi gcc(arm嵌入式处理器的GNU工具)4.9.3 20150529>(发行版)[arm/Embedded-4_9-branch revision 224288]
最佳答案
编译并链接到arm-none-eabi-gcc -v -Wall -Werror -O2
。。。。要了解编译器正在做什么(以及它正在使用的crt0是什么;crt0
可能有一个_start
调用您的main
,而且_start
可能是链接器的默认入口点)
请注意,-nostdlib
与(缺少)C standard library有关;也许您希望在独立环境中编译(请参见this),然后use -ffreestanding
(在这种情况下,main
没有特殊意义,您需要定义您的启动函数,并且除了malloc
之外,没有像printf
或setjmp
这样的标准C函数可用)。
阅读C99标准草案。它解释了第5.1.2.1节中独立式的含义
关于c - 为什么arm-none-eabi-gcc不搜索我的自定义_start符号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33277565/