Как исправить положение стека arm-none-eabi-g cc? - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь создать голый металлический код, используя стандартную библиотеку lib C.

Я начал с кода ассемблера

.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 .

Я нашел пример кода, использующего символ _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>)

Вот мои командные строки:

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

Есть ли возможность узнать правильные символы, чтобы найти стек?

...