public inbox for elfutils@sourceware.org
 help / color / mirror / Atom feed
From: Sasha Da Rocha Pinheiro <darochapinhe@wisc.edu>
To: Mark Wielaard <mark@klomp.org>,
	"elfutils-devel@sourceware.org"	<elfutils-devel@sourceware.org>
Subject: Re: dwarf_begin_elf() won't create handle without .debug_* sections
Date: Wed, 30 May 2018 17:32:00 -0000	[thread overview]
Message-ID: <BN6PR06MB293237A6F4E88363011B1EF4A66C0@BN6PR06MB2932.namprd06.prod.outlook.com> (raw)
In-Reply-To: <1527179307.2911.23.camel@klomp.org>

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.

Sasha

 
From: Mark Wielaard <mark@klomp.org>
Sent: Thursday, May 24, 2018 11:28 AM
To: Sasha Da Rocha Pinheiro; elfutils-devel@sourceware.org
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:
>     https://sourceware.org/git/?p=elfutils.git;a=blob;f=libdw/dwarf_b
> egin_elf.c;hb=144b73c49acf3ed894e4635aedb9b0d1208ade2e#l50
> 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))
    {
      Dwarf_Sig8_Hash_free (&result->sig8_hash);
      __libdw_seterrno (DWARF_E_NO_DWARF);
      free (result);
      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
cases.

> So, the functions 
>     dwarf_cfi_addrframe, 
>     dwarf_frame_info, 
>     dwarf_frame_cfa, and
>     dwarf_frame_register
> will get info from .debug_frame while dwarf_next_cfi can get info
> either from .debug_frame or .gcc_except_table, but without some
> abstractions?
> 
> Since
>     /* 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.

Cheers,

Mark
    

  reply	other threads:[~2018-05-30 17:32 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-23 20:09 Sasha Da Rocha Pinheiro
2018-05-24 16:28 ` Mark Wielaard
2018-05-30 17:32   ` Sasha Da Rocha Pinheiro [this message]
2018-06-01 11:10     ` Mark Wielaard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=BN6PR06MB293237A6F4E88363011B1EF4A66C0@BN6PR06MB2932.namprd06.prod.outlook.com \
    --to=darochapinhe@wisc.edu \
    --cc=elfutils-devel@sourceware.org \
    --cc=mark@klomp.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).