diff options
author | Joel Brobecker <brobecker@gnat.com> | 2011-07-04 16:30:09 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2011-07-04 16:30:09 +0000 |
commit | d40102a1411e683e04c82ce10beb061aac90ae14 (patch) | |
tree | 847d5c5d31d0312db5665f90100765b07e97106a | |
parent | 2f741504c04f9990ad984819c089c212b42ca8a5 (diff) | |
download | gdb-d40102a1411e683e04c82ce10beb061aac90ae14.zip gdb-d40102a1411e683e04c82ce10beb061aac90ae14.tar.gz gdb-d40102a1411e683e04c82ce10beb061aac90ae14.tar.bz2 |
Do not load .eh_frame section from separete object files
We don't need to read the .eh_frame section from the separate
object files, because this data is already present in the
main executable (it needs to, or the program wouldn't work).
We discovered this investigating a problem with the 'next' command,
which was due to unwind failures, which came from the fact that
the .eh_frame was incorrectly relocated.
gdb/ChangeLog (Tristan Gingold):
* dwarf2-frame.c (dwarf2_build_frame_info): Do not load .eh_frame
section in separate object files.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/dwarf2-frame.c | 67 |
2 files changed, 41 insertions, 31 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c9e36ff..3e63d48 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2011-07-04 Joel Brobecker <brobecker@adacore.com> + + * dwarf2-frame.c (dwarf2_build_frame_info): Do not load .eh_frame + section in separate object files. + 2011-07-04 Jan Kratochvil <jan.kratochvil@redhat.com> Fix false GCC warning. diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index 5df3488..b68a773 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -2227,39 +2227,44 @@ dwarf2_build_frame_info (struct objfile *objfile) unit->dbase = 0; unit->tbase = 0; - dwarf2_get_section_info (objfile, DWARF2_EH_FRAME, - &unit->dwarf_frame_section, - &unit->dwarf_frame_buffer, - &unit->dwarf_frame_size); - if (unit->dwarf_frame_size) + if (objfile->separate_debug_objfile_backlink == NULL) { - asection *got, *txt; - - /* FIXME: kettenis/20030602: This is the DW_EH_PE_datarel base - that is used for the i386/amd64 target, which currently is - the only target in GCC that supports/uses the - DW_EH_PE_datarel encoding. */ - got = bfd_get_section_by_name (unit->abfd, ".got"); - if (got) - unit->dbase = got->vma; - - /* GCC emits the DW_EH_PE_textrel encoding type on sh and ia64 - so far. */ - txt = bfd_get_section_by_name (unit->abfd, ".text"); - if (txt) - unit->tbase = txt->vma; - - frame_ptr = unit->dwarf_frame_buffer; - while (frame_ptr < unit->dwarf_frame_buffer + unit->dwarf_frame_size) - frame_ptr = decode_frame_entry (unit, frame_ptr, 1, - &cie_table, &fde_table); - - if (cie_table.num_entries != 0) + /* Do not read .eh_frame from separate file as they must be also + present in the main file. */ + dwarf2_get_section_info (objfile, DWARF2_EH_FRAME, + &unit->dwarf_frame_section, + &unit->dwarf_frame_buffer, + &unit->dwarf_frame_size); + if (unit->dwarf_frame_size) { - /* Reinit cie_table: debug_frame has different CIEs. */ - xfree (cie_table.entries); - cie_table.num_entries = 0; - cie_table.entries = NULL; + asection *got, *txt; + + /* FIXME: kettenis/20030602: This is the DW_EH_PE_datarel base + that is used for the i386/amd64 target, which currently is + the only target in GCC that supports/uses the + DW_EH_PE_datarel encoding. */ + got = bfd_get_section_by_name (unit->abfd, ".got"); + if (got) + unit->dbase = got->vma; + + /* GCC emits the DW_EH_PE_textrel encoding type on sh and ia64 + so far. */ + txt = bfd_get_section_by_name (unit->abfd, ".text"); + if (txt) + unit->tbase = txt->vma; + + frame_ptr = unit->dwarf_frame_buffer; + while (frame_ptr < unit->dwarf_frame_buffer + unit->dwarf_frame_size) + frame_ptr = decode_frame_entry (unit, frame_ptr, 1, + &cie_table, &fde_table); + + if (cie_table.num_entries != 0) + { + /* Reinit cie_table: debug_frame has different CIEs. */ + xfree (cie_table.entries); + cie_table.num_entries = 0; + cie_table.entries = NULL; + } } } |