[转]GDBINT gdb internal Notes …

Target Architecture Definition
一种CPU的体系结构,是一个target architecture. GDB使用 struct gdbarch *来描述一种CPU的体系结构, 这个C结构及其代码,由脚本gdbarch.sh来产生.
Operating System ABI Variant Handling
OS的ABI主要影响target defination的两个部分:sniffers and handlers.  sniffers用 于确定一种binfmt的文件属于那种BFD architecture/flavour 组合. architecture可以是通配也可以是针对特定architecture, 前者叫做genaric 后者叫specific. 一种specific的match会覆盖通配匹配.可能存在一多个OS匹配使用同一种binfmt,所以OS ABI framework为ELF提供了一个generic sniffer:检查ELF的EI_OSABI 域(和其他的特征域).
handler  用于适配gdbarch structure的OS ABI特性. 可能一个OS只提供一种handler,为每个BFD architecture公用.这里给出一个OS ABI 的overview(具体参考GDBINI)
defs.h :OS ABI变种的定义 GDB_OSABI_UNINITIALIZED  : Used for struct gdbarch_info if ABI is still uninitialized.

GDB_OSABI_UNKNOWN: The ABI of the inferior is unknown. The default gdbarch settings for the architecture will be used.

GDB_OSABI_SVR4:UNIX System V Release 4.

GDB_OSABI_LINUX    GDB_OSABI_WINCE    GDB_OSABI_GO32(DJGPP)

OS ABI framework 接口函数:
const char *gdbarch_osabi_name (enum gdb_osabi osabi)

void gdbarch_register_osabi (...)

void gdbarch_register_osabi_sniffer (.....)

enum gdb_osabi gdbarch_lookup_osabi (bfd *abfd)

void  gdbarch_init_osabi  (struct gdbarch info info, struct gdbarch *gdbarch, enum gdb_osabi osabi)

void generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj)


Initializing a New Architecture

   每个gdbarch对应一个BFD architecture,并有一个常量bfd_arch_xxx. 通过函数register_gdbarch_init 注册gdbarch ,通常在 _initialize_filename 中调用注册函数,这样就加入了GDB启动流程. (细节请参考GDBINT)


Registers and Memory

GDB 采用的target machine模型是十分简单的:GDB 假定一种机器包含一组寄存器和一块内存,每个寄存器有一定的大小.GDB把寄存器的一切封装到像 gdbarch_register_name 这样的一系列函数中,继而做到正确处理.GDB 支持各种endian的机器:big-endian, little-endian, bi-endian(request commnet).


Pointers Are Not Always Addresses

有些特殊的平台,同一个word,其用于code pointer和datapointe的时候有不同的解释,比如D10V,同样是0xC020,当用于数据地址的时候代表地址0xC020,但是用于代码地址的时候,需要转换一下,代表0x30080(详 见D10V或者GDBINT). 所以在GDB中,对于address和pointer是区分对待的.address代表字节地址,而pointer指向特定的数据类型:data or code or other...., pointer需要转换以下才是address,大部分平台是相等的值,部分平台需要移位等操作. 但是大部分平台上,这两者是等价的,以下函数用于转换pointer和address: (详见GDBINT)

CORE_ADDR extract_typed_address (void *buf, struct type *type)

CORE_ADDR store_typed_address (void *buf, struct type *type, CORE_ADDR addr)

CORE_ADDR value_as_address (struct value *val)

CORE_ADDR value_from_pointer (struct type *type, CORE_ADDR addr)

CORE_ADDR gdbarch_pointer_to_address (struct gdbarch *current_gdbarch, struct type *type, char *buf)

void gdbarch_address_to_pointer (struct gdbarch *current_gdbarch, struct type *type, char *buf, CORE_ADDR addr)


Address Classes

当不同种类的address可以而从调试信息中(如DWARF2)获取时, 应该定义以下宏来支持GDB认知这些区别,或者给GDB user提供类型信息.

int gdbarch_address_class_type_flags (struct gdbarch *current_gdbarch, int byte_size, int dwarf2_addr_class)

char  *gdbarch_address_class_type_flags_to_name  (struct gdbarch *current_gdbarch, int type_flags)
int  gdbarch_address_class_name_to_type_flags  (struct gdbarch *current_gdbarch, int name, int *var{type_flags_ptr})
祥见GDBINT.

 

Raw and Virtual Register Representations

注:这里描述的内容已经过时,请参考下一节.

一些体系结构在寄存器和内存中对一个值的表达方式是不同的.用GDB的术语来定义,在寄存器中的表达方式叫raw representation,在内存中的表达方式叫做virtual representation.GDB用struct value objects来表示这种差异.

在几乎所有的体系上,数据类型的virtual和raw representations 是一致的.但是有例外,如:

  x86 提示支持一种80-bit long double type,但是存储到内存时,占用12个byte:浮点数占用头是个byte,后两个byte没有用(对齐要求),因此,x86 80-bit floating-point type 就是raw representation,twelve-byte loosely-packed arrangement 是virtual representation.

  另外,一些64-bit MIPS,使用64-bit的寄存器当作32-bit registers使用,高位是垃圾数据.所以,64-bit form, 带有垃圾数据的这种表达形式是raw representation, 32-bit 形式是virtual representation.

 

  GDB's register file, registers, 采用raw format, GDB remote protocol transmits register values也是raw format.如要如下的函数支持raw和virtual模式的转换.

 

int REGISTER_CONVERTIBLE (int reg)  

int DEPRECATED_REGISTER_RAW_SIZE (int reg) 

int DEPRECATED_REGISTER_VIRTUAL_SIZE (int reg)

struct type *DEPRECATED_REGISTER_VIRTUAL_TYPE (int reg)

void REGISTER_CONVERT_TO_VIRTUAL (int reg, struct type *type, char *from, char *to)

void REGISTER_CONVERT_TO_RAW (struct type *type, int reg, char *from, char *to)


Using Different Register and Memory Data Representations

Maintainer's note: GDB操作寄存器的方式正在变革中,详见 A.R. Index and Bug Tracking Database 2002.

这里解决的问题和上一节一样:x86 80-bit 浮点寄存器,还有Alpha 可以把32 bit integer values 存到floating-point registers.

这种问题也可以定义如下的宏来解决:
int gdbarch_convert_register_p (struct gdbarch *gdbarch, int reg)

void gdbarch_register_to_value (struct gdbarch *gdbarch, int reg, struct type *type, char *from, char *to)

void gdbarch_value_to_register (struct gdbarch *gdbarch, struct type *type, int reg, char *from, char *to)

void REGISTER_CONVERT_TO_TYPE (int regnum, struct type *type, char *buf)

int gdbarch_char_signed (gdbarch)

int gdbarch_double_bit (gdbarch)

int gdbarch_float_bit (gdbarch)

int gdbarch_int_bit (gdbarch)

int gdbarch_long_bit (gdbarch)

int gdbarch_long_double_bit (gdbarch)

int gdbarch_long_long_bit (gdbarch)

int gdbarch_ptr_bit (gdbarch)

int gdbarch_short_bit (gdbarch)

int gdbarch_cannot_store_register (gdbarch, regnum)

int gdbarch_convert_register_p (gdbarch, regnum, struct type *type)

 

void gdbarch_value_to_register (gdbarch, frame, type, buf) 

int gdbarch_sp_regnum (gdbarch)
register_reggroup_p (gdbarch, regnum, reggroup)
DEPRECATED_REGISTER_VIRTUAL_SIZE (reg) 
DEPRECATED_REGISTER_VIRTUAL_TYPE (reg) 
struct type *register_type (gdbarch, reg)
REGISTER_CONVERT_TO_VIRTUAL(reg, type, from, to)

 

REGISTER_CONVERT_TO_RAW(type, reg, from, to)
const struct regset *regset_from_core_section (struct gdbarch * gdbarch, const char * sect_name, size_t sect_size) 
void gdbarch_register_to_value(gdbarch, frame, regnum, type, fur)

 

const char *gdbarch_register_name (gdbarch, regnr)

int gdbarch_stab_reg_to_regnum (gdbarch, stab_regnr) 
void gdbarch_store_return_value (gdbarch, type, regcache, valbuf)

gdbarch_ps_regnum (gdbarch  

int gdbarch_sdb_reg_to_regnum (gdbarch, sdb_regnr)

 

 


Stack Frame:

SOFTWARE_SINGLE_STEP_P()

SOFTWARE_SINGLE_STEP(signal, insert_breakpoints_p)

DEPRECATED_FRAME_SAVED_PC(frame) 

CORE_ADDR gdbarch_unwind_pc (next_frame)

CORE_ADDR gdbarch_unwind_sp (gdbarch, next_frame) 

CORE_ADDR frame_align (gdbarch, address)

int gdbarch_frame_red_zone_size (gdbarch)  

DEPRECATED_FRAME_CHAIN(frame)

DEPRECATED_FRAME_CHAIN_VALID(chain, thisframe)

DEPRECATED_FRAME_INIT_SAVED_REGS(frame)

int gdbarch_frame_num_args (gdbarch, frame)

void gdbarch_extract_return_value (gdbarch, type, regbuf, valbuf)

DEPRECATED_FP_REGNUM

DEPRECATED_FRAMELESS_FUNCTION_INVOCATION(fi)

FUNCTION_EPILOGUE_SIZE

DEPRECATED_FUNCTION_START_OFFSET
int gdbarch_inner_than (gdbarch, lhs, rhs)

 

gdbarch_in_function_epilogue_p (gdbarch, addr)

 

int gdbarch_in_solib_return_trampoline (gdbarch, pc, name)

 

IN_SOLIB_DYNSYM_RESOLVE_CODE (pc)

 

SKIP_SOLIB_RESOLVER (pc) 

gdbarch_get_longjmp_target

 

TARGET_READ_SP
TARGET_READ_FP

 

void gdbarch_virtual_frame_pointer (gdbarch, pc, frame_regnum, frame_offset)
CORE_ADDR gdbarch_read_pc (gdbarch, regcache)   
gdbarch_write_pc (gdbarch, regcache, val)
DEPRECATED_USE_STRUCT_CONVENTION (gcc_p, type)
CORE_ADDR  gdbarch_addr_bits_remove  (gdbarch, addr)
int  gdbarch_call_dummy_location  (gdbarch) 
int  gdbarch_cannot_fetch_register  (gdbarch, regum)
int gdbarch_stabs_argument_has_addr (gdbarch, type) 
CORE_ADDR gdbarch_skip_prologue (gdbarch, ip)

 

CORE_ADDR gdbarch_skip_trampoline_code (gdbarch, frame, pc)

 

 

 

 

enum return_value_convention gdbarch_return_value (struct gdbarch *gdbarch, struct type *valtype, struct regcache *regcache, void *readbuf, const void *writebuf)

 

 

 

SAVE_DUMMY_FRAME_TOS (sp)
CORE_ADDR gdbarch_push_dummy_call (gdbarch, function, regcache, bp_addr, nargs, args, sp, struct_return, struct_addr)
CORE_ADDR gdbarch_push_dummy_code (gdbarch, sp, funaddr, using_gcc, args, nargs, value_type, real_pc, bp_addr, regcache)
DEPRECATED_REG_STRUCT_HAS_ADDR (gcc_p, type) 


 

 

 

Address pointer:

int address_class_name_to_type_flags (gdbarch, name, type_flags_ptr)
int address_class_name_to_type_flags_p (gdbarch)
int gdbarch_address_class_type_flags (gdbarch, byte_size, dwarf2_addr_class)int gdbarch_address_class_type_flags_p (gdbarch)const char *gdbarch_address_class_type_flags_to_name (gdbarch, type_flags)
int gdbarch_address_class_type_flags_to_name_p (gdbarch)  void gdbarch_address_to_pointer (gdbarch, type, buf, addr) CORE_ADDR gdbarch_integer_to_address (gdbarch, type, buf) CORE_ADDR gdbarch_pointer_to_address (gdbarch, type, buf)

 

 

DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(regbuf) 
DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS_P()

 


Compiler and BFD:

int gdbarch_believe_pcc_promotion (gdbarch)

int gdbarch_dwarf2_reg_to_regnum (gdbarch, dwarf2_regnr)

int gdbarch_ecoff_reg_to_regnum (gdbarch, ecoff_regnr)

int gdbarch_dwarf_reg_to_regnum (gdbarch, dwarf_regnr)

GCC_COMPILED_FLAG_SYMBOL

GCC2_COMPILED_FLAG_SYMBOL

 

SOFUN_ADDRESS_MAYBE_MISSING   

PROCESS_LINENUMBER_HOOK

VARIABLES_INSIDE_BLOCK (desc, gcc_p) 

 

BreakPoint wathpoint

BREAKPOINT :定义breakpoint使用的指令,不能长于最短指令.如果采用trap则不必定义.如果才用非法指令或者其他值则必须定义TARGET_HAS_HARDWARE_WATCHPOINTS 
BIG_BREAKPOINT LITTLE_BREAKPOINT :类似BREAKPOINT, 但是用于 bi-endian targets.const gdb_byte * gdbarch_breakpoint_from_pc  (gdbarch, pcptr, lenptr)  int gdbarch_memory_insert_breakpoint (gdbarch, bp_tgt)
gdbarch_memory_remove_breakpoint (gdbarch, bp_tgt)   CORE_ADDR gdbarch_adjust_breakpoint_address  (gdbarch bpaddr )
I386_USE_GENERIC_WATCHPOINTS
DISABLE_UNSETTABLE_BREAK (addr) 
CORE_ADDR gdbarch_decr_pc_after_break (gdbarch) 
void gdbarch_skip_permanent_breakpoint (gdbarch, regcache) 

User Interface
void gdbarch_print_float_info (gdbarch, file, frame, args) 
void gdbarch_print_registers_info (gdbarch, frame, regnum, all) 
int gdbarch_print_vector_info (gdbarch, file, frame, args) 
int gdbarch_print_insn (gdbarch, vma, info)
frame_id gdbarch_unwind_dummy_id (gdbarch, frame)

 

 

Motorola M68K:

BPT_VECTOR : Define this to be the 4-bit location of the breakpoint trap vector. If not defined, it will default to 0xf.
REMOTE_BPT_VECTOR: Defaults to 1.

 

const char *gdbarch_name_of_malloc (gdbarch) : A string containing the name of the function to call in order to allocate some memory in the inferior. The default value is "malloc".


Misc:
DEPRECATED_IBM6000_TARGET
SYMBOL_RELOADING_DEFAULT

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值