diff options
author | Randolph Chung <tausq@debian.org> | 2004-12-09 17:58:04 +0000 |
---|---|---|
committer | Randolph Chung <tausq@debian.org> | 2004-12-09 17:58:04 +0000 |
commit | 45851e004a991f1e206ce499319ab485648c736b (patch) | |
tree | 1b13e2d8b4755267cc442daaf6327044c9fafd22 /gdb/solib-pa64.c | |
parent | f9cfae629f47806e75b56f4125539e330e7a6bc3 (diff) | |
download | gdb-45851e004a991f1e206ce499319ab485648c736b.zip gdb-45851e004a991f1e206ce499319ab485648c736b.tar.gz gdb-45851e004a991f1e206ce499319ab485648c736b.tar.bz2 |
2004-12-09 Randolph Chung <tausq@debian.org>
* 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.
Diffstat (limited to 'gdb/solib-pa64.c')
-rw-r--r-- | gdb/solib-pa64.c | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/gdb/solib-pa64.c b/gdb/solib-pa64.c index 9f54104..0f20a54 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 */ |