33 #define GOT_MODULE_OFFSET 4
205 for (i = 0; i < map->
nsegs; i++)
244 sizeof ext_ldmbuf->
nsegs,
254 int_ldmbuf =
xmalloc (int_ldmbuf_size);
258 int_ldmbuf->
nsegs = nsegs;
259 for (seg = 0; seg < nsegs; seg++)
263 sizeof (ext_ldmbuf->
segs[seg].
addr),
296 error (
_(
"Error reading DSBT exec loadmap"));
306 error (
_(
"Error reading DSBT interp loadmap"));
326 int ext_ldmbuf_size, int_ldmbuf_size;
331 sizeof ext_ldmbuf_partial))
339 sizeof ext_ldmbuf_partial.
version,
349 sizeof ext_ldmbuf_partial.
nsegs,
358 ext_ldmbuf =
xmalloc (ext_ldmbuf_size);
361 memcpy (ext_ldmbuf, &ext_ldmbuf_partial,
sizeof ext_ldmbuf_partial);
365 (
gdb_byte *) ext_ldmbuf +
sizeof ext_ldmbuf_partial,
366 ext_ldmbuf_size -
sizeof ext_ldmbuf_partial))
377 int_ldmbuf =
xmalloc (int_ldmbuf_size);
381 int_ldmbuf->
nsegs = nsegs;
382 for (seg = 0; seg < nsegs; seg++)
386 sizeof (ext_ldmbuf->
segs[seg].
addr),
411 int arch_size, step, sect_size;
415 Elf32_External_Dyn *x_dynp_32;
416 Elf64_External_Dyn *x_dynp_64;
417 struct bfd_section *sect;
423 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
426 arch_size = bfd_get_arch_size (abfd);
431 sect = bfd_get_section_by_name (abfd,
".dynamic");
441 dyn_addr = target_section->
addr;
449 dyn_addr = bfd_section_vma (abfd, sect);
454 sect_size = bfd_section_size (abfd, sect);
455 buf = bufstart = alloca (sect_size);
456 if (!bfd_get_section_contents (abfd, sect,
461 step = (arch_size == 32) ?
sizeof (Elf32_External_Dyn)
462 :
sizeof (Elf64_External_Dyn);
463 for (bufend = buf + sect_size;
469 x_dynp_32 = (Elf32_External_Dyn *) buf;
470 dyn_tag = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_tag);
471 dyn_ptr = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_un.d_ptr);
475 x_dynp_64 = (Elf64_External_Dyn *) buf;
476 dyn_tag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag);
477 dyn_ptr = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_un.d_ptr);
479 if (dyn_tag == DT_NULL)
481 if (dyn_tag == dyntag)
487 struct type *ptr_type;
492 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."));
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."));
723 warning (
_(
"Can't read pathname for link map entry: %s."),
738 sos_next_ptr = &sop->
next;
746 sizeof (lm_buf.
l_next), byte_order);
771 warning (
_(
"Unable to find dynamic linker breakpoint function.\n"
772 "GDB will be unable to debug shared library initializers\n"
773 "and track explicitly loaded dynamic code."));
781 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;
827 interp_sect_size = bfd_section_size (
exec_bfd, interp_sect);
828 buf = alloca (interp_sect_size);
829 bfd_get_section_contents (
exec_bfd, interp_sect,
830 buf, 0, interp_sect_size);
856 interp_sect = bfd_get_section_by_name (tmp_bfd,
".text");
860 = bfd_section_vma (tmp_bfd, interp_sect);
865 + bfd_section_size (tmp_bfd, interp_sect);
867 interp_sect = bfd_get_section_by_name (tmp_bfd,
".plt");
871 bfd_section_vma (tmp_bfd, interp_sect);
883 "enable_break: _dl_debug_state (prior to relocation) = %s\n",
889 "enable_break: _dl_debug_state (after relocation) = %s\n",
901 "enable_break: _dl_debug_state is not found\n");
965 orig_addr = addr -
offset;
967 for (seg = 0; seg < ldm->
nsegs; seg++)
970 && orig_addr < ldm->segs[seg].p_vaddr + ldm->
segs[seg].
p_memsz)
972 new_offsets->
offsets[osect_idx]
975 if (new_offsets->
offsets[osect_idx] != offset)
1007 warning (
_(
"shared library handler failed to enable breakpoint"));
1043 for (seg = 0; seg < map->
nsegs; seg++)
1087 Set internal debugging of shared library code for DSBT ELF."),
_(
"\
1088 Show internal debugging of shared library code for DSBT ELF."),
_(
"\
1089 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)
ULONGEST extract_unsigned_integer(const gdb_byte *, int, enum bfd_endian)
CORE_ADDR extract_typed_address(const gdb_byte *buf, struct type *type)
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_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
CORE_ADDR interp_plt_sect_high
static void dsbt_solib_create_inferior_hook(int from_tty)
static int cmp_name(asymbol *sym, void *data)
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 open_symbol_file_object(void *from_ttyp)
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)
bfd *(* bfd_open)(char *pathname)
static struct dsbt_info * get_dsbt_info(void)
static int enable_break(void)
#define ALL_OBJFILE_OSECTIONS(objfile, osect)
#define SO_NAME_MAX_PATH_SIZE
static CORE_ADDR lm_addr(struct so_list *so)
struct lm_info * main_executable_lm_info
int(* open_symbol_file_object)(void *from_ttyp)
void printf_filtered(const char *format,...)
CORE_ADDR interp_plt_sect_low
#define obj_section_addr(s)
static int dsbt_in_dynsym_resolve_code(CORE_ADDR pc)
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
static void dsbt_special_symbol_handling(void)
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
void gdb_bfd_unref(struct bfd *abfd)
void initialize_file_ftype(void)
CORE_ADDR gdb_bfd_lookup_symbol(bfd *abfd, int(*match_sym)(asymbol *, void *), void *data)
static void dsbt_relocate_section_addresses(struct so_list *so, struct target_section *sec)
void fprintf_filtered(struct ui_file *stream, const char *format,...)
#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
initialize_file_ftype _initialize_dsbt_solib
#define target_has_execution
struct cmd_list_element * setdebuglist
struct bfd_section * the_bfd_section
struct ext_elf32_dsbt_loadaddr l_addr
struct ui_file * gdb_stdlog
void(* special_symbol_handling)(void)
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
struct int_elf32_dsbt_loadmap * map
static int scan_dyntag(int dyntag, bfd *abfd, CORE_ADDR *ptr)
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)
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 void dsbt_pspace_data_cleanup(struct program_space *pspace, void *arg)
struct cmd_list_element * showdebuglist
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)
PTR xcalloc(size_t number, size_t size)
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)
bfd * solib_bfd_open(char *pathname)
void do_cleanups(struct cleanup *old_chain)
static void dsbt_relocate_main_executable(void)
static void dsbt_clear_solib(void)