From: Pedro Alves <palves@redhat.com>
To: "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 13:38:00 -0000 [thread overview]
Message-ID: <53357B30.6040006@redhat.com> (raw)
In-Reply-To: <20140328061321.GU18201@bubble.grove.modra.org>
On 03/28/2014 06:13 AM, Alan Modra wrote:
> On Fri, Mar 21, 2014 at 03:48:48PM +0000, Pedro Alves wrote:
>> I just tried pointing add-symbol-file-from-memory at an already
>> mapped DSO's elf header, but it doesn't work as is unfortunately:
>>
>> (gdb) info shared curses
>> 0x000000324d006d20 0x000000324d01df58 Yes /lib64/libncurses.so.5
>> (gdb) x /4b 0x000000324d000000
>> 0x324d000000: 127 69 76 70
>> (gdb) add-symbol-file-from-memory 0x000000324d000000
>> Failed to read a valid object file image from memory.
>>
>> I single stepped a little through
>> bfd_elf_bfd_from_remote_memory - something goes wrong with the
>> reading of the load segment contents, probably something wrong
>> with the address computations.
>
> readelf -a --wide on my x86_64 libncurses.so.5 shows
>
> [snip]
> Start of section headers: 132144 (bytes into file)
> [snip]
> [25] .shstrtab STRTAB 0000000000000000 02034c 0000de 00 0 0 1
> [snip]
> LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x01efe4 0x01efe4 R E 0x200000
> LOAD 0x01fd50 0x000000000021fd50 0x000000000021fd50 0x0005e4 0x000770 RW 0x200000
>
> So .shstrtab and the section headers might have been loaded by the
> second PT_LOAD header, *but* the second PT_LOAD has a bss area.
> Anything past 0x220334 will be cleared out by ld.so. No chance of
> getting at section headers then, and this will be true for most
> in-memory images.
Indeed.
> bfd_from_remote_memory should take note of p_memsz.. Hmm, and there
> are quite a few other issues there too, most notably that p_align
> on x86_64 these days tends to be *much* larger than the page size used
> by ld.so.
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.
This patch on top of yours makes things work for me:
---
bfd/elfcode.h | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/bfd/elfcode.h b/bfd/elfcode.h
index 31f67a8..974c8b4 100644
--- a/bfd/elfcode.h
+++ b/bfd/elfcode.h
@@ -1622,6 +1622,7 @@ NAME(_bfd_elf,bfd_from_remote_memory)
bfd_vma shdr_end;
bfd_vma loadbase;
bfd_boolean loadbase_set;
+ bfd_vma page_size;
/* Read in the ELF header in external format. */
err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
@@ -1693,6 +1694,7 @@ NAME(_bfd_elf,bfd_from_remote_memory)
}
i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
+ page_size = get_elf_backend_data (templ)->minpagesize;
high_offset = 0;
last_phdr = NULL;
loadbase = 0;
@@ -1753,7 +1755,6 @@ NAME(_bfd_elf,bfd_from_remote_memory)
high_offset = shdr_end;
else
{
- bfd_vma page_size = get_elf_backend_data (templ)->minpagesize;
bfd_vma segment_end = last_phdr->p_offset + last_phdr->p_filesz;
/* Assume we loaded full pages, allowing us to sometimes see
@@ -1781,15 +1782,14 @@ NAME(_bfd_elf,bfd_from_remote_memory)
if (i_phdrs[i].p_type == PT_LOAD)
{
bfd_vma start = i_phdrs[i].p_offset;
- bfd_vma end = start + i_phdrs[i].p_filesz;
bfd_vma vaddr = i_phdrs[i].p_vaddr;
+ bfd_vma end = start + i_phdrs[i].p_filesz;
- if (i_phdrs[i].p_align > 1)
- {
- 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;
- }
+ /* Assume we loaded full pages, allowing us to sometimes see
+ section headers. */
+ start &= -page_size;
+ vaddr &= -page_size;
+ end = (end + page_size - 1) & -page_size;
if (end > high_offset)
end = high_offset;
err = target_read_memory (loadbase + vaddr,
--
1.7.11.7
> Gah, I've been sucked into looking at this long enough that I may as
> well fix it. Does this look OK?
It does to me. Thanks!
--
Pedro Alves
next prev parent reply other threads:[~2014-03-28 13:38 UTC|newest]
Thread overview: 41+ 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 23:45 ` 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
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
2014-03-28 6:13 ` Alan Modra
2014-03-28 13:38 ` Pedro Alves [this message]
2014-03-28 23:00 ` Alan Modra
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=53357B30.6040006@redhat.com \
--to=palves@redhat.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 \
/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).