From 4365c36c9b87e20565b20c52809c781c50831a18 Mon Sep 17 00:00:00 2001 From: Jim Kingdon Date: Thu, 22 Apr 1993 20:42:37 +0000 Subject: * objfiles.h (obj_section), objfiles.c (build_objfile_section_table): Add objfile field. * objfiles.c (find_pc_section): Return a struct obj_section *. * sparc-tdep.c (in_solib_trampoline): Deal with find_pc_section return. * symfile.c (syms_from_objfile) [IBM6000_TARGET]: Don't use obj_section hack. * xcoffexec (vmap_symtab): Relocate obj_sections. * printcmd.c (containing_function_bounds): Use find_pc_section. --- gdb/xcoffexec.c | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) (limited to 'gdb/xcoffexec.c') diff --git a/gdb/xcoffexec.c b/gdb/xcoffexec.c index c965488..cfc6a78 100644 --- a/gdb/xcoffexec.c +++ b/gdb/xcoffexec.c @@ -312,7 +312,9 @@ vmap_symtab (vp) asection *textsec; asection *datasec; asection *bsssec; - CORE_ADDR old_text_offset; + CORE_ADDR text_delta; + CORE_ADDR data_delta; + CORE_ADDR bss_delta; struct section_offsets *new_offsets; int i; @@ -335,18 +337,47 @@ vmap_symtab (vp) ANOFFSET (new_offsets, i) = ANOFFSET (objfile->section_offsets, i); textsec = bfd_get_section_by_name (vp->bfd, ".text"); - old_text_offset = ANOFFSET (objfile->section_offsets, textsec->target_index); + text_delta = + vp->tstart - ANOFFSET (objfile->section_offsets, textsec->target_index); ANOFFSET (new_offsets, textsec->target_index) = vp->tstart; + datasec = bfd_get_section_by_name (vp->bfd, ".data"); + data_delta = + vp->dstart - ANOFFSET (objfile->section_offsets, datasec->target_index); ANOFFSET (new_offsets, datasec->target_index) = vp->dstart; + bsssec = bfd_get_section_by_name (vp->bfd, ".bss"); + bss_delta = + vp->dstart - ANOFFSET (objfile->section_offsets, bsssec->target_index); ANOFFSET (new_offsets, bsssec->target_index) = vp->dstart; objfile_relocate (objfile, new_offsets); + + { + struct obj_section *s; + for (s = objfile->sections; s < objfile->sections_end; ++s) + { + if (s->sec_ptr->target_index == textsec->target_index) + { + s->addr += text_delta; + s->endaddr += text_delta; + } + else if (s->sec_ptr->target_index == datasec->target_index) + { + s->addr += data_delta; + s->endaddr += data_delta; + } + else if (s->sec_ptr->target_index == bsssec->target_index) + { + s->addr += bss_delta; + s->endaddr += bss_delta; + } + } + } - if (old_text_offset != ANOFFSET (new_offsets, textsec->target_index)) + if (text_delta != 0) /* breakpoints need to be relocated as well. */ - fixup_breakpoints (0, TEXT_SEGMENT_BASE, vp->tstart - old_text_offset); + fixup_breakpoints (0, TEXT_SEGMENT_BASE, text_delta); } /* Add symbols for an objfile. */ -- cgit v1.1