* vdso handling
@ 2014-03-10 13:05 Metzger, Markus T
2014-03-12 7:17 ` Alan Modra
0 siblings, 1 reply; 32+ messages in thread
From: Metzger, Markus T @ 2014-03-10 13:05 UTC (permalink / raw)
To: gdb, binutils
Hello,
My name is Markus. I work for Intel on GDB in the area of
hardware-supported execution recording.
I noticed that the BFD created for the VDSO (system-provided in-memory
DSO) does not contain any BFD sections. Is this intentional? Or has
there just been no need for them?
If it just hasn't been done, yet, how would I best approach this?
Here's the problem I am trying to solve with this. May as well be
that I'm on the wrong track...
When using the btrace record target, GDB only allows access to
read-only memory during replay. The btrace record target does not
trace data so read-write memory corresponds to the end of the trace,
not the current replay position.
The implementation uses the same check that is also used for
'trust-readonly-sections", i.e.
section = target_section_by_addr (ops, offset);
if (section != NULL)
{
/* Check if the section we found is readonly. */
if ((bfd_get_section_flags (section->the_bfd_section->owner,
section->the_bfd_section)
& SEC_READONLY) != 0)
For the vdso, there is no target section, so the check fails. This
prevents GDB from disassembling vdso instructions during replay.
The vdso is processed in symbol_file_add_from_memory at
gdb/symfile-mem.c:84. It calls bfd_from_remote_memory to create a BFD
for the vdso and then processes it. If there were BFD sections, the
following small patch should add the respective target sections to GDB.
diff --git a/gdb/symfile-mem.c b/gdb/symfile-mem.c
index e3230de..cf4da38 100644
--- a/gdb/symfile-mem.c
+++ b/gdb/symfile-mem.c
@@ -91,6 +91,7 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
struct section_addr_info *sai;
unsigned int i;
struct cleanup *cleanup;
+ struct target_section *sections, *sections_end, *tsec;
if (bfd_get_flavour (templ) != bfd_target_elf_flavour)
error (_("add-symbol-file-from-memory not supported for this target"));
@@ -113,6 +114,22 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
error (_("Got object file from memory but can't read symbols: %s."),
bfd_errmsg (bfd_get_error ()));
+ /* Add target sections for this bfd. */
+ sections = NULL;
+ sections_end = NULL;
+ if (build_section_table (nbfd, §ions, §ions_end))
+ error (_("Failed to build section table"));
+
+ /* Adjust the target section addresses by the load address. */
+ for (tsec = sections; tsec != sections_end; ++tsec)
+ {
+ tsec->addr += loadbase;
+ tsec->endaddr += loadbase;
+ }
+
+ add_target_sections (&nbfd, sections, sections_end);
+ xfree (sections);
+
sai = alloc_section_addr_info (bfd_count_sections (nbfd));
make_cleanup (xfree, sai);
i = 0;
This should allow me to pass the above read-only section check and
allow GDB to disassemble vdso instructions.
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
^ permalink raw reply [flat|nested] 32+ messages in thread* Re: vdso handling 2014-03-10 13:05 vdso handling Metzger, Markus T @ 2014-03-12 7:17 ` Alan Modra 2014-03-12 11:31 ` Mike Frysinger 2014-03-12 17:34 ` Doug Evans 0 siblings, 2 replies; 32+ messages in thread From: Alan Modra @ 2014-03-12 7:17 UTC (permalink / raw) To: Metzger, Markus T; +Cc: gdb, binutils On Mon, Mar 10, 2014 at 01:04:33PM +0000, Metzger, Markus T wrote: > I noticed that the BFD created for the VDSO (system-provided in-memory > DSO) does not contain any BFD sections. Is this intentional? Or has > there just been no need for them? [snip] > The vdso is processed in symbol_file_add_from_memory at > gdb/symfile-mem.c:84. It calls bfd_from_remote_memory to create a BFD > for the vdso and then processes it. The underlying cause is that you're trying to debug an ELF binary that only contains the execution view. The linking view (of which the sections are a part) is not loaded, so bfd_from_remote_memory does not have this information. See elfcode.h bfd_from_remote_memory. You can see similar breakage of gdb and binutils if you zap e_shoff, e_shnum, and e_shstrndx of your favourite hello world program. I suppose one way to provide something that gdb and other tools expect would be to treat the vdso like a core file, and create fake sections corresponding to the program headers. I'm not really keen on the idea though, since I know that will open up a can of worms. Can't you point gdb at a file image for the vdso? -- Alan Modra Australia Development Lab, IBM ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-12 7:17 ` Alan Modra @ 2014-03-12 11:31 ` Mike Frysinger 2014-03-12 17:34 ` Doug Evans 1 sibling, 0 replies; 32+ messages in thread From: Mike Frysinger @ 2014-03-12 11:31 UTC (permalink / raw) To: gdb; +Cc: Alan Modra, Metzger, Markus T, binutils [-- Attachment #1: Type: text/plain, Size: 1409 bytes --] On Wed 12 Mar 2014 17:47:02 Alan Modra wrote: > On Mon, Mar 10, 2014 at 01:04:33PM +0000, Metzger, Markus T wrote: > > I noticed that the BFD created for the VDSO (system-provided in-memory > > DSO) does not contain any BFD sections. Is this intentional? Or has > > there just been no need for them? > > [snip] > > > The vdso is processed in symbol_file_add_from_memory at > > gdb/symfile-mem.c:84. It calls bfd_from_remote_memory to create a BFD > > for the vdso and then processes it. > > The underlying cause is that you're trying to debug an ELF binary that > only contains the execution view. The linking view (of which the > sections are a part) is not loaded, so bfd_from_remote_memory does not > have this information. See elfcode.h bfd_from_remote_memory. > > You can see similar breakage of gdb and binutils if you zap e_shoff, > e_shnum, and e_shstrndx of your favourite hello world program. > > I suppose one way to provide something that gdb and other tools expect > would be to treat the vdso like a core file, and create fake sections > corresponding to the program headers. I'm not really keen on the idea > though, since I know that will open up a can of worms. > > Can't you point gdb at a file image for the vdso? i don't think distros generally ship it ? the kernel doesn't install it by default (e.g. into /lib/modules/$(uname -r)/vdso/). -mike [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 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 1 sibling, 1 reply; 32+ messages in thread From: Doug Evans @ 2014-03-12 17:34 UTC (permalink / raw) To: Metzger, Markus T, gdb, binutils On Wed, Mar 12, 2014 at 12:17 AM, Alan Modra <amodra@gmail.com> wrote: > On Mon, Mar 10, 2014 at 01:04:33PM +0000, Metzger, Markus T wrote: >> I noticed that the BFD created for the VDSO (system-provided in-memory >> DSO) does not contain any BFD sections. Is this intentional? Or has >> there just been no need for them? > [snip] >> The vdso is processed in symbol_file_add_from_memory at >> gdb/symfile-mem.c:84. It calls bfd_from_remote_memory to create a BFD >> for the vdso and then processes it. > > The underlying cause is that you're trying to debug an ELF binary that > only contains the execution view. The linking view (of which the > sections are a part) is not loaded, so bfd_from_remote_memory does not > have this information. See elfcode.h bfd_from_remote_memory. > > You can see similar breakage of gdb and binutils if you zap e_shoff, > e_shnum, and e_shstrndx of your favourite hello world program. > > I suppose one way to provide something that gdb and other tools expect > would be to treat the vdso like a core file, and create fake sections > corresponding to the program headers. I'm not really keen on the idea > though, since I know that will open up a can of worms. I think a case can be made that gdb should be able to use the "execution view" of the program here. As for how to achieve that ... "Discuss." :-) ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-12 17:34 ` Doug Evans @ 2014-03-12 20:23 ` Cary Coutant 2014-03-13 1:01 ` Alan Modra 0 siblings, 1 reply; 32+ messages in thread From: Cary Coutant @ 2014-03-12 20:23 UTC (permalink / raw) To: Doug Evans; +Cc: Metzger, Markus T, gdb, binutils > I think a case can be made that gdb should be able to use the > "execution view" of the program here. > As for how to achieve that ... "Discuss." :-) Add a PT_DEBUG program header entry? The PT_DEBUG segment would need to have a small header that allows the debugger to find .debug_abbrev, .debug_info, etc. (i.e., a mini section table). Or, just add individual program header entries for each of the standard debug sections: PT_DEBUG_ABBREV, PT_DEBUG_INFO, etc. -cary ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 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:52 ` Mark Wielaard 0 siblings, 2 replies; 32+ messages in thread From: Alan Modra @ 2014-03-13 1:01 UTC (permalink / raw) To: Cary Coutant; +Cc: Doug Evans, Metzger, Markus T, gdb, binutils On Wed, Mar 12, 2014 at 01:22:58PM -0700, Cary Coutant wrote: > > I think a case can be made that gdb should be able to use the > > "execution view" of the program here. > > As for how to achieve that ... "Discuss." :-) > > Add a PT_DEBUG program header entry? The PT_DEBUG segment would need > to have a small header that allows the debugger to find .debug_abbrev, > .debug_info, etc. (i.e., a mini section table). Or, just add > individual program header entries for each of the standard debug > sections: PT_DEBUG_ABBREV, PT_DEBUG_INFO, etc. Debug sections are not normally loaded. For that reason I don't think it makes any sense to specify program headers for them. It wouldn't help in the vdso case anyway, since the problem there is that you only have the loaded part of the original ELF file. -- Alan Modra Australia Development Lab, IBM ^ permalink raw reply [flat|nested] 32+ messages in thread
* RE: vdso handling 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 9:52 ` Mark Wielaard 1 sibling, 2 replies; 32+ messages in thread From: Metzger, Markus T @ 2014-03-13 8:25 UTC (permalink / raw) To: Alan Modra, Cary Coutant; +Cc: Doug Evans, gdb, binutils > -----Original Message----- > From: Alan Modra [mailto:amodra@gmail.com] > Sent: Thursday, March 13, 2014 2:02 AM > To: Cary Coutant > Cc: Doug Evans; Metzger, Markus T; gdb@sourceware.org; > binutils@sourceware.org > Subject: Re: vdso handling > > On Wed, Mar 12, 2014 at 01:22:58PM -0700, Cary Coutant wrote: > > > I think a case can be made that gdb should be able to use the > > > "execution view" of the program here. > > > As for how to achieve that ... "Discuss." :-) > > > > Add a PT_DEBUG program header entry? The PT_DEBUG segment would > need > > to have a small header that allows the debugger to find .debug_abbrev, > > .debug_info, etc. (i.e., a mini section table). Or, just add > > individual program header entries for each of the standard debug > > sections: PT_DEBUG_ABBREV, PT_DEBUG_INFO, etc. > > Debug sections are not normally loaded. For that reason I don't think > it makes any sense to specify program headers for them. It wouldn't > help in the vdso case anyway, since the problem there is that you only > have the loaded part of the original ELF file. The vdso contains a section table, as well. When I hack bfd_from_remote_memory to create BFD sections from them similar to what elf_object_p does, I get the target sections that I wanted in GDB. The patch is rather big, though, and duplicating a lot of elf_object_p's code. I have not tried generating fake sections from segments, yet. Regards, 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 ^ permalink raw reply [flat|nested] 32+ messages in thread
* RE: vdso handling 2014-03-13 8:25 ` Metzger, Markus T @ 2014-03-13 9:48 ` Metzger, Markus T 2014-03-13 10:07 ` Pedro Alves 1 sibling, 0 replies; 32+ messages in thread From: Metzger, Markus T @ 2014-03-13 9:48 UTC (permalink / raw) To: Alan Modra, Cary Coutant; +Cc: Doug Evans, gdb, binutils > -----Original Message----- > From: Metzger, Markus T > Sent: Thursday, March 13, 2014 9:24 AM > > On Wed, Mar 12, 2014 at 01:22:58PM -0700, Cary Coutant wrote: > > > > I think a case can be made that gdb should be able to use the > > > > "execution view" of the program here. > > > > As for how to achieve that ... "Discuss." :-) > > > > > > Add a PT_DEBUG program header entry? The PT_DEBUG segment would > > need > > > to have a small header that allows the debugger to find .debug_abbrev, > > > .debug_info, etc. (i.e., a mini section table). Or, just add > > > individual program header entries for each of the standard debug > > > sections: PT_DEBUG_ABBREV, PT_DEBUG_INFO, etc. > > > > Debug sections are not normally loaded. For that reason I don't think > > it makes any sense to specify program headers for them. It wouldn't > > help in the vdso case anyway, since the problem there is that you only > > have the loaded part of the original ELF file. > > The vdso contains a section table, as well. When I hack > bfd_from_remote_memory to create BFD sections from them similar > to what elf_object_p does, I get the target sections that I wanted in GDB. > The patch is rather big, though, and duplicating a lot of elf_object_p's code. > > I have not tried generating fake sections from segments, yet. This turned out to be rather simple. Is this the right direction to go? Should I maybe restrict this to PT_LOAD segments? diff --git a/bfd/elfcode.h b/bfd/elfcode.h index 20101be..22aae2a 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -1771,7 +1771,6 @@ NAME(_bfd_elf,bfd_from_remote_memory) return NULL; } } - free (x_phdrs); /* If the segments visible in memory didn't include the section headers, then clear them from the file header. */ @@ -1791,6 +1790,7 @@ NAME(_bfd_elf,bfd_from_remote_memory) bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory)); if (bim == NULL) { + free (x_phdrs); free (contents); bfd_set_error (bfd_error_no_memory); return NULL; @@ -1799,6 +1799,7 @@ NAME(_bfd_elf,bfd_from_remote_memory) if (nbfd == NULL) { free (bim); + free (x_phdrs); free (contents); bfd_set_error (bfd_error_no_memory); return NULL; @@ -1815,6 +1816,12 @@ NAME(_bfd_elf,bfd_from_remote_memory) nbfd->mtime = time (NULL); nbfd->mtime_set = TRUE; + /* Add fake sections for program headers. We ignore errors. */ + for (i = 0; i < i_ehdr.e_phnum; ++i) + (void) bfd_section_from_phdr (nbfd, &i_phdrs[i], i); + + free (x_phdrs); + if (loadbasep) *loadbasep = loadbase; return nbfd; regards, 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 ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 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-03-13 13:13 ` Alan Modra 1 sibling, 2 replies; 32+ messages in thread From: Pedro Alves @ 2014-03-13 10:07 UTC (permalink / raw) To: Metzger, Markus T; +Cc: Alan Modra, Cary Coutant, Doug Evans, gdb, binutils On 03/13/2014 08:23 AM, Metzger, Markus T wrote: >> -----Original Message----- >> From: Alan Modra [mailto:amodra@gmail.com] >> Sent: Thursday, March 13, 2014 2:02 AM >> To: Cary Coutant >> Cc: Doug Evans; Metzger, Markus T; gdb@sourceware.org; >> binutils@sourceware.org >> Subject: Re: vdso handling >> >> On Wed, Mar 12, 2014 at 01:22:58PM -0700, Cary Coutant wrote: >>>> I think a case can be made that gdb should be able to use the >>>> "execution view" of the program here. >>>> As for how to achieve that ... "Discuss." :-) >>> >>> Add a PT_DEBUG program header entry? The PT_DEBUG segment would >> need >>> to have a small header that allows the debugger to find .debug_abbrev, >>> .debug_info, etc. (i.e., a mini section table). Or, just add >>> individual program header entries for each of the standard debug >>> sections: PT_DEBUG_ABBREV, PT_DEBUG_INFO, etc. >> >> Debug sections are not normally loaded. For that reason I don't think >> it makes any sense to specify program headers for them. It wouldn't >> help in the vdso case anyway, since the problem there is that you only >> have the loaded part of the original ELF file. > > The vdso contains a section table, as well. When I hack > bfd_from_remote_memory to create BFD sections from them similar > to what elf_object_p does, I get the target sections that I wanted in GDB. I got curious. Indeed: $ gdb --quiet /bin/ls Reading symbols from /usr/bin/ls...(no debugging symbols found)...done. (gdb) catch syscall Catchpoint 1 (any syscall) (gdb) r Starting program: /usr/bin/ls Catchpoint 1 (call to syscall brk), 0x000000323d0163fa in __brk (addr=addr@entry=0x0) at ../sysdeps/unix/sysv/linux/x86_64/brk.c:32 32 __curbrk = newbrk = (void *) INLINE_SYSCALL (brk, 1, addr); (gdb) shell cat /proc/23042/maps|grep vdso 7ffff7ffd000-7ffff7fff000 r-xp 00000000 00:00 0 [vdso] (gdb) dump memory /tmp/vdso.so 0x7ffff7ffd000 0x7ffff7fff000 (gdb) q $ objdump -h /tmp/vdso.so /tmp/vdso.so: file format elf64-x86-64 Sections: Idx Name Size VMA LMA File off Algn 0 .hash 00000040 ffffffffff700120 ffffffffff700120 00000120 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 1 .dynsym 00000108 ffffffffff700160 ffffffffff700160 00000160 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 2 .dynstr 0000005e ffffffffff700268 ffffffffff700268 00000268 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 3 .gnu.version 00000016 ffffffffff7002c6 ffffffffff7002c6 000002c6 2**1 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .gnu.version_d 00000038 ffffffffff7002e0 ffffffffff7002e0 000002e0 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 5 .note 0000003c ffffffffff700318 ffffffffff700318 00000318 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 6 .eh_frame_hdr 0000003c ffffffffff700354 ffffffffff700354 00000354 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 7 .eh_frame 00000138 ffffffffff700390 ffffffffff700390 00000390 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 8 .dynamic 000000f0 ffffffffff7004c8 ffffffffff7004c8 000004c8 2**3 CONTENTS, ALLOC, LOAD, DATA 9 .rodata 00000020 ffffffffff7005b8 ffffffffff7005b8 000005b8 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 10 __bug_table 0000000c ffffffffff7005d8 ffffffffff7005d8 000005d8 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 11 .discard 00000006 ffffffffff7005e4 ffffffffff7005e4 000005e4 2**0 CONTENTS, ALLOC, LOAD, DATA 12 .altinstructions 00000048 ffffffffff7005ea ffffffffff7005ea 000005ea 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 13 .altinstr_replacement 00000012 ffffffffff700632 ffffffffff700632 00000632 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 14 .text 0000069d ffffffffff700700 ffffffffff700700 00000700 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 15 .comment 0000002c 0000000000000000 0000000000000000 00000d9d 2**0 CONTENTS, READONLY > The patch is rather big, though, and duplicating a lot of elf_object_p's code. Why's that? Why doesn't the memory-backed bfd paths take the same paths as a file-backed bfd internally in bfd? It sounds to me that this should be doable without duplication. -- Pedro Alves ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-13 10:07 ` Pedro Alves @ 2014-03-13 10:46 ` Pedro Alves 2014-06-01 20:32 ` Samuel Bronson 2014-03-13 13:13 ` Alan Modra 1 sibling, 1 reply; 32+ messages in thread From: Pedro Alves @ 2014-03-13 10:46 UTC (permalink / raw) To: Metzger, Markus T; +Cc: Alan Modra, Cary Coutant, Doug Evans, gdb, binutils On 03/13/2014 10:07 AM, Pedro Alves wrote: > Why's that? Why doesn't the memory-backed bfd paths take the same paths as > a file-backed bfd internally in bfd? It sounds to me that this should be > doable without duplication. BTW, I meant that for vDSO's only. The vsyscall page is not an elf, and therefore bfd still needs to be passed a template elf. For the latter, GDB would indeed need to work with the segments. Do we still care for vsyscall kernels? But for the former, bfd should just be able to read the whole DSO as a plain elf. Some glibc versions even include the vdso in the DSO list (*), and GDB should be able to tell that that DSO is the vDSO (by matching addresses), and load it completely from memory, still using a memory backed bfd, but _without_ a template. So with that in mind, bfd should be able to read the vdso as a bfd from memory using the same paths as a file-backed bfd, except, well, the bfd's backing store is in memory rather than in a file. (*) note how linux-vdso.so.1 is listed by ldd, even if "info shared" in gdb doesn't show it, on some systems. -- Pedro Alves ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-13 10:46 ` Pedro Alves @ 2014-06-01 20:32 ` Samuel Bronson 2014-06-06 12:45 ` Pedro Alves 0 siblings, 1 reply; 32+ messages in thread From: Samuel Bronson @ 2014-06-01 20:32 UTC (permalink / raw) To: gdb; +Cc: binutils Pedro Alves <palves@redhat.com> writes: > On 03/13/2014 10:07 AM, Pedro Alves wrote: >> Why's that? Why doesn't the memory-backed bfd paths take the same paths as >> a file-backed bfd internally in bfd? It sounds to me that this should be >> doable without duplication. > > BTW, I meant that for vDSO's only. The vsyscall page is not an elf, > and therefore bfd still needs to be passed a template elf. For the > latter, GDB would indeed need to work with the segments. Do we still > care for vsyscall kernels? But for the former, bfd should just be > able to read the whole DSO as a plain elf. > > Some glibc versions even include the vdso in the DSO list (*), and GDB > should be able to tell that that DSO is the vDSO (by matching addresses), and ^^^^^^^^^^^^^^^^^^^^^ Hmm, why don't we already do that? It's bound to be easier than meeting the conditions to get glibc to stop falsely cliaming that the vDSO comes from a file <https://sourceware.org/bugzilla/show_bug.cgi?id=13097#c5>. That'd be enough to take two bugs off of <http://bugs.debian.org/gdb> right there. > load it completely from memory, still using a memory backed bfd, but _without_ > a template. So with that in mind, bfd should be able to read the vdso > as a bfd from memory using the same paths as a file-backed bfd, except, > well, the bfd's backing store is in memory rather than in a file. > > (*) note how linux-vdso.so.1 is listed by ldd, even if "info shared" in gdb > doesn't show it, on some systems. What versions don't list the vdso under some name or other? (Mine calls it linux-gate.so.1 for some reason.) -- Hi! I'm a .signature virus! Copy me into your ~/.signature to help me spread! ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-06-01 20:32 ` Samuel Bronson @ 2014-06-06 12:45 ` Pedro Alves 0 siblings, 0 replies; 32+ messages in thread From: Pedro Alves @ 2014-06-06 12:45 UTC (permalink / raw) To: Samuel Bronson, gdb; +Cc: binutils On 06/01/2014 09:31 PM, Samuel Bronson wrote: > Pedro Alves <palves@redhat.com> writes: >> Some glibc versions even include the vdso in the DSO list (*), and GDB >> should be able to tell that that DSO is the vDSO (by matching addresses), and > ^^^^^^^^^^^^^^^^^^^^^ > Hmm, why don't we already do that? It's bound to be easier than meeting > the conditions to get glibc to stop falsely cliaming that the vDSO comes > from a file <https://sourceware.org/bugzilla/show_bug.cgi?id=13097#c5>. Dunno. Because nobody has done it? I suppose that's what Ulrich meant in <https://sourceware.org/bugzilla/show_bug.cgi?id=13097#c1>. >> (*) note how linux-vdso.so.1 is listed by ldd, even if "info shared" in gdb >> doesn't show it, on some systems. > > What versions don't list the vdso under some name or other? (Mine calls > it linux-gate.so.1 for some reason.) I don't know versions numbers, but all before the glibc commit mentioned in <https://sourceware.org/bugzilla/show_bug.cgi?id=13097#c1> I guess, and also, see the rest of the discussion there, indicating that Fedora carries a reversion of the offending patch. -- Pedro Alves ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-13 10:07 ` Pedro Alves 2014-03-13 10:46 ` Pedro Alves @ 2014-03-13 13:13 ` Alan Modra 1 sibling, 0 replies; 32+ messages in thread From: Alan Modra @ 2014-03-13 13:13 UTC (permalink / raw) To: Pedro Alves; +Cc: Metzger, Markus T, Cary Coutant, Doug Evans, gdb, binutils On Thu, Mar 13, 2014 at 10:07:10AM +0000, Pedro Alves wrote: > Why doesn't the memory-backed bfd paths take the same paths as > a file-backed bfd internally in bfd? I think they do. In symfile-mem.c:symbol_file_add_from_memory nbfd = bfd_elf_bfd_from_remote_memory (templ, addr, &loadbase, target_read_memory_bfd); .. if (!bfd_check_format (nbfd, bfd_object)) That bfd_check_format is where elf_object_p is called. *If* bfd_from_remote_memory picked up the sections headers, you'll get a normal bfd with sections.. -- Alan Modra Australia Development Lab, IBM ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-13 1:01 ` Alan Modra 2014-03-13 8:25 ` Metzger, Markus T @ 2014-03-13 9:52 ` Mark Wielaard 2014-03-13 13:03 ` Alan Modra 1 sibling, 1 reply; 32+ messages in thread From: Mark Wielaard @ 2014-03-13 9:52 UTC (permalink / raw) To: Alan Modra; +Cc: Cary Coutant, Doug Evans, Metzger, Markus T, gdb, binutils On Thu, 2014-03-13 at 11:31 +1030, Alan Modra wrote: > It wouldn't > help in the vdso case anyway, since the problem there is that you only > have the loaded part of the original ELF file. Note that the vdso is often special, compared to other ELF dsos, because the loaded part is just the complete ELF image in memory. Since they are very simple they will just have one PT_LOAD at offset zero and if the image is smaller than the page size then the whole file is just simply mapped into memory completely. So by fetching the vdso ELF image from remote memory you should be able to get the section headers and the not-allocated sections too. Cheers, Mark ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 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 0 siblings, 2 replies; 32+ messages in thread From: Alan Modra @ 2014-03-13 13:03 UTC (permalink / raw) To: Mark Wielaard; +Cc: Cary Coutant, Doug Evans, Metzger, Markus T, gdb, binutils On Thu, Mar 13, 2014 at 10:52:16AM +0100, Mark Wielaard wrote: > On Thu, 2014-03-13 at 11:31 +1030, Alan Modra wrote: > > It wouldn't > > help in the vdso case anyway, since the problem there is that you only > > have the loaded part of the original ELF file. > > Note that the vdso is often special, compared to other ELF dsos, because > the loaded part is just the complete ELF image in memory. Since they are > very simple they will just have one PT_LOAD at offset zero and if the > image is smaller than the page size then the whole file is just simply > mapped into memory completely. So by fetching the vdso ELF image from > remote memory you should be able to get the section headers and the > not-allocated sections too. Yes, but if the vdso does not fit in a page (which incidentally is inferred by program header p_align), then you may lose the section headers. I was assuming this was the case. -- Alan Modra Australia Development Lab, IBM ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-13 13:03 ` Alan Modra @ 2014-03-13 14:38 ` Mark Wielaard 2014-03-13 14:59 ` Pedro Alves 1 sibling, 0 replies; 32+ messages in thread From: Mark Wielaard @ 2014-03-13 14:38 UTC (permalink / raw) To: Alan Modra; +Cc: Cary Coutant, Doug Evans, Metzger, Markus T, gdb, binutils On Thu, 2014-03-13 at 23:33 +1030, Alan Modra wrote: > On Thu, Mar 13, 2014 at 10:52:16AM +0100, Mark Wielaard wrote: > > On Thu, 2014-03-13 at 11:31 +1030, Alan Modra wrote: > > > It wouldn't > > > help in the vdso case anyway, since the problem there is that you only > > > have the loaded part of the original ELF file. > > > > Note that the vdso is often special, compared to other ELF dsos, because > > the loaded part is just the complete ELF image in memory. Since they are > > very simple they will just have one PT_LOAD at offset zero and if the > > image is smaller than the page size then the whole file is just simply > > mapped into memory completely. So by fetching the vdso ELF image from > > remote memory you should be able to get the section headers and the > > not-allocated sections too. > > Yes, but if the vdso does not fit in a page (which incidentally is > inferred by program header p_align), then you may lose the section > headers. I was assuming this was the case. Yes, you are right. Almost everything else is bigger than a page and has multiple PT_LOAD segments. In which case determining whether the full shdrs were mapped in from the file is much trickier. And might have to rely on only the phdrs. We recently went through this for elfutils, which also contains an elf_from_remote_memory implementation (if someone needs inspiration). Currently that implementation just uses the phdrs and so needs some heuristics using the program header fields to know what part of the file was mapped where. But if you have access to the actual /proc/PID/maps ranges you might be able to do something more accurate, or at least be able to cross check that the program headers view is really how the ELF image is actually laid out (*). Cheers, Mark (*) Don't make the mistake we made to think p_align is what segments are actually aligned to, the dynamic loader on GNU/Linux just uses the actual page size of the architecture to align the mappings: https://lists.fedorahosted.org/pipermail/elfutils-devel/2014-March/003859.html ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 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 1 sibling, 1 reply; 32+ messages in thread From: Pedro Alves @ 2014-03-13 14:59 UTC (permalink / raw) To: Mark Wielaard, Cary Coutant, Doug Evans, Metzger, Markus T, gdb, binutils On 03/13/2014 01:03 PM, Alan Modra wrote: > On Thu, Mar 13, 2014 at 10:52:16AM +0100, Mark Wielaard wrote: >> On Thu, 2014-03-13 at 11:31 +1030, Alan Modra wrote: >>> It wouldn't >>> help in the vdso case anyway, since the problem there is that you only >>> have the loaded part of the original ELF file. >> >> Note that the vdso is often special, compared to other ELF dsos, because >> the loaded part is just the complete ELF image in memory. Since they are >> very simple they will just have one PT_LOAD at offset zero and if the >> image is smaller than the page size then the whole file is just simply >> mapped into memory completely. So by fetching the vdso ELF image from >> remote memory you should be able to get the section headers and the >> not-allocated sections too. > > Yes, but if the vdso does not fit in a page (which incidentally is > inferred by program header p_align), then you may lose the section > headers. I was assuming this was the case. Hmm. How so? On x86 (arch/x86/vdso/vdso.S), the kernel just does: .globl vdso_start, vdso_end .align PAGE_SIZE vdso_start: .incbin "arch/x86/vdso/vdso.so" vdso_end: .align PAGE_SIZE /* extra data here leaks to userspace. */ And then arch/x86/vdso/vma.c has: static int __init init_vdso(void) { int npages = (vdso_end - vdso_start + PAGE_SIZE - 1) / PAGE_SIZE; int i; patch_vdso64(vdso_start, vdso_end - vdso_start); vdso_size = npages << PAGE_SHIFT; for (i = 0; i < npages; i++) vdso_pages[i] = virt_to_page(vdso_start + i*PAGE_SIZE); #ifdef CONFIG_X86_X32_ABI patch_vdsox32(vdsox32_start, vdsox32_end - vdsox32_start); npages = (vdsox32_end - vdsox32_start + PAGE_SIZE - 1) / PAGE_SIZE; vdsox32_size = npages << PAGE_SHIFT; for (i = 0; i < npages; i++) vdsox32_pages[i] = virt_to_page(vdsox32_start + i*PAGE_SIZE); #endif return 0; } And patch_vdso64 _relies_ on sections being present at runtime: static void __init patch_vdso64(void *vdso, size_t len) { Elf64_Ehdr *hdr = vdso; Elf64_Shdr *sechdrs, *alt_sec = 0; char *secstrings; void *alt_data; int i; BUG_ON(len < sizeof(Elf64_Ehdr)); BUG_ON(memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0); sechdrs = (void *)hdr + hdr->e_shoff; secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; for (i = 1; i < hdr->e_shnum; i++) { Elf64_Shdr *shdr = &sechdrs[i]; if (!strcmp(secstrings + shdr->sh_name, ".altinstructions")) { alt_sec = shdr; goto found; } } /* If we get here, it's probably a bug. */ pr_warning("patch_vdso64: .altinstructions not found\n"); return; /* nothing to patch */ found: alt_data = (void *)hdr + alt_sec->sh_offset; apply_alternatives(alt_data, alt_data + alt_sec->sh_size); } On e.g., arch/powerpc/kernel/vdso.c, I see even a lot more code looking at the sections of the vdso. -- Pedro Alves ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-13 14:59 ` Pedro Alves @ 2014-03-13 15:04 ` Pedro Alves 2014-03-13 15:26 ` Pedro Alves 0 siblings, 1 reply; 32+ messages in thread From: Pedro Alves @ 2014-03-13 15:04 UTC (permalink / raw) Cc: Mark Wielaard, Cary Coutant, Doug Evans, Metzger, Markus T, gdb, binutils On 03/13/2014 02:59 PM, Pedro Alves wrote: > Hmm. How so? On x86 (arch/x86/vdso/vdso.S), the kernel just does: Hmm, guess I should really be looking at where the vdso is actually mapped to a process's address space... (no idea where that is). -- Pedro Alves ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-13 15:04 ` Pedro Alves @ 2014-03-13 15:26 ` Pedro Alves 2014-03-13 23:53 ` Alan Modra 0 siblings, 1 reply; 32+ messages in thread From: Pedro Alves @ 2014-03-13 15:26 UTC (permalink / raw) To: Mark Wielaard, Cary Coutant, Doug Evans, Metzger, Markus T, gdb, binutils On 03/13/2014 03:04 PM, Pedro Alves wrote: > On 03/13/2014 02:59 PM, Pedro Alves wrote: > >> Hmm. How so? On x86 (arch/x86/vdso/vdso.S), the kernel just does: > > Hmm, guess I should really be looking at where the vdso is > actually mapped to a process's address space... (no idea where > that is). > I think I found it in the same file (arch/x86/vdso/vma.c): int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { return setup_additional_pages(bprm, uses_interp, vdso_pages, vdso_size); } vdso_size comes from: static int __init init_vdso(void) { int npages = (vdso_end - vdso_start + PAGE_SIZE - 1) / PAGE_SIZE; int i; patch_vdso64(vdso_start, vdso_end - vdso_start); vdso_size = npages << PAGE_SHIFT; So it seems like the whole vdso should be always mapped in. I didn't look at the whole mode compat mess, but if it behaves differently, it'd sound like a kernel bug to me. -- Pedro Alves ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-13 15:26 ` Pedro Alves @ 2014-03-13 23:53 ` Alan Modra 2014-03-18 15:14 ` Metzger, Markus T 0 siblings, 1 reply; 32+ messages in thread From: Alan Modra @ 2014-03-13 23:53 UTC (permalink / raw) To: Pedro Alves Cc: Mark Wielaard, Cary Coutant, Doug Evans, Metzger, Markus T, gdb, binutils On Thu, Mar 13, 2014 at 03:26:18PM +0000, Pedro Alves wrote: > So it seems like the whole vdso should be always mapped in. 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. -- Alan Modra Australia Development Lab, IBM ^ permalink raw reply [flat|nested] 32+ messages in thread
* RE: vdso handling 2014-03-13 23:53 ` Alan Modra @ 2014-03-18 15:14 ` Metzger, Markus T 2014-03-18 23:10 ` Alan Modra 0 siblings, 1 reply; 32+ messages in thread From: Metzger, Markus T @ 2014-03-18 15:14 UTC (permalink / raw) To: Alan Modra, Pedro Alves Cc: Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils > -----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 ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-18 15:14 ` Metzger, Markus T @ 2014-03-18 23:10 ` Alan Modra 2014-03-19 8:11 ` Metzger, Markus T ` (2 more replies) 0 siblings, 3 replies; 32+ messages in thread From: Alan Modra @ 2014-03-18 23:10 UTC (permalink / raw) To: Metzger, Markus T Cc: Pedro Alves, Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils On Tue, Mar 18, 2014 at 03:09:58PM +0000, Metzger, Markus T wrote: > 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; > + I don't think this is a good idea. If/when bfd_from_remote_memory is used for something other than the linux kernel vdso, we can't assume the section headers are loaded. The original code made the assumption that the highest address loaded from a PT_LOAD header was rounded up to a page, and that the page size could be inferred from p_align. Here: segment_end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz + i_phdrs[i].p_align - 1) & -i_phdrs[i].p_align; if (segment_end > (bfd_vma) contents_size) contents_size = segment_end; Now, p_align is generally set from the page size if using GNU ld, but I'm wondering if your vdso somehow doesn't have that property. Can you show us your vdso readelf -e output? If p_align isn't set to a page, then the change in heuristic I envision is to make use of elf_backend_data maxpagesize to figure out which parts of the image might be loaded. If that isn't enough then perhaps we should add another parameter to bfd_from_remote_memory to allow its caller to specify the end of the image. > 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? I don't mind either way. This part of bfd belongs to gdb, so gdb maintainers really have the final say on patch approval. I'm just someone who happened to become interested in the problem.. -- Alan Modra Australia Development Lab, IBM ^ permalink raw reply [flat|nested] 32+ messages in thread
* RE: vdso handling 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:03 ` Pedro Alves 2 siblings, 0 replies; 32+ messages in thread From: Metzger, Markus T @ 2014-03-19 8:11 UTC (permalink / raw) To: Alan Modra Cc: Pedro Alves, Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils > -----Original Message----- > From: Alan Modra [mailto:amodra@gmail.com] > Sent: Wednesday, March 19, 2014 12:10 AM > Now, p_align is generally set from the page size if using GNU ld, but > I'm wondering if your vdso somehow doesn't have that property. Can > you show us your vdso readelf -e output? ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0xffffffffff700700 Start of program headers: 64 (bytes into file) Start of section headers: 4320 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 4 Size of section headers: 64 (bytes) Number of section headers: 18 Section header string table index: 17 Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [ 1] .hash HASH ffffffffff700120 000120 000040 04 A 2 0 8 [ 2] .dynsym DYNSYM ffffffffff700160 000160 000108 18 A 3 2 8 [ 3] .dynstr STRTAB ffffffffff700268 000268 00005e 00 A 0 0 1 [ 4] .gnu.version VERSYM ffffffffff7002c6 0002c6 000016 02 A 2 0 2 [ 5] .gnu.version_d VERDEF ffffffffff7002e0 0002e0 000038 00 A 3 2 8 [ 6] .note NOTE ffffffffff700318 000318 00003c 00 A 0 0 4 [ 7] .eh_frame_hdr PROGBITS ffffffffff700354 000354 00002c 00 A 0 0 4 [ 8] .eh_frame PROGBITS ffffffffff700380 000380 0000e8 00 A 0 0 8 [ 9] .dynamic DYNAMIC ffffffffff700468 000468 0000f0 10 WA 3 0 8 [10] .rodata PROGBITS ffffffffff700558 000558 000020 01 AMS 0 0 8 [11] __bug_table PROGBITS ffffffffff700578 000578 000018 00 A 0 0 1 [12] .discard PROGBITS ffffffffff700590 000590 000012 00 WA 0 0 1 [13] .altinstructions PROGBITS ffffffffff7005a2 0005a2 0000d8 00 A 0 0 1 [14] .altinstr_replacement PROGBITS ffffffffff70067a 00067a 000036 00 AX 0 0 1 [15] .text PROGBITS ffffffffff700700 000700 0008fd 00 AX 0 0 16 [16] .comment PROGBITS 0000000000000000 000ffd 00002c 01 MS 0 0 1 [17] .shstrtab STRTAB 0000000000000000 001029 0000b7 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0xffffffffff700000 0xffffffffff700000 0x000ffd 0x000ffd R E 0x1000 DYNAMIC 0x000468 0xffffffffff700468 0xffffffffff700468 0x0000f0 0x0000f0 R 0x8 NOTE 0x000318 0xffffffffff700318 0xffffffffff700318 0x00003c 0x00003c R 0x4 GNU_EH_FRAME 0x000354 0xffffffffff700354 0xffffffffff700354 0x00002c 0x00002c R 0x4 Section to Segment mapping: Segment Sections... 00 .hash .dynsym .dynstr .gnu.version .gnu.version_d .note .eh_frame_hdr .eh_frame .dynamic .rodata __bug_table .discard .altinstructions .altinstr_replacement .text 01 .dynamic 02 .note 03 .eh_frame_hdr Regards, 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 ^ permalink raw reply [flat|nested] 32+ messages in thread
* RE: vdso handling 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-19 12:03 ` Pedro Alves 2 siblings, 2 replies; 32+ messages in thread From: Metzger, Markus T @ 2014-03-19 8:31 UTC (permalink / raw) To: Alan Modra, Pedro Alves Cc: Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils > -----Original Message----- > From: Alan Modra [mailto:amodra@gmail.com] > Sent: Wednesday, March 19, 2014 12:10 AM > > + /* 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; > > + > > I don't think this is a good idea. If/when bfd_from_remote_memory is > used for something other than the linux kernel vdso, we can't assume > the section headers are loaded. Shouldn't the ehdr indicate that there are no sections in this case? > The original code made the assumption > that the highest address loaded from a PT_LOAD header was rounded up > to a page, and that the page size could be inferred from p_align. > Here: > segment_end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz > + i_phdrs[i].p_align - 1) & -i_phdrs[i].p_align; > if (segment_end > (bfd_vma) contents_size) > contents_size = segment_end; > > Now, p_align is generally set from the page size if using GNU ld, but > I'm wondering if your vdso somehow doesn't have that property. Can > you show us your vdso readelf -e output? If p_align isn't set to a > page, then the change in heuristic I envision is to make use of > elf_backend_data maxpagesize to figure out which parts of the image > might be loaded. If that isn't enough then perhaps we should add > another parameter to bfd_from_remote_memory to allow its caller to > specify the end of the image. I'm not sure the caller knows. GDB gets the base address from AUXV's AT_SYSINFO_EHDR. If we can't trust the image to contain everything that the ELF header describes, would it be safer to generate fake sections based on the program header? We already assume that the program header is contained in the image. Regards, 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 ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-19 8:31 ` Metzger, Markus T @ 2014-03-19 12:04 ` Pedro Alves 2014-03-20 2:00 ` Alan Modra 1 sibling, 0 replies; 32+ messages in thread From: Pedro Alves @ 2014-03-19 12:04 UTC (permalink / raw) To: Metzger, Markus T Cc: Alan Modra, Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils On 03/19/2014 08:29 AM, Metzger, Markus T wrote: > If we can't trust the image to contain everything that the ELF header > describes, would it be safer to generate fake sections based on the > program header? We already assume that the program header is > contained in the image. Please let's try to make this work before giving up and going in that direction. -- Pedro Alves ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 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 1 sibling, 1 reply; 32+ messages in thread From: Alan Modra @ 2014-03-20 2:00 UTC (permalink / raw) To: Metzger, Markus T Cc: Pedro Alves, Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils On Wed, Mar 19, 2014 at 08:29:47AM +0000, Metzger, Markus T wrote: > Shouldn't the ehdr indicate that there are no sections in this case? Nope. See my other email to Pedro. > If we can't trust the image to contain everything that the ELF header > describes, would it be safer to generate fake sections based on the > program header? We already assume that the program header is > contained in the image. Yes, you're correct that it is wrong to assume program headers are loaded. Even worse, the in-memory image doesn't even need to contain the ELF file header. -- Alan Modra Australia Development Lab, IBM ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-20 2:00 ` Alan Modra @ 2014-03-21 15:55 ` Pedro Alves 2014-03-26 9:32 ` Metzger, Markus T 0 siblings, 1 reply; 32+ messages in thread From: Pedro Alves @ 2014-03-21 15:55 UTC (permalink / raw) To: Metzger, Markus T, Pedro Alves, Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils On 03/20/2014 01:59 AM, Alan Modra wrote: > On Wed, Mar 19, 2014 at 08:29:47AM +0000, Metzger, Markus T wrote: >> Shouldn't the ehdr indicate that there are no sections in this case? > > Nope. See my other email to Pedro. > >> If we can't trust the image to contain everything that the ELF header >> describes, would it be safer to generate fake sections based on the >> program header? We already assume that the program header is >> contained in the image. > > Yes, you're correct that it is wrong to assume program headers are > loaded. Even worse, the in-memory image doesn't even need to contain > the ELF file header. Yeah, and I was just assuming it didn't, hence my "just trust the headers" push before. I'm now thinking that we'll need pseudo-sections from program headers anyway, so I'd suggest going in that direction, leaving the add-symbol-file-from-memory command's intention generic, and leave revisiting how gdb retrieves the vdso itself off of memory for another day. -- Pedro Alves ^ permalink raw reply [flat|nested] 32+ messages in thread
* RE: vdso handling 2014-03-21 15:55 ` Pedro Alves @ 2014-03-26 9:32 ` Metzger, Markus T 0 siblings, 0 replies; 32+ messages in thread From: Metzger, Markus T @ 2014-03-26 9:32 UTC (permalink / raw) To: Pedro Alves, Alan Modra Cc: Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils > -----Original Message----- > From: Pedro Alves [mailto:palves@redhat.com] > Sent: Friday, March 21, 2014 4:55 PM > >> If we can't trust the image to contain everything that the ELF header > >> describes, would it be safer to generate fake sections based on the > >> program header? We already assume that the program header is > >> contained in the image. > > > > Yes, you're correct that it is wrong to assume program headers are > > loaded. Even worse, the in-memory image doesn't even need to contain > > the ELF file header. > > Yeah, and I was just assuming it didn't, hence my "just trust the > headers" push before. > > I'm now thinking that we'll need pseudo-sections from program > headers anyway, so I'd suggest going in that direction, leaving > the add-symbol-file-from-memory command's intention generic, > and leave revisiting how gdb retrieves the vdso itself off of > memory for another day. That would be something like the patch in one of the previous emails in this thread: https://sourceware.org/ml/gdb/2014-03/msg00028.html, wouldn't it? Alan, would you be OK with this, as well? 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 ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 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:03 ` Pedro Alves 2014-03-20 1:33 ` Alan Modra 2 siblings, 1 reply; 32+ messages in thread From: Pedro Alves @ 2014-03-19 12:03 UTC (permalink / raw) To: Metzger, Markus T, Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils On 03/18/2014 11:09 PM, Alan Modra wrote: > I don't think this is a good idea. If/when bfd_from_remote_memory is > used for something other than the linux kernel vdso, we can't assume > the section headers are loaded. I wonder what use cases are these though. It'd be odd to me to load the elf headers, but not all that the headers point at. Sounds like we should just make that a requirement? I looked at the history of this whole code, and here's what I found. Roland originally added this bfd function for reading the Linux vsyscall dso, in 8d6337fe: https://sourceware.org/ml/binutils/2003-05/msg00542.html As far as I can judge from http://lwn.net/Articles/30258/ , and from looking at the early days of the vsyscall dso in the Linux tree, it looks like the vsyscall dso was always included complete in memory (e.g., at v2.6.12-rc2, the initial git import): ... /* 32bit VDSOs mapped into user space. */ asm(".section \".init.data\",\"aw\"\n" "syscall32_syscall:\n" ".incbin \"arch/x86_64/ia32/vsyscall-syscall.so\"\n" "syscall32_syscall_end:\n" "syscall32_sysenter:\n" ".incbin \"arch/x86_64/ia32/vsyscall-sysenter.so\"\n" "syscall32_sysenter_end:\n" ".previous"); ... # The DSO images are built using a special linker script quiet_cmd_syscall = SYSCALL $@ cmd_syscall = $(CC) -m32 -nostdlib -shared -s \ -Wl,-soname=linux-gate.so.1 -o $@ \ -Wl,-T,$(filter-out FORCE,$^) ... I found no sign of strip or of any special elf munging. GDB only uses bfd_elf_bfd_from_remote_memory for the vdso, and for "add-symbol-file-from-memory". Roland himself added the "add-symbol-file-from-memory" command (5417f6dc) to GDB too, at: https://www.sourceware.org/ml/gdb-patches/2003-10/msg00045.html "This command may not really be worth having, but it serves to exercise the underlying function symbol_file_add_from_memory. That function does the work of reading symbols and unwind info from the Linux vsyscall DSO." -- Pedro Alves ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 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 0 siblings, 2 replies; 32+ messages in thread From: Alan Modra @ 2014-03-20 1:33 UTC (permalink / raw) To: Pedro Alves Cc: Metzger, Markus T, Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils On Wed, Mar 19, 2014 at 12:03:40PM +0000, Pedro Alves wrote: > On 03/18/2014 11:09 PM, Alan Modra wrote: > > I don't think this is a good idea. If/when bfd_from_remote_memory is > > used for something other than the linux kernel vdso, we can't assume > > the section headers are loaded. > > I wonder what use cases are these though. It'd be odd to me to > load the elf headers, but not all that the headers point at. Well, no, the section headers are part of the linking view. The ELF file header points at their *file offset*. Thinking it odd that they are not loaded is exactly the same as thinking it odd that .comment is not loaded! > Sounds like we should just make that a requirement? You indeed could make that a requirement, but it'd mean that object files loaded by glibc ld.so would not satisfy the requirement. Taking Markus' vdso as an example, the PT_LOAD header covers file offsets from 0 to 0xffd and page size is 0x1000. If ld.so were loading a similar image, it would just load in 0 to 0xfff (assuming ld.so's dl_pagesize is also 0x1000). The section headers are at file offset 0x10e0 so would miss being loaded. Nor should they be loaded, since they are completely extraneous to executing the image it would be foolish to waste another page to load them. > "This command may not really be worth having, but it serves to exercise the > underlying function symbol_file_add_from_memory. That function does the > work of reading symbols and unwind info from the Linux vsyscall DSO." Heh, OK, so don't let my comments about more general uses of bfd_from_remote_memory get in your way of fixing this problem. Hmm, if you only want to read vdsos then bfd_from_remote_memory is way overengineered. In fact, I think it could disappear entirely. If you can find the extent of the vdso in gdb, then all of the ELF version of bfd_from_remote_memory prior to allocating the bim is unnecessary, because all that code really does is find the extent. So the tail of bfd_from_remote_memory moves to bfd/opncls.c as (totally untested): bfd_boolean bfd_openr_bim (bfd *templ, void *contents, size_t contents_size) { struct bfd_in_memory *bim; bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory)); if (bim == NULL) return NULL; nbfd = _bfd_new_bfd (); if (nbfd == NULL) { free (bim); return NULL; } nbfd->filename = "<in-memory>"; if (templ != NULL) nbfd->xvec = templ->xvec; bim->size = contents_size; bim->buffer = (bfd_byte *) contents; nbfd->iostream = bim; nbfd->flags = BFD_IN_MEMORY; nbfd->iovec = &_bfd_memory_iovec; nbfd->origin = 0; nbfd->direction = read_direction; nbfd->mtime = time (NULL); nbfd->mtime_set = TRUE; return nbfd; } gdb is then responsible for filling in "contents" and determining "contents_size", which presumably can be done in the same way as you did in https://sourceware.org/ml/binutils/2014-03/msg00130.html The loadbase calculation also moves to gdb, which shouldn't be too hard. Note that "templ" above is optional, which allows you to get rid of /* FIXME: cagney/2004-05-06: Should not require an existing BFD when trying to create a run-time BFD of the VSYSCALL -- Alan Modra Australia Development Lab, IBM ^ permalink raw reply [flat|nested] 32+ messages in thread
* RE: vdso handling 2014-03-20 1:33 ` Alan Modra @ 2014-03-21 8:10 ` Metzger, Markus T 2014-03-21 15:48 ` Pedro Alves 1 sibling, 0 replies; 32+ messages in thread From: Metzger, Markus T @ 2014-03-21 8:10 UTC (permalink / raw) To: Alan Modra, Pedro Alves Cc: Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils > -----Original Message----- > From: Alan Modra [mailto:amodra@gmail.com] > Sent: Thursday, March 20, 2014 2:33 AM > On Wed, Mar 19, 2014 at 12:03:40PM +0000, Pedro Alves wrote: > > On 03/18/2014 11:09 PM, Alan Modra wrote: > > > I don't think this is a good idea. If/when bfd_from_remote_memory is > > > used for something other than the linux kernel vdso, we can't assume > > > the section headers are loaded. > > > > I wonder what use cases are these though. It'd be odd to me to > > load the elf headers, but not all that the headers point at. > > Well, no, the section headers are part of the linking view. The ELF > file header points at their *file offset*. Thinking it odd that they > are not loaded is exactly the same as thinking it odd that .comment is > not loaded! > > > Sounds like we should just make that a requirement? > > You indeed could make that a requirement, but it'd mean that object > files loaded by glibc ld.so would not satisfy the requirement. > > Taking Markus' vdso as an example, the PT_LOAD header covers file > offsets from 0 to 0xffd and page size is 0x1000. If ld.so were > loading a similar image, it would just load in 0 to 0xfff (assuming > ld.so's dl_pagesize is also 0x1000). The section headers are at file > offset 0x10e0 so would miss being loaded. Nor should they be loaded, > since they are completely extraneous to executing the image it would > be foolish to waste another page to load them. > > > "This command may not really be worth having, but it serves to exercise > the > > underlying function symbol_file_add_from_memory. That function does > the > > work of reading symbols and unwind info from the Linux vsyscall DSO." > > Heh, OK, so don't let my comments about more general uses of > bfd_from_remote_memory get in your way of fixing this problem. > > Hmm, if you only want to read vdsos then bfd_from_remote_memory is way > overengineered. In fact, I think it could disappear entirely. > If you can find the extent of the vdso in gdb, then all of the ELF > version of bfd_from_remote_memory prior to allocating the bim is > unnecessary, because all that code really does is find the extent. > So the tail of bfd_from_remote_memory moves to bfd/opncls.c as > (totally untested): > > bfd_boolean > bfd_openr_bim (bfd *templ, void *contents, size_t contents_size) > { > struct bfd_in_memory *bim; > > bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct > bfd_in_memory)); > if (bim == NULL) > return NULL; > > nbfd = _bfd_new_bfd (); > if (nbfd == NULL) > { > free (bim); > return NULL; > } > nbfd->filename = "<in-memory>"; > if (templ != NULL) > nbfd->xvec = templ->xvec; > bim->size = contents_size; > bim->buffer = (bfd_byte *) contents; > nbfd->iostream = bim; > nbfd->flags = BFD_IN_MEMORY; > nbfd->iovec = &_bfd_memory_iovec; > nbfd->origin = 0; > nbfd->direction = read_direction; > nbfd->mtime = time (NULL); > nbfd->mtime_set = TRUE; > return nbfd; > } > > gdb is then responsible for filling in "contents" and determining > "contents_size", which presumably can be done in the same way as > you did in https://sourceware.org/ml/binutils/2014-03/msg00130.html > The loadbase calculation also moves to gdb, which shouldn't be too > hard. Note that "templ" above is optional, which allows you to get > rid of > /* FIXME: cagney/2004-05-06: Should not require an existing > BFD when trying to create a run-time BFD of the VSYSCALL I was waiting for Pedro to reply but he didn't. This would move the ELF processing itself into GDB. That sounds a bit odd to me but it seems GDB already does a fair amount of ELF reading. Pedro, are you OK with this? Will you accept a patch that goes into the direction that Alan described above? 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 ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: vdso handling 2014-03-20 1:33 ` Alan Modra 2014-03-21 8:10 ` Metzger, Markus T @ 2014-03-21 15:48 ` Pedro Alves 1 sibling, 0 replies; 32+ messages in thread From: Pedro Alves @ 2014-03-21 15:48 UTC (permalink / raw) To: Metzger, Markus T, Mark Wielaard, Cary Coutant, Doug Evans, gdb, binutils On 03/20/2014 01:33 AM, Alan Modra wrote: > On Wed, Mar 19, 2014 at 12:03:40PM +0000, Pedro Alves wrote: >> On 03/18/2014 11:09 PM, Alan Modra wrote: >>> I don't think this is a good idea. If/when bfd_from_remote_memory is >>> used for something other than the linux kernel vdso, we can't assume >>> the section headers are loaded. >> >> I wonder what use cases are these though. It'd be odd to me to >> load the elf headers, but not all that the headers point at. > > Well, no, the section headers are part of the linking view. The ELF > file header points at their *file offset*. Thinking it odd that they > are not loaded is exactly the same as thinking it odd that .comment is > not loaded! :-) Sorry, I get that, but I was somehow assuming the elf header wasn't itself covered by a PT_LOAD. Rookie mistake... >> Sounds like we should just make that a requirement? > > You indeed could make that a requirement, but it'd mean that object > files loaded by glibc ld.so would not satisfy the requirement. Indeed. So this mechanism could be further extended in future to be able to read DSOs out of memory, and be able to retrieve the dynamic symbol table, etc., which would allow getting at unwind info for already-deleted libraries. I guess that's what the elfutils folks had been talking about, but I somehow managed to not connect the dots. :-) 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. > > Taking Markus' vdso as an example, the PT_LOAD header covers file > offsets from 0 to 0xffd and page size is 0x1000. If ld.so were > loading a similar image, it would just load in 0 to 0xfff (assuming > ld.so's dl_pagesize is also 0x1000). The section headers are at file > offset 0x10e0 so would miss being loaded. Nor should they be loaded, > since they are completely extraneous to executing the image it would > be foolish to waste another page to load them. *nod* >> "This command may not really be worth having, but it serves to exercise the >> underlying function symbol_file_add_from_memory. That function does the >> work of reading symbols and unwind info from the Linux vsyscall DSO." > > Heh, OK, so don't let my comments about more general uses of > bfd_from_remote_memory get in your way of fixing this problem. Hmm. Thinking further ahead, it would be good to make GDB be able to read deleted DSOs off of memory like elfutils is now doing. With that in mind, it does seem to make sense to have this bfd_elf_bfd_from_remote_memory code in place as is, but extend it to treat section-less elfs just like cores, creating pseudo bfd sections from segments... -- Pedro Alves ^ permalink raw reply [flat|nested] 32+ messages in thread
end of thread, other threads:[~2014-06-06 12:45 UTC | newest] Thread overview: 32+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-03-10 13:05 vdso handling 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 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
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox