diff options
author | Milian Wolff <milian.wolff@kdab.com> | 2018-10-29 16:21:26 +0100 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2018-11-09 17:51:30 +0100 |
commit | 825e48c4e942e3cbdab1b75c04b8c014867d66ab (patch) | |
tree | 1dfe83deeb5d378f58c4d327633b059928ba2b6e /libdw | |
parent | 4789e0fb92b03c3d8de548489c871d17f8f35cd0 (diff) | |
download | elfutils-825e48c4e942e3cbdab1b75c04b8c014867d66ab.tar.gz |
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>
Diffstat (limited to 'libdw')
-rw-r--r-- | libdw/ChangeLog | 4 | ||||
-rw-r--r-- | libdw/dwarf_getcfi_elf.c | 2 |
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 |