From 45851e004a991f1e206ce499319ab485648c736b Mon Sep 17 00:00:00 2001 From: Randolph Chung Date: Thu, 9 Dec 2004 17:58:04 +0000 Subject: [PATCH] 2004-12-09 Randolph Chung * solib-pa64.c (pa64_relocate_section_addresses): Properly relocate text and data sections. (pa64_current_sos): Also include the dld in the list of current shared objects. (pa64_solib_get_solib_by_pc): Update comments. (pa64_solib_get_text_base): New function. (pa64_solib_select): Set solib_get_text_base method. --- gdb/ChangeLog | 10 ++++++++++ gdb/solib-pa64.c | 50 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 19306089fd..2c779c7058 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2004-12-09 Randolph Chung + + * solib-pa64.c (pa64_relocate_section_addresses): Properly relocate + text and data sections. + (pa64_current_sos): Also include the dld in the list of current shared + objects. + (pa64_solib_get_solib_by_pc): Update comments. + (pa64_solib_get_text_base): New function. + (pa64_solib_select): Set solib_get_text_base method. + 2004-12-08 Daniel Jacobowitz * linux-thread-db.c (BUILD_THREAD): Delete. diff --git a/gdb/solib-pa64.c b/gdb/solib-pa64.c index 9f54104953..0f20a544f2 100644 --- a/gdb/solib-pa64.c +++ b/gdb/solib-pa64.c @@ -79,6 +79,23 @@ static void pa64_relocate_section_addresses (struct so_list *so, struct section_table *sec) { + asection *asec = sec->the_bfd_section; + CORE_ADDR load_offset; + + /* Relocate all the sections based on where they got loaded. */ + + load_offset = bfd_section_vma (so->abfd, asec) - asec->filepos; + + if (asec->flags & SEC_CODE) + { + sec->addr += so->lm_info->desc.text_base - load_offset; + sec->endaddr += so->lm_info->desc.text_base - load_offset; + } + else if (asec->flags & SEC_DATA) + { + sec->addr += so->lm_info->desc.data_base - load_offset; + sec->endaddr += so->lm_info->desc.data_base - load_offset; + } } static void @@ -438,13 +455,16 @@ pa64_current_sos (void) "breakpoint in a shared library will not work until you rerun " "the program.\n"); - for (dll_index = 1; ; dll_index++) + for (dll_index = -1; ; dll_index++) { struct load_module_desc dll_desc; char *dll_path; struct so_list *new; struct cleanup *old_chain; + if (dll_index == 0) + continue; + /* Read in the load module descriptor. */ if (dlgetmodinfo (dll_index, &dll_desc, sizeof (dll_desc), pa64_target_read_memory, 0, dld_cache.load_map) @@ -456,9 +476,6 @@ pa64_current_sos (void) pa64_target_read_memory, 0, dld_cache.load_map); - if (dll_path == NULL) - dll_path = ""; - new = (struct so_list *) xmalloc (sizeof (struct so_list)); memset (new, 0, sizeof (struct so_list)); new->lm_info = (struct lm_info *) xmalloc (sizeof (struct lm_info)); @@ -564,9 +581,9 @@ pa64_solib_get_got_by_pc (CORE_ADDR addr) && ((so_list->lm_info->desc.text_base + so_list->lm_info->desc.text_size) > addr)) - { + { got_value = so_list->lm_info->desc.linkage_ptr; - break; + break; } so_list = so_list->next; } @@ -582,9 +599,7 @@ pa64_solib_thread_start_addr (struct so_list *so) /* Return the address of the handle of the shared library in which ADDR - belongs. If ADDR isn't in any known shared library, return zero. - - This function is used in hppa_fix_call_dummy in hppa-tdep.c. */ + belongs. If ADDR isn't in any known shared library, return zero. */ static CORE_ADDR pa64_solib_get_solib_by_pc (CORE_ADDR addr) @@ -607,6 +622,22 @@ pa64_solib_get_solib_by_pc (CORE_ADDR addr) return retval; } +/* pa64 libraries do not seem to set the section offsets in a standard (i.e. + SVr4) way; the text section offset stored in the file doesn't correspond + to the place where the library is actually loaded into memory. Instead, + we rely on the dll descriptor to tell us where things were loaded. */ +static CORE_ADDR +pa64_solib_get_text_base (struct objfile *objfile) +{ + struct so_list *so; + + for (so = master_so_list (); so; so = so->next) + if (so->objfile == objfile) + return so->lm_info->desc.text_base; + + return 0; +} + static struct target_so_ops pa64_so_ops; extern initialize_file_ftype _initialize_pa64_solib; /* -Wmissing-prototypes */ @@ -633,6 +664,7 @@ void pa64_solib_select (struct gdbarch_tdep *tdep) tdep->solib_thread_start_addr = pa64_solib_thread_start_addr; tdep->solib_get_got_by_pc = pa64_solib_get_got_by_pc; tdep->solib_get_solib_by_pc = pa64_solib_get_solib_by_pc; + tdep->solib_get_text_base = pa64_solib_get_text_base; } #else /* PA_SOM_ONLY */