summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2018-10-29 16:21:26 +0100
committerMark Wielaard <mark@klomp.org>2018-11-09 17:51:30 +0100
commit825e48c4e942e3cbdab1b75c04b8c014867d66ab (patch)
tree1dfe83deeb5d378f58c4d327633b059928ba2b6e
parent4789e0fb92b03c3d8de548489c871d17f8f35cd0 (diff)
Also find CFI in sections of type SHT_X86_64_UNWIND
On my system with g++ (GCC) 8.2.1 20180831 with GNU gold (GNU Binutils 2.31.1) 1.16, the .eh_frame section does not have type PROGBITS but rather is using X86_64_UNWIND nowadays: ``` $ echo "int main(){ return 0; }" > test.c $ gcc test.c $ readelf --sections a.out | grep .eh_frame [14] .eh_frame X86_64_UNWIND 0000000000000670 00000670 [15] .eh_frame_hdr X86_64_UNWIND 0000000000000724 00000724 ``` Without this patch, libdw refuses to use the available unwind information, leading to broken backtraces while unwinding. With the patch applied, unwinding works once more in such situations. Signed-off-by: Milian Wolff <milian.wolff@kdab.com> Signed-off-by: Mark Wielaard <mark@klomp.org> Tested-by: Milian Wolff <milian.wolff@kdab.com>
-rw-r--r--libdw/ChangeLog4
-rw-r--r--libdw/dwarf_getcfi_elf.c2
2 files changed, 5 insertions, 1 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index ebe002cd..627fddeb 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,7 @@
+2018-10-29 Milian Wolff <milian.wolff@kdab.com>
+
+ * dwarf_getcfi_elf.c (getcfi_shdr): Check sh_type != SHT_NOBITS.
+
2018-09-13 Mark Wielaard <mark@klomp.org>
* dwarf_begin_elf.c (check_section): Drop ehdr argument, add and
diff --git a/libdw/dwarf_getcfi_elf.c b/libdw/dwarf_getcfi_elf.c
index 315cc02f..adcaea03 100644
--- a/libdw/dwarf_getcfi_elf.c
+++ b/libdw/dwarf_getcfi_elf.c
@@ -298,7 +298,7 @@ getcfi_shdr (Elf *elf, const GElf_Ehdr *ehdr)
}
else if (!strcmp (name, ".eh_frame"))
{
- if (shdr->sh_type == SHT_PROGBITS)
+ if (shdr->sh_type != SHT_NOBITS)
return getcfi_scn_eh_frame (elf, ehdr, scn, shdr,
hdr_scn, hdr_vaddr);
else