From: "Metzger, Markus T" <markus.t.metzger@intel.com>
To: Alan Modra <amodra@gmail.com>, Pedro Alves <palves@redhat.com>
Cc: Mark Wielaard <mjw@redhat.com>,
Cary Coutant <ccoutant@google.com>, "Doug Evans" <dje@google.com>,
"gdb@sourceware.org" <gdb@sourceware.org>,
"binutils@sourceware.org" <binutils@sourceware.org>
Subject: RE: vdso handling
Date: Tue, 18 Mar 2014 15:14:00 -0000 [thread overview]
Message-ID: <A78C989F6D9628469189715575E55B230AAB6B17@IRSMSX103.ger.corp.intel.com> (raw)
In-Reply-To: <20140313235347.GD3384@bubble.grove.modra.org>
> -----Original Message-----
> From: Alan Modra [mailto:amodra@gmail.com]
> Sent: Friday, March 14, 2014 12:54 AM
> OK, so I think Markus should be looking at why bfd_from_remote_memory
> decides to exclude the section headers. ie. why the following code
> is being executed
>
> /* If the segments visible in memory didn't include the section headers,
> then clear them from the file header. */
> if ((bfd_vma) contents_size < (i_ehdr.e_shoff
> + i_ehdr.e_shnum * i_ehdr.e_shentsize))
> {
> memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
> memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
> memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
> }
>
> It may be that we can tweak the heuristic. One thing I noticed is
> that the following
>
> /* Trim the last segment so we don't bother with zeros in the last page
> that are off the end of the file. However, if the extra bit in that
> page includes the section headers, keep them. */
>
> will trim off .symtab which might otherwise be available. GNU ld places
> .symtab after the section headers.
Something like this?
diff --git a/bfd/elfcode.h b/bfd/elfcode.h
index 20101be..601d7ea 100644
--- a/bfd/elfcode.h
+++ b/bfd/elfcode.h
@@ -1616,7 +1616,7 @@ NAME(_bfd_elf,bfd_from_remote_memory)
bfd_byte *contents;
int err;
unsigned int i;
- bfd_vma loadbase;
+ bfd_vma loadbase, shdr_begin, shdr_end;
bfd_boolean loadbase_set;
/* Read in the ELF header in external format. */
@@ -1728,20 +1728,16 @@ NAME(_bfd_elf,bfd_from_remote_memory)
}
/* Trim the last segment so we don't bother with zeros in the last page
- that are off the end of the file. However, if the extra bit in that
- page includes the section headers, keep them. */
- if ((bfd_vma) contents_size > last_phdr->p_offset + last_phdr->p_filesz
- && (bfd_vma) contents_size >= (i_ehdr.e_shoff
- + i_ehdr.e_shnum * i_ehdr.e_shentsize))
- {
- contents_size = last_phdr->p_offset + last_phdr->p_filesz;
- if ((bfd_vma) contents_size < (i_ehdr.e_shoff
- + i_ehdr.e_shnum * i_ehdr.e_shentsize))
- contents_size = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
- }
- else
+ that are off the end of the file. */
+ if ((bfd_vma) contents_size > last_phdr->p_offset + last_phdr->p_filesz)
contents_size = last_phdr->p_offset + last_phdr->p_filesz;
+ /* Keep the section headers. */
+ shdr_begin = i_ehdr.e_shoff;
+ shdr_end = shdr_begin + i_ehdr.e_shnum * i_ehdr.e_shentsize;
+ if (shdr_end > (bfd_vma) contents_size)
+ contents_size = shdr_end;
+
/* Now we know the size of the whole image we want read in. */
contents = (bfd_byte *) bfd_zmalloc (contents_size);
if (contents == NULL)
@@ -1773,18 +1769,19 @@ NAME(_bfd_elf,bfd_from_remote_memory)
}
free (x_phdrs);
- /* If the segments visible in memory didn't include the section headers,
- then clear them from the file header. */
- if ((bfd_vma) contents_size < (i_ehdr.e_shoff
- + i_ehdr.e_shnum * i_ehdr.e_shentsize))
- {
- memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
- memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
- memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
- }
+ /* Copy the section headers. */
+ err = target_read_memory (ehdr_vma + shdr_begin,
+ contents + shdr_begin, shdr_end - shdr_begin);
+ if (err)
+ {
+ free (contents);
+ bfd_set_error (bfd_error_system_call);
+ errno = err;
+ return NULL;
+ }
/* This will normally have been in the first PT_LOAD segment. But it
- conceivably could be missing, and we might have just changed it. */
+ conceivably could be missing. */
memcpy (contents, &x_ehdr, sizeof x_ehdr);
/* Now we have a memory image of the ELF file contents. Make a BFD. */
Would it be OK to send this patch as part of a GDB patch series with
binutils-patches and you CC'ed? Or do you want a separate patch
only to binutils-patches?
This patch alone runs without new fails in the gdb and binutils suite
on x86-64 Fedora 19. For the latter I ran "make check" from
$build/binutils, where $build is my build directory from I which I called
configure.
In combination with my other GDB changes, it shows regressions in
gdb.base/break-interp.exp. I'll send the patch once I fixed them.
thanks,
Markus.
Intel GmbH
Dornacher Strasse 1
85622 Feldkirchen/Muenchen, Deutschland
Sitz der Gesellschaft: Feldkirchen bei Muenchen
Geschaeftsfuehrer: Christian Lamprechter, Hannes Schwaderer, Douglas Lusk
Registergericht: Muenchen HRB 47456
Ust.-IdNr./VAT Registration No.: DE129385895
Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052
next prev parent reply other threads:[~2014-03-18 15:14 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-10 13:05 Metzger, Markus T
2014-03-12 7:17 ` Alan Modra
2014-03-12 11:31 ` Mike Frysinger
2014-03-12 17:34 ` Doug Evans
2014-03-12 20:23 ` Cary Coutant
2014-03-13 1:01 ` Alan Modra
2014-03-13 8:25 ` Metzger, Markus T
2014-03-13 9:48 ` Metzger, Markus T
2014-03-13 10:07 ` Pedro Alves
2014-03-13 10:46 ` Pedro Alves
2014-06-01 20:32 ` Samuel Bronson
2014-06-06 12:45 ` Pedro Alves
2014-03-13 13:13 ` Alan Modra
2014-03-13 9:52 ` Mark Wielaard
2014-03-13 13:03 ` Alan Modra
2014-03-13 14:38 ` Mark Wielaard
2014-03-13 14:59 ` Pedro Alves
2014-03-13 15:04 ` Pedro Alves
2014-03-13 15:26 ` Pedro Alves
2014-03-13 23:53 ` Alan Modra
2014-03-18 15:14 ` Metzger, Markus T [this message]
2014-03-18 23:10 ` Alan Modra
2014-03-19 8:11 ` Metzger, Markus T
2014-03-19 8:31 ` Metzger, Markus T
2014-03-19 12:04 ` Pedro Alves
2014-03-20 2:00 ` Alan Modra
2014-03-21 15:55 ` Pedro Alves
2014-03-26 9:32 ` Metzger, Markus T
2014-03-19 12:03 ` Pedro Alves
2014-03-20 1:33 ` Alan Modra
2014-03-21 8:10 ` Metzger, Markus T
2014-03-21 15:48 ` Pedro Alves
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=A78C989F6D9628469189715575E55B230AAB6B17@IRSMSX103.ger.corp.intel.com \
--to=markus.t.metzger@intel.com \
--cc=amodra@gmail.com \
--cc=binutils@sourceware.org \
--cc=ccoutant@google.com \
--cc=dje@google.com \
--cc=gdb@sourceware.org \
--cc=mjw@redhat.com \
--cc=palves@redhat.com \
/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