dwarf_begin_elf() won't create handle without .debug_* sections
Thu May 24 16:28:00 GMT 2018
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