RE: vdso handling

Metzger, Markus T
2014-03-19T08:31:57Z

> -----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