aboutsummaryrefslogtreecommitdiff
path: root/gdb/symfile.c
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2003-01-31 19:22:18 +0000
committerDaniel Jacobowitz <drow@false.org>2003-01-31 19:22:18 +0000
commit086df311266af5a41ac06691cc1dcdfeee4fcb47 (patch)
tree8e211843191b1b38c04fc12b4ab41f30ced03639 /gdb/symfile.c
parent122bfa9220daee52a8fa135d37b0cdd2e046f801 (diff)
downloadbinutils-086df311266af5a41ac06691cc1dcdfeee4fcb47.zip
binutils-086df311266af5a41ac06691cc1dcdfeee4fcb47.tar.gz
binutils-086df311266af5a41ac06691cc1dcdfeee4fcb47.tar.bz2
* dbxread.c (stabs_data): New static variable.
(fill_symbuf): Support an in-memory buffer for stabs data. (stabs_seek): New function. (dbx_psymtab_to_symtab): Relocate the stabs data if necessary. (read_ofile_symtab): Use stabs_seek. (elfstab_build_psymtabs): Take an asection* instead of an offset and size. Relocate the stabs data if necessary. Save the section* for dbx_psymtab_to_symtab. * dwarf2read.c: Add section variables for each debug section. (dwarf2_locate_sections): Fill them in. (dwarf2_read_section): Take an asection* argument. Relocate the section contents if necessary. (dwarf2_build_psymtabs, dwarf2_build_psymtabs_easy): Update callers. * dwarf2cfi.c (parse_frame_info): Take a section argument and pass it to dwarf2_read_section. (dwarf2_build_frame_info): Update callers. * elfread.c (elf_symfile_read): Update call to elfstab_build_psymtabs. * gdb-stabs.h (struct dbx_symfile_info): Add stab_section. (DBX_STAB_SECTION): New macro. * stabsread.h (elfstab_build_psymtabs): Update prototype. * symfile.c (symfile_dummy_outputs): New function. (symfile_relocate_debug_section): New function. * symfile.h (symfile_relocate_debug_section): Add prototype.
Diffstat (limited to 'gdb/symfile.c')
-rw-r--r--gdb/symfile.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 81e1f74..95da6f1 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -23,6 +23,7 @@
Boston, MA 02111-1307, USA. */
#include "defs.h"
+#include "bfdlink.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "gdbcore.h"
@@ -3562,6 +3563,45 @@ simple_overlay_update (struct obj_section *osect)
}
}
+/* Set the output sections and output offsets for section SECTP in
+ ABFD. The relocation code in BFD will read these offsets, so we
+ need to be sure they're initialized. We map each section to itself,
+ with no offset; this means that SECTP->vma will be honored. */
+
+static void
+symfile_dummy_outputs (bfd *abfd, asection *sectp, void *dummy)
+{
+ sectp->output_section = sectp;
+ sectp->output_offset = 0;
+}
+
+/* Relocate the contents of a debug section SECTP in ABFD. The
+ contents are stored in BUF if it is non-NULL, or returned in a
+ malloc'd buffer otherwise.
+
+ For some platforms and debug info formats, shared libraries contain
+ relocations against the debug sections (particularly for DWARF-2;
+ one affected platform is PowerPC GNU/Linux, although it depends on
+ the version of the linker in use). Also, ELF object files naturally
+ have unresolved relocations for their debug sections. We need to apply
+ the relocations in order to get the locations of symbols correct. */
+
+bfd_byte *
+symfile_relocate_debug_section (bfd *abfd, asection *sectp, bfd_byte *buf)
+{
+ /* We're only interested in debugging sections with relocation
+ information. */
+ if ((sectp->flags & SEC_RELOC) == 0)
+ return NULL;
+ if ((sectp->flags & SEC_DEBUGGING) == 0)
+ return NULL;
+
+ /* We will handle section offsets properly elsewhere, so relocate as if
+ all sections begin at 0. */
+ bfd_map_over_sections (abfd, symfile_dummy_outputs, NULL);
+
+ return bfd_simple_get_relocated_section_contents (abfd, sectp, buf);
+}
void
_initialize_symfile (void)