dwarf_begin_elf() won't create handle without .debug_* sections
Sasha Da Rocha Pinheiro
Wed May 30 17:32:00 GMT 2018
I certainly could help with the testing, but I would need help on them, to figure all cases we would cover.
I just fixed something interesting in Dyninst. We were assuming that the FDEs were following the CIE in the eh_frame section, but this is not correct. I found them mixed in an ARM binary and this caused wrong parsing.
So we I did dwarf_next_cfi() in the loop to go through the FDE's, and I had to use it again in the loop to get the corresponding CIE. I don't think it's a problem, just kinda not intuitive, for who wants to understand after me.
I thought you would like to know about this mixed FDEs possibility.
From: Mark Wielaard <firstname.lastname@example.org>
Sent: Thursday, May 24, 2018 11:28 AM
To: Sasha Da Rocha Pinheiro; email@example.com
Subject: Re: dwarf_begin_elf() won't create handle without .debug_* sections
On Wed, 2018-05-23 at 20:09 +0000, Sasha Da Rocha Pinheiro wrote:
> Hi all,
> I have some binaries that do not have .debug_* sections but have
> .eh_frame and .gcc_except_table.
> Looking at:
> it seems that dwarf_begin_elf() will not create a Dwarf handle for
> this file. Am I correct?
Yes, this is correct. libdw relies on having at least a .debug_info
section. See the valid_p () function:
/* We looked at all the sections. Now determine whether all the
sections with debugging information we need are there.
XXX Which sections are absolutely necessary? Add tests if
necessary. For now we require only .debug_info. Hopefully this
is correct. */
if (likely (result != NULL)
&& unlikely (result->sectiondata[IDX_debug_info] == NULL))
result = NULL;
I have been a little reluctant to change this because I am afraid that
there is code that relies on at least sectiondata[IDX_debug_info] never
being NULL. And in general (you point out exceptions below) most libdw
data structures rely on having an associated DWARF CU DIE (which will
come from the .debug_info section).
But I certainly wouldn't mind if someone did some testing and changed
the above "sanity" check to allow to create a Dwarf *handle in more
> So, the functions
> dwarf_frame_cfa, and
> will get info from .debug_frame while dwarf_next_cfi can get info
> either from .debug_frame or .gcc_except_table, but without some
> /* Opaque type representing a CFI section found in a DWARF or ELF
> file. */
> typedef struct Dwarf_CFI_s Dwarf_CFI;
> can we say Dwarf_CFI is only about .debug_frame? Even though
> dwarf_next_cfi uses Dwarf_CFI_Entry but not Dwarf_CFI?
> I know .eh_frame has slightly different format from .debug_frame, and
> it's not defined by the DWARF specification but LSB, so is it the
> reason why this is kinda confusing?
Right. But note that dwarf_getcfi_elf () (unlike every other dwarf_...
function) takes an Elf *handle, not a Dwarf *handle.
So given an Elf *elf handle gotten with elf_begin () you can do:
Dwarf_CFI *cfi = dwarf_getcfi_elf (elf);
And then use that cfi with dwarf_cfi_addrframe () to get a Dwarf_Frame
*, which you can then use with dwarf_frame_register (), etc. They don't
care whether the CFI came from a Dwarf .debug_frame or Elf .eh_frame.
More information about the Elfutils-devel