x86, long double在内存中为96位, 而在寄存器中只有80位(x86支持80位浮点寄存器)
int gdbarch_convert_register_p(struct gdbarch *gdbarch, int reg)
若返回1, 则表示“以上”案例发生.
------------------------------------------------------------------
至此: gdb包含两种“不一致”的转换
* 同样类型的value在register中的表示和在内存中的表示不一致
* 区别对待pointer和address. pointer是code space的地址.
-------------------------------------------------------------------------------
1. 真实物理寄存器
2. 伪寄存器: 实际上不存在, 但是客观对应有.
3. 物理寄存器+伪寄存器=Cooked寄存器(Set)
函数很变量定义了寄存器机构. (寄存器结构=函数+变量)
结构函数: read_pc, write_pc:
如果pc是一个物理寄存器, 那么也可以通过标准过程访问register缓存得到(pc).
----------------------------------------------------------------------------------------------------------------------------------------------------------------
riscv-tdep.c (target dependent)
gdbarch_alloc
and the new target object is being populated later.
And the main work lies here.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
GDB为目标机型设置的模型如此简单。
GDB总是假设目标机器有一组寄存器以及一块内存.
每个寄存器可以有不同的尺寸.
GDB必须手动关联寄存器和其名字.
(GDB可以处理小端,大端,以及双端系统)
地址不等同于指针.
指针:结构指令是32位的,4字节对齐,因此指针指向的地址低两位总是0. 若使用16位地址,则只能访问64k(2^16)的代码地址空间. 所以我们可以将地址先向右移动两位(低两位总是0), 在使用的时候左移2位,这样我们就能表示256kb的(代码)地址空间。 (code space)
*地址空间是否相同?
---------------------------------------------------
THIS栈:当前检查的栈
NEXT栈: 被THIS栈调用的栈
PREVIOUS栈: etc.
栈总是一个接一个的. (no space between)
sentinel frame(#-1)
the innermost frame do not hold a NEXT
prologue: 进入函数之后进行现场保护(类似pushad这样的行为)
function prologue
------------------------------------
gcc -S test.c
sp 栈顶指针 riscv: sp
fp 栈底指针 riscv: s0
通常都要保存s0和ra到栈上. (有时候不会有额外函数调用, 所以ra也可以不保存)
----------------------------------------
https://en.wikipedia.org/wiki/DWARF
DWARF
Debugging With Attributed Record Format (was later proposed)
medieval fantasy of complement to ELF(Executable and Linkable Format)