[C]Debug命令

生成map文件(列出所有变量,函数所属的段及地址)
gcc 1.c -Wl, -Map=out.map

objdump -d 也可以

gdb可以通过调试打印相应的变量/函数
make VERBOSE=1

make all VERBOSE=1可以打印详细编译信息,

size可以用来查看elf/.a/.so text/data/bss大小, 注意rodata会被计算在text中

readelf -t / -S查看section size,地址等情况

[Linux]嵌入式系统中栈的地址空间传入

根据系统的memory mapping,链接脚本中规定有栈顶的地址(栈地址变换为从上往下,从大到小,因此规定栈顶)
  __stack_top = ORIGIN(SRAM) + LENGTH(SRAM); //在此规定从ram胡最后开始为栈顶
__stack_bottom = __stack_top – __stack_size
也可以动态计算栈地址
.stack (NOLOAD) : {
. = ALIGN(4) ;
__irq_stack_start = .;
. += 1024;
__irq_stack = .;
__stack_start = .;
__stack_size = __RAM_END – ABSOLUTE(.) – 4;
. += __stack_size;
__stack = .;
} > REGION_BSS

在start.S中,需要拿到栈顶地址
.import __stack_top
会将__stack_top这个变量的地址load到cpu的sp寄存器,从而规定其初始地址
后续栈的使用由程序调用过程决定。这可以理解成编译器维护?