aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2014-04-24 21:59:56 +0930
committerAlan Modra <amodra@gmail.com>2014-04-24 22:04:05 +0930
commit93ee1e3683a12f4774b8beb4f821910982e21ce2 (patch)
treeb98ee67b8b76663f5e048a0188aaa1835f4d830b /bfd/simple.c
parentFix a problem building the ARM assembler for non-ELF based toolchains. (diff)
downloadbinutils-gdb-93ee1e3683a12f4774b8beb4f821910982e21ce2.tar.gz
binutils-gdb-93ee1e3683a12f4774b8beb4f821910982e21ce2.tar.bz2
binutils-gdb-93ee1e3683a12f4774b8beb4f821910982e21ce2.zip
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.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/bfd/simple.c b/bfd/simple.c
index 55a5554e4e5..1331f9b61e9 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);