From: Alan Modra <amodra@gmail.com>
To: Pedro Alves <palves@redhat.com>
Cc: "Metzger, Markus T" <markus.t.metzger@intel.com>,
Mark Wielaard <mjw@redhat.com>,
Cary Coutant <ccoutant@google.com>, Doug Evans <dje@google.com>,
gdb-patches@sourceware.org, binutils@sourceware.org
Subject: Re: vdso handling
Date: Fri, 28 Mar 2014 23:00:00 -0000 [thread overview]
Message-ID: <20140328230037.GW18201@bubble.grove.modra.org> (raw)
In-Reply-To: <53357B30.6040006@redhat.com>
On Fri, Mar 28, 2014 at 01:37:52PM +0000, Pedro Alves wrote:
> Hmm. Indeed. With current mainline, and with your patch as is,
> the command still fails for me. In fact, it turns out
> exactly related to p_align vs page size.
>
> $ cat /proc/30669/maps | grep ncurses
> 324d000000-324d023000 r-xp 00000000 fd:01 315662 /usr/lib64/libncurses.so.5.9
> 324d023000-324d222000 ---p 00023000 fd:01 315662 /usr/lib64/libncurses.so.5.9
> 324d222000-324d223000 r--p 00022000 fd:01 315662 /usr/lib64/libncurses.so.5.9
> 324d223000-324d224000 rw-p 00023000 fd:01 315662 /usr/lib64/libncurses.so.5.9
>
> So when trying to read the second PT_LOAD with p_vmaddr 324d222cf8
> and p_vmaddr+p_filesz 324d2236b4, (the 3rd and 4th region above),
> we'd end up reading from 324d200000 to 324d2236b4:
>
> (top-gdb) p /x loadbase + vaddr
> $5 = 0x324d200000
> (top-gdb) p /x end
> $6 = 0x236b4
> (top-gdb) p /x loadbase + vaddr + end
> $8 = 0x324d2236b4
>
> which fails as it hits the (324d023000-324d222000) region,
> which has no permissions.
Ah ha! What's more, if the read did happen to succeed you'd overwrite
contents written when processing the first PT_LOAD. I believe that
will still happen with your fixup patch. Not that it's a problem,
since ld.so reads the page holding the end of the first PT_LOAD and
the beginning of the second PT_LOAD twice, but I think it would be
better if BFD didn't rely on this ld.so behaviour (and an exact match
between BFD and ld.so's page size).
I believe the intent of rounding to a page was to pick up the file
and program headers at the start of a file and section headers at the
end, so let's do just that. On top of my last patch:
diff --git a/bfd/elfcode.h b/bfd/elfcode.h
index 31f67a8..a005948 100644
--- a/bfd/elfcode.h
+++ b/bfd/elfcode.h
@@ -1612,7 +1612,7 @@ NAME(_bfd_elf,bfd_from_remote_memory)
Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
Elf_External_Phdr *x_phdrs;
- Elf_Internal_Phdr *i_phdrs, *last_phdr;
+ Elf_Internal_Phdr *i_phdrs, *last_phdr, *first_phdr;
bfd *nbfd;
struct bfd_in_memory *bim;
bfd_byte *contents;
@@ -1621,7 +1621,6 @@ NAME(_bfd_elf,bfd_from_remote_memory)
bfd_vma high_offset;
bfd_vma shdr_end;
bfd_vma loadbase;
- bfd_boolean loadbase_set;
/* Read in the ELF header in external format. */
err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
@@ -1694,9 +1693,9 @@ NAME(_bfd_elf,bfd_from_remote_memory)
i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
high_offset = 0;
- last_phdr = NULL;
loadbase = 0;
- loadbase_set = FALSE;
+ first_phdr = NULL;
+ last_phdr = NULL;
for (i = 0; i < i_ehdr.e_phnum; ++i)
{
elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
@@ -1712,7 +1711,7 @@ NAME(_bfd_elf,bfd_from_remote_memory)
/* If this program header covers offset zero, where the file
header sits, then we can figure out the loadbase. */
- if (!loadbase_set)
+ if (first_phdr == NULL)
{
bfd_vma p_offset = i_phdrs[i].p_offset;
bfd_vma p_vaddr = i_phdrs[i].p_vaddr;
@@ -1725,7 +1724,7 @@ NAME(_bfd_elf,bfd_from_remote_memory)
if (p_offset == 0)
{
loadbase = ehdr_vma - p_vaddr;
- loadbase_set = TRUE;
+ first_phdr = &i_phdrs[i];
}
}
}
@@ -1784,13 +1783,15 @@ NAME(_bfd_elf,bfd_from_remote_memory)
bfd_vma end = start + i_phdrs[i].p_filesz;
bfd_vma vaddr = i_phdrs[i].p_vaddr;
- if (i_phdrs[i].p_align > 1)
+ /* Extend the beginning of the first pt_load to cover file
+ header and program headers. */
+ if (first_phdr == &i_phdrs[i])
{
- start &= -i_phdrs[i].p_align;
- end = (end + i_phdrs[i].p_align - 1) & -i_phdrs[i].p_align;
- vaddr &= -i_phdrs[i].p_align;
+ vaddr -= start;
+ start = 0;
}
- if (end > high_offset)
+ /* Extend the end of the last pt_load to cover section headers. */
+ if (last_phdr == &i_phdrs[i])
end = high_offset;
err = target_read_memory (loadbase + vaddr,
contents + start, end - start);
--
Alan Modra
Australia Development Lab, IBM
next prev parent reply other threads:[~2014-03-28 23:00 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20140313130322.GA3384@bubble.grove.modra.org>
[not found] ` <5321C7C8.6000707@redhat.com>
[not found] ` <5321C8FA.40708@gmail.com>
[not found] ` <5321CE1A.20509@redhat.com>
[not found] ` <20140313235347.GD3384@bubble.grove.modra.org>
[not found] ` <A78C989F6D9628469189715575E55B230AAB6B17@IRSMSX103.ger.corp.intel.com>
[not found] ` <20140318230939.GA9145@bubble.grove.modra.org>
[not found] ` <5329879C.6070805@redhat.com>
[not found] ` <20140320013305.GA13347@bubble.grove.modra.org>
[not found] ` <532C5F60.80700@redhat.com>
2014-03-28 6:13 ` Alan Modra
2014-03-28 13:38 ` Pedro Alves
2014-03-28 23:00 ` Alan Modra [this message]
2014-04-01 13:46 ` Pedro Alves
2014-04-02 1:50 ` Alan Modra
2014-04-02 8:05 ` Metzger, Markus T
2014-04-02 8:04 ` Hans-Peter Nilsson
2014-04-03 1:06 ` Alan Modra
2014-04-03 1:46 ` Alan Modra
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=20140328230037.GW18201@bubble.grove.modra.org \
--to=amodra@gmail.com \
--cc=binutils@sourceware.org \
--cc=ccoutant@google.com \
--cc=dje@google.com \
--cc=gdb-patches@sourceware.org \
--cc=markus.t.metzger@intel.com \
--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