Supper Thomas
Supper Thomas
-fno-omit-frame-pointer 不优化帧指针
默认情况下,编译器可能会优化掉帧指针(-fomit-frame-pointer),以节省寄存器资源并提高性能。但这样会导致帧指针链表不完整,无法正确回溯栈帧。
FP是S0

s0会保存帧指针的地址(调用者)
long的字节长度有可能是4个字节,有可能是8个字节。
由于进函数的时候,sp会变化,同时,SP会保存固定长度的帧,例如是8个word,8个寄存器,则fp就是保存sp变化前的数值; ``` 8000b0c2 : 8000b0c2: 1101 addi sp,sp,-32 8000b0c4: ce06 sw ra,28(sp) 8000b0c6: cc22 sw s0,24(sp) 8000b0c8: ca26 sw s1,20(sp) 8000b0ca: c84a sw s2,16(sp) 8000b0cc: c64e sw s3,12(sp) 8000b0ce: c452...
ra, so 相对于原来的SP的地址是不变的,默认是8
-fno-omit-frame-pointer 是一个编译器选项,其中 omit 是英语单词,意思是“省略”或“忽略”。这个选项的作用是告诉编译器不要省略帧指针。
``` extern char *__text_start__; extern char *__text_end__; __attribute__((always_inline)) static inline void *backtrace_get_sp(void) { void *sp; __asm__ volatile("mv %0, sp\n" : "=r"(sp)); return sp; } __attribute__((always_inline)) static inline void *backtrace_get_pc(void) {...