diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 52886a8fad5..fb0ea02d32b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,22 @@ +2010-02-03 Tristan Gingold + + * symfile.h (struct sym_fns): Add sym_relocate field. + (default_symfile_relocate): New prototype. + (symfile_relocate_debug_section): First argument is now an objfile. + * symfile.c (default_symfile_relocate): Rename from + symfile_relocate_debug_section, first argument is now an objfile. + (symfile_relocate_debug_section): New function. + * coffread.c (coff_sym_fns): Set sym_relocate field. + * somread.c (som_sym_fns): Ditto. + * mipsread.c (ecoff_sym_fns): Ditto. + * machoread.c (macho_sym_fns): Ditto. + * elfread.c (elf_sym_fns): Ditto. + * dwarf2read.c (dwarf2_read_section): Ditto. + * xcoffread.c (xcoff_sym_fns): Ditto. + * dbxread.c (aout_sym_fns): Ditto. + (dbx_psymtab_to_symtab): Adjust call to symfile_relocate_debug_section. + (elfstab_build_psymtabs): Ditto. + 2010-02-03 H.J. Lu * defs.h (MAX_REGISTER_SIZE): Increase to 32. diff --git a/gdb/coffread.c b/gdb/coffread.c index 8e5dca99604..ba413ade365 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -2128,6 +2128,7 @@ static struct sym_fns coff_sym_fns = default_symfile_segments, /* sym_segments: Get segment information from a file. */ NULL, /* sym_read_linetable */ + default_symfile_relocate, /* sym_relocate: Relocate a debug section. */ NULL /* next: pointer to next struct sym_fns */ }; diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 6ef676735e4..c9a575477fb 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -2473,7 +2473,7 @@ Shouldn't happen.\n", if (DBX_STAB_SECTION (pst->objfile)) { stabs_data - = symfile_relocate_debug_section (pst->objfile->obfd, + = symfile_relocate_debug_section (pst->objfile, DBX_STAB_SECTION (pst->objfile), NULL); if (stabs_data) @@ -3460,7 +3460,7 @@ elfstab_build_psymtabs (struct objfile *objfile, asection *stabsect, symbuf_read = 0; symbuf_left = bfd_section_size (objfile->obfd, stabsect); - stabs_data = symfile_relocate_debug_section (objfile->obfd, stabsect, NULL); + stabs_data = symfile_relocate_debug_section (objfile, stabsect, NULL); if (stabs_data) back_to = make_cleanup (free_current_contents, (void *) &stabs_data); @@ -3571,6 +3571,7 @@ static struct sym_fns aout_sym_fns = default_symfile_segments, /* sym_segments: Get segment information from a file. */ NULL, /* sym_read_linetable */ + default_symfile_relocate, /* sym_relocate: Relocate a debug section. */ NULL /* next: pointer to next struct sym_fns */ }; diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 86bfecb236e..0dc1b11d78e 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -1412,7 +1412,7 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info) http://sourceware.org/ml/gdb-patches/2002-04/msg00136.html . We never compress sections in .o files, so we only need to try this when the section is not compressed. */ - retbuf = symfile_relocate_debug_section (abfd, sectp, buf); + retbuf = symfile_relocate_debug_section (objfile, sectp, buf); if (retbuf != NULL) { info->buffer = retbuf; diff --git a/gdb/elfread.c b/gdb/elfread.c index 78e91636002..9a2a1e3bd82 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -1057,6 +1057,7 @@ static struct sym_fns elf_sym_fns = elf_symfile_segments, /* sym_segments: Get segment information from a file. */ NULL, /* sym_read_linetable */ + default_symfile_relocate, /* sym_relocate: Relocate a debug section. */ NULL /* next: pointer to next struct sym_fns */ }; diff --git a/gdb/machoread.c b/gdb/machoread.c index 02b61d3adcf..be9e2a57133 100644 --- a/gdb/machoread.c +++ b/gdb/machoread.c @@ -759,6 +759,9 @@ static struct sym_fns macho_sym_fns = { macho_symfile_offsets, /* sym_offsets: xlate external to internal form */ default_symfile_segments, /* sym_segments: Get segment information from a file. */ + NULL, /* sym_read_linetable */ + default_symfile_relocate, /* sym_relocate: Relocate a debug section. */ + NULL /* next: pointer to next struct sym_fns */ }; diff --git a/gdb/mipsread.c b/gdb/mipsread.c index 4ef817e2f0d..093313e68eb 100644 --- a/gdb/mipsread.c +++ b/gdb/mipsread.c @@ -399,6 +399,7 @@ static struct sym_fns ecoff_sym_fns = default_symfile_segments, /* sym_segments: Get segment information from a file. */ NULL, /* sym_read_linetable */ + default_symfile_relocate, /* sym_relocate: Relocate a debug section. */ NULL /* next: pointer to next struct sym_fns */ }; diff --git a/gdb/somread.c b/gdb/somread.c index c7beaba6f1b..3d93c5ee2a8 100644 --- a/gdb/somread.c +++ b/gdb/somread.c @@ -437,6 +437,7 @@ static struct sym_fns som_sym_fns = default_symfile_segments, /* sym_segments: Get segment information from a file. */ NULL, /* sym_read_linetable */ + default_symfile_relocate, /* sym_relocate: Relocate a debug section. */ NULL /* next: pointer to next struct sym_fns */ }; diff --git a/gdb/symfile.c b/gdb/symfile.c index bc5240691c3..efa341dfe32 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -3627,6 +3627,27 @@ symfile_dummy_outputs (bfd *abfd, asection *sectp, void *dummy) sectp->output_offset = 0; } +/* Default implementation for sym_relocate. */ + + +bfd_byte * +default_symfile_relocate (struct objfile *objfile, asection *sectp, + bfd_byte *buf) +{ + bfd *abfd = objfile->obfd; + + /* We're only interested in sections with relocation + information. */ + if ((sectp->flags & SEC_RELOC) == 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, NULL); +} + /* 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. @@ -3642,18 +3663,12 @@ symfile_dummy_outputs (bfd *abfd, asection *sectp, void *dummy) debug section. */ bfd_byte * -symfile_relocate_debug_section (bfd *abfd, asection *sectp, bfd_byte *buf) +symfile_relocate_debug_section (struct objfile *objfile, + asection *sectp, bfd_byte *buf) { - /* We're only interested in sections with relocation - information. */ - if ((sectp->flags & SEC_RELOC) == 0) - return NULL; + gdb_assert (objfile->sf->sym_relocate); - /* 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, NULL); + return (*objfile->sf->sym_relocate) (objfile, sectp, buf); } struct symfile_segment_data * diff --git a/gdb/symfile.h b/gdb/symfile.h index efa069e1485..302c29f6028 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -163,8 +163,15 @@ struct sym_fns /* This function should read the linetable from the objfile when the line table cannot be read while processing the debugging information. */ + void (*sym_read_linetable) (void); + /* Relocate the contents of a debug section SECTP. The + contents are stored in BUF if it is non-NULL, or returned in a + malloc'd buffer otherwise. */ + + bfd_byte *(*sym_relocate) (struct objfile *, asection *sectp, bfd_byte *buf); + /* Finds the next struct sym_fns. They are allocated and initialized in whatever module implements the functions pointed to; an initializer calls add_symtab_fns to add them to the global @@ -195,6 +202,12 @@ extern void default_symfile_offsets (struct objfile *objfile, extern struct symfile_segment_data *default_symfile_segments (bfd *abfd); +/* The default version of sym_fns.sym_relocate for readers that don't + do anything special. */ + +extern bfd_byte *default_symfile_relocate (struct objfile *objfile, + asection *sectp, bfd_byte *buf); + extern void extend_psymbol_list (struct psymbol_allocation_list *, struct objfile *); @@ -374,8 +387,8 @@ extern void symbol_file_clear (int from_tty); /* Default overlay update function. */ extern void simple_overlay_update (struct obj_section *); -extern bfd_byte *symfile_relocate_debug_section (bfd *abfd, asection *sectp, - bfd_byte * buf); +extern bfd_byte *symfile_relocate_debug_section (struct objfile *, asection *, + bfd_byte *); extern int symfile_map_offsets_to_segments (bfd *, struct symfile_segment_data *, diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 25cc2d992dd..acd7b50ae48 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -3035,6 +3035,7 @@ static struct sym_fns xcoff_sym_fns = default_symfile_segments, /* sym_segments: Get segment information from a file. */ aix_process_linenos, /* sym_read_linetable */ + default_symfile_relocate, /* sym_relocate: Relocate a debug section. */ NULL /* next: pointer to next struct sym_fns */ };