diff options
author | Alan Modra <amodra@gmail.com> | 2014-04-24 21:59:56 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2014-04-24 22:04:05 +0930 |
commit | 93ee1e3683a12f4774b8beb4f821910982e21ce2 (patch) | |
tree | b98ee67b8b76663f5e048a0188aaa1835f4d830b /bfd/simple.c | |
parent | aaca88efb450bff71523d7d6f23a67f47a4d5fb3 (diff) | |
download | gdb-93ee1e3683a12f4774b8beb4f821910982e21ce2.zip gdb-93ee1e3683a12f4774b8beb4f821910982e21ce2.tar.gz gdb-93ee1e3683a12f4774b8beb4f821910982e21ce2.tar.bz2 |
PR16867, linking object with separate debug file
This teaches the DWARF2 find_line functions how to deal with separate
debug relocatable object files. Also fixes a major bug:
When _bfd_dwarf2_slurp_debug_info was split out, place_sections ran
after .debug_info was relocated. This defeated the whole purpose of
place_sections. See the comment I added before place_sections.
Fixes some minor bugs too:
- place_sections didn't set VMA for alloc but non-load sections (bss).
- zero size sections can have symbols, so they need their VMA set too.
- last_vma was incorrectly adjusted.
- my last change to place_sections left VMA unchanged for .debug_info
when the linker has mapped input to output sections, but this is
wrong since bfd_simple_get_relocated_section_contents unmaps debug
sections.
PR 16867
* dwarf2.c: Formatting.
(struct dwarf2_debug): Make adjusted_section_count signed.
(unset_sections): Make i signed.
(set_debug_vma): New function.
(place_sections): Handle separate debug object file. Set VMA
on debug sections, even if they have an output section. Also
set VMA on zero size sections, and non-load but alloc sections.
Set adjusted_section_count to -1 when no section adjustment.
Malloc adjusted_sections. Don't double last_vma. Transfer
alloc section VMAs to separate debug file.
(_bfd_dwarf2_cleanup_debug_info): Free adjusted_sections.
(_bfd_dwarf2_slurp_debug_info): Add do_place parameter. Drop
test on symbols being the same before using old stash. Read
and use separate debug file symbols. Call place_sections.
(find_line): Don't call place_sections here.
* libbfd-in.h (_bfd_dwarf2_slurp_debug_info): Update proto.
* libbfd.h: Regenerate.
* mach-o.c (bfd_mach_o_find_nearest_line): Adjust
_bfd_dwarf2_slurp_debug_info call.
* simple.c (simple_save_output_info): Clarify comment.
Diffstat (limited to 'bfd/simple.c')
-rw-r--r-- | bfd/simple.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/bfd/simple.c b/bfd/simple.c index 55a5554..1331f9b 100644 --- a/bfd/simple.c +++ b/bfd/simple.c @@ -106,6 +106,22 @@ struct saved_offsets struct saved_output_info *sections; }; +/* The sections in ABFD may already have output sections and offsets + set if we are here during linking. + + DWARF-2 specifies offsets into debug sections in many cases and + bfd_simple_get_relocated_section_contents is called to relocate + debug info for a single relocatable object file. So we want + offsets relative to that object file's sections, not offsets in the + output file. For that reason, reset a debug section->output_offset + to zero. + + If not called during linking then set section->output_section to + point back to the input section, because output_section must not be + NULL when calling the relocation routines. + + Save the original output offset and section to restore later. */ + static void simple_save_output_info (bfd *abfd ATTRIBUTE_UNUSED, asection *section, @@ -220,15 +236,6 @@ bfd_simple_get_relocated_section_contents (bfd *abfd, outbuf = data; } - /* The sections in ABFD may already have output sections and offsets set. - Because this function is primarily for debug sections, and GCC uses the - knowledge that debug sections will generally have VMA 0 when emitting - relocations between DWARF-2 sections (which are supposed to be - section-relative offsets anyway), we need to reset the output offsets - to zero. We also need to arrange for section->output_section->vma plus - section->output_offset to equal section->vma, which we do by setting - section->output_section to point back to section. Save the original - output offset and output section to restore later. */ saved_offsets.section_count = abfd->section_count; saved_offsets.sections = malloc (sizeof (*saved_offsets.sections) * saved_offsets.section_count); |