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.
This commit is contained in:
Randolph Chung 2004-12-09 17:58:04 +00:00
parent f9cfae629f
commit 45851e004a
2 changed files with 51 additions and 9 deletions

View File

@ -1,3 +1,13 @@
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.
2004-12-08 Daniel Jacobowitz <dan@debian.org>
* linux-thread-db.c (BUILD_THREAD): Delete.

View File

@ -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 */