如何纠正堆栈位置arm none eabi gcc?

如何纠正堆栈位置arm none eabi gcc?,gcc,arm,bare-metal,linker-scripts,cortex-a,Gcc,Arm,Bare Metal,Linker Scripts,Cortex A,我尝试使用标准的libc创建一个裸机代码 我从一个汇编代码开始 .section .isr_vector .global _Reset _Reset: B Reset_Handler /* Reset */ B . /* Undefined */ B . /* SWI */ B . /* Prefetch Abort */ B . /* Data Abort

我尝试使用标准的libc创建一个裸机代码

我从一个汇编代码开始

.section .isr_vector 
.global _Reset
_Reset:
    B Reset_Handler /* Reset */
    B .             /* Undefined */
    B .             /* SWI */
    B .             /* Prefetch Abort */ 
    B .             /* Data Abort */
    B .             /* reserved */
    B .             /* IRQ */
    B .             /* FIQ */  

.global Reset_Handler
 Reset_Handler:
    ldr sp, =_estack
    mov fp, #0

    // Branch to C code  
    BL _start
    B .
我找到了使用symbol
\u estack
定位堆栈的代码示例

在链接器文件中,我放入:

ENTRY(_Reset)

MEMORY
{
    RAM (xrw) : ORIGIN = 0x00000000, LENGTH = 512M
}
/* define stack size and heap size here */
stack_size = 4*1024;
heap_size = 128*1024; 
/* define beginning and ending of stack */
_estack  = ORIGIN(RAM)+LENGTH(RAM);
_sstack = _estack - stack_size;
使用GDB检查_estack是否位于正确的位置0x20000000

当我跟踪代码并输入_start函数时,$sp将更改为0x80000

这是通过从没有符号的内存位置获取信息来完成的:

-exec disas _start
Dump of assembler code for function _start:
   0x00000084 <+0>: ldr r3, [pc, #84]   ; (0xdc <_start+88>)
   0x00000086 <+2>: cmp r3, #0
   0x00000088 <+4>: it  eq
   0x0000008a <+6>: ldreq   r3, [pc, #76]   ; (0xd8 <_start+84>)

是否有可能知道用于定位堆栈的正确符号?

您没有显示
main()
的功能。有一些标准的“C”功能需要在调用之前进行设置。我希望您没有使用argc和argv。例如,某些数学运算(如除法)可能会调用编译器帮助程序例程。通常这是“libgcc”,可以有假设;就像您需要将initial“.data”部分复制到内存中一样。裸机和标准C库在定义上并不一致,大多数C库调用都会导致系统调用,就像在操作系统中一样,这意味着不是裸机。那么,您使用的是什么C库?您如何处理系统调用?如果特定C库需要引导,您如何处理引导?您使用的是什么MCU?我没有介绍main的功能,因为问题是在进入main之前。C编译器生成的第一个函数是_start。它在进入void main(void)之前准备代码。MCU是Cortex-A9。@marcoDiroccho那是CPU,不是MCU。你用什么微控制器?
arm-none-eabi-gcc -ffreestanding -specs=nano.specs -specs=nosys.specs -Wall -O0 -g3  -Wextra -std=c99 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -Iinclude -Llib src/main.c src/start.s -o bin/main   -Xlinker -static -TSECTIONS.ld
arm-none-eabi-nm bin/main > bin/symbols.txt
arm-none-eabi-objdump --disassemble-all bin/main > bin/asm.S
arm-none-eabi-objdump -s  bin/main > bin/MixedCASM.txt