33 #define GOT_MODULE_OFFSET 4 211 for (i = 0; i < map->
nsegs; i++)
250 sizeof ext_ldmbuf->
nsegs,
265 for (seg = 0; seg <
nsegs; seg++)
269 sizeof (ext_ldmbuf->
segs[seg].
addr),
302 error (
_(
"Error reading DSBT exec loadmap"));
312 error (
_(
"Error reading DSBT interp loadmap"));
332 int ext_ldmbuf_size, int_ldmbuf_size;
337 sizeof ext_ldmbuf_partial))
345 sizeof ext_ldmbuf_partial.version,
355 sizeof ext_ldmbuf_partial.nsegs,
367 memcpy (ext_ldmbuf, &ext_ldmbuf_partial,
sizeof ext_ldmbuf_partial);
371 (
gdb_byte *) ext_ldmbuf +
sizeof ext_ldmbuf_partial,
372 ext_ldmbuf_size -
sizeof ext_ldmbuf_partial))
388 for (seg = 0; seg <
nsegs; seg++)
392 sizeof (ext_ldmbuf->
segs[seg].
addr),
417 int arch_size, step, sect_size;
421 Elf32_External_Dyn *x_dynp_32;
422 Elf64_External_Dyn *x_dynp_64;
423 struct bfd_section *sect;
429 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
432 arch_size = bfd_get_arch_size (abfd);
437 sect = bfd_get_section_by_name (abfd,
".dynamic");
455 dyn_addr = bfd_section_vma (abfd, sect);
460 sect_size = bfd_section_size (abfd, sect);
461 buf = bufstart = (
gdb_byte *) alloca (sect_size);
462 if (!bfd_get_section_contents (abfd, sect,
467 step = (arch_size == 32) ?
sizeof (Elf32_External_Dyn)
468 :
sizeof (Elf64_External_Dyn);
469 for (bufend = buf + sect_size;
475 x_dynp_32 = (Elf32_External_Dyn *) buf;
476 dyn_tag = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_tag);
477 dyn_ptr = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_un.d_ptr);
481 x_dynp_64 = (Elf64_External_Dyn *) buf;
482 dyn_tag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag);
483 dyn_ptr = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_un.d_ptr);
485 if (dyn_tag == DT_NULL)
487 if (dyn_tag == dyntag)
493 struct type *ptr_type;
498 ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
528 for (seg = 0; seg < map->
nsegs; seg++)
530 && addr < map->segs[seg].p_vaddr + map->
segs[seg].
p_memsz)
576 "lm_base: get addr %x by _GLOBAL_OFFSET_TABLE_.\n",
577 (
unsigned int) addr);
588 "lm_base: get addr %x by DT_PLTGOT.\n",
589 (
unsigned int) addr);
595 "lm_base: _GLOBAL_OFFSET_TABLE_ not found.\n");
602 "lm_base: _GLOBAL_OFFSET_TABLE_ + %d = %s\n",
611 "lm_base: lm_base_cache = %s\n",
632 struct so_list *sos_head = NULL;
633 struct so_list **sos_next_ptr = &sos_head;
666 "current_sos: reading link_map entry at %s\n",
672 warning (
_(
"dsbt_current_sos: Unable to read link map entry." 673 " Shared object chain may be incomplete."));
679 sizeof lm_buf.l_addr.map,
686 warning (
_(
"dsbt_current_sos: Unable to read dsbt index." 687 " Shared object chain may be incomplete."));
707 warning (
_(
"dsbt_current_sos: Unable to fetch load map." 708 " Shared object chain may be incomplete."));
718 sizeof (lm_buf.l_name),
724 warning (
_(
"Can't read pathname for link map entry: %s."),
739 sos_next_ptr = &sop->
next;
747 sizeof (lm_buf.l_next), byte_order);
772 warning (
_(
"Unable to find dynamic linker breakpoint function.\n" 773 "GDB will be unable to debug shared library initializers\n" 774 "and track explicitly loaded dynamic code."));
782 return (strcmp (sym->name, (
const char *) data) == 0);
796 asection *interp_sect;
814 interp_sect = bfd_get_section_by_name (
exec_bfd,
".interp");
817 unsigned int interp_sect_size;
825 interp_sect_size = bfd_section_size (
exec_bfd, interp_sect);
826 buf = (
char *) alloca (interp_sect_size);
827 bfd_get_section_contents (
exec_bfd, interp_sect,
828 buf, 0, interp_sect_size);
855 interp_sect = bfd_get_section_by_name (tmp_bfd.
get (),
".text");
859 = bfd_section_vma (tmp_bfd.
get (), interp_sect);
864 + bfd_section_size (tmp_bfd.
get (), interp_sect);
866 interp_sect = bfd_get_section_by_name (tmp_bfd.
get (),
".plt");
870 bfd_section_vma (tmp_bfd.
get (), interp_sect);
884 "enable_break: _dl_debug_state (prior to relocation) = %s\n",
890 "enable_break: _dl_debug_state (after relocation) = %s\n",
902 "enable_break: _dl_debug_state is not found\n");
954 orig_addr = addr -
offset;
956 for (seg = 0; seg < ldm->
nsegs; seg++)
959 && orig_addr < ldm->segs[seg].p_vaddr + ldm->
segs[seg].
p_memsz)
961 new_offsets->
offsets[osect_idx]
996 warning (
_(
"shared library handler failed to enable breakpoint"));
1029 for (seg = 0; seg < map->nsegs; seg++)
1031 if (map->segs[seg].p_vaddr <= sec->
addr 1032 && sec->
addr < map->segs[seg].p_vaddr + map->segs[seg].p_memsz)
1069 Set internal debugging of shared library code for DSBT ELF."),
_(
"\ 1070 Show internal debugging of shared library code for DSBT ELF."),
_(
"\ 1071 When non-zero, DSBT solib specific internal debugging is enabled."),
struct gdbarch * target_gdbarch(void)
static void dsbt_print_loadmap(struct int_elf32_dsbt_loadmap *map)
CORE_ADDR extract_typed_address(const gdb_byte *buf, struct type *type)
CORE_ADDR interp_plt_sect_high
static void dsbt_solib_create_inferior_hook(int from_tty)
struct breakpoint * create_solib_event_breakpoint(struct gdbarch *gdbarch, CORE_ADDR address)
#define BMSYMBOL_VALUE_ADDRESS(symbol)
void warning(const char *fmt,...)
LONGEST target_read_alloc(struct target_ops *ops, enum target_object object, const char *annex, gdb_byte **buf_p)
const struct builtin_type * builtin_type(struct gdbarch *gdbarch)
void(* relocate_section_addresses)(struct so_list *so, struct target_section *)
static int cmp_name(const asymbol *sym, const void *data)
void(* solib_create_inferior_hook)(int from_tty)
struct so_list *(* current_sos)(void)
gdb_byte ext_Elf32_Addr[4]
void objfile_relocate(struct objfile *objfile, const struct section_offsets *new_offsets)
static struct dsbt_info * get_dsbt_info(void)
static int enable_break(void)
int_elf32_dsbt_loadmap * map
#define ALL_OBJFILE_OSECTIONS(objfile, osect)
#define SO_NAME_MAX_PATH_SIZE
static CORE_ADDR lm_addr(struct so_list *so)
void printf_filtered(const char *format,...)
gdb_bfd_ref_ptr(* bfd_open)(char *pathname)
CORE_ADDR interp_plt_sect_low
static int dsbt_in_dynsym_resolve_code(CORE_ADDR pc)
void add_setshow_zuinteger_cmd(const char *name, enum command_class theclass, unsigned int *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_const_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
void(* clear_solib)(void)
struct int_elf32_dsbt_loadseg segs[1]
static struct int_elf32_dsbt_loadmap * decode_loadmap(gdb_byte *buf)
ext_Elf32_Word dsbt_index
struct lm_info_dsbt * main_executable_lm_info
int(* in_dynsym_resolve_code)(CORE_ADDR pc)
gdb_byte ext_Elf32_Word[4]
#define CATCH(EXCEPTION, MASK)
CORE_ADDR interp_text_sect_high
struct target_ops current_target
static void dsbt_relocate_section_addresses(struct so_list *so, struct target_section *sec)
void fprintf_filtered(struct ui_file *stream, const char *format,...)
static ULONGEST extract_unsigned_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
#define current_target_sections
static void show_dsbt_debug(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
#define GOT_MODULE_OFFSET
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
struct int_elf32_dsbt_loadmap * interp_loadmap
char so_original_name[SO_NAME_MAX_PATH_SIZE]
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
struct cleanup * make_cleanup(make_cleanup_ftype *function, void *arg)
static unsigned int solib_dsbt_debug
#define ANOFFSET(secoff, whichone)
char so_name[SO_NAME_MAX_PATH_SIZE]
struct target_so_ops dsbt_so_ops
#define target_has_execution
struct cmd_list_element * setdebuglist
CORE_ADDR gdb_bfd_lookup_symbol(bfd *abfd, int(*match_sym)(const asymbol *, const void *), const void *data)
struct bfd_section * the_bfd_section
struct ext_elf32_dsbt_loadaddr l_addr
static void dsbt_get_initial_loadmaps(void)
static CORE_ADDR displacement_from_map(struct int_elf32_dsbt_loadmap *map, CORE_ADDR addr)
static const struct program_space_data * solib_dsbt_pspace_data
static int scan_dyntag(int dyntag, bfd *abfd, CORE_ADDR *ptr)
int(* open_symbol_file_object)(int from_ttyp)
static void enable_break_failure_warning(void)
char * hex_string_custom(LONGEST num, int width)
static CORE_ADDR interp_plt_sect_high
struct ext_elf32_dsbt_loadseg segs[1]
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
struct type * builtin_data_ptr
static int in_plt_section(CORE_ADDR pc)
static CORE_ADDR lm_base(void)
struct minimal_symbol * minsym
void(* free_so)(struct so_list *so)
char * safe_strerror(int)
#define obj_section_addr(s)
static void dsbt_free_so(struct so_list *so)
const char * print_core_address(struct gdbarch *gdbarch, CORE_ADDR address)
struct program_space * current_program_space
ext_Elf32_Word dsbt_table_ptr
CORE_ADDR interp_text_sect_low
static int open_symbol_file_object(int from_tty)
static void dsbt_pspace_data_cleanup(struct program_space *pspace, void *arg)
struct cmd_list_element * showdebuglist
void _initialize_dsbt_solib(void)
gdb_bfd_ref_ptr solib_bfd_open(char *pathname)
gdb_byte ext_Elf32_Half[2]
static struct so_list * dsbt_current_sos(void)
static CORE_ADDR interp_text_sect_high
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
int target_read_string(CORE_ADDR memaddr, char **string, int len, int *errnop)
struct int_elf32_dsbt_loadmap * exec_loadmap
void error(const char *fmt,...)
static struct int_elf32_dsbt_loadmap * fetch_loadmap(CORE_ADDR ldmaddr)
void do_cleanups(struct cleanup *old_chain)
static void dsbt_relocate_main_executable(void)
static void dsbt_clear_solib(void)