> Date: Sun, 7 Aug 2016 20:01:58 -0700
> From: Philip Guenther <[email protected]>
> 
> On Sun, 7 Aug 2016, Philip Guenther wrote:
> 
> > On Sun, Aug 7, 2016 at 4:45 AM, Mark Kettenis <[email protected]> 
> > wrote:
> > >> Date: Sat, 6 Aug 2016 22:17:47 -0700
> > >> From: Philip Guenther <[email protected]>
> > >>
> > >> Parts of this were stolen from kettenis.
> > >>
> > >> Hey, wouldn't it be cool if static PIE executables took advantage of the
> > >> RELRO information too?
> > >
> > > Hmm.  The PLT doesn't have to be executable for static PIE
> > > executables.  So I think you could simply transition to PROT_READ like
> > > the old code does.
> > 
> > Perhaps we should make it PROT_NONE.  :-)
> 
> ...except that doesn't work for hppa, when I do relro with .plt and .got 
> together in the same section.  PROT_READ it is!
> 
> Tested on hppa with the relro update in the next message...

ok kettenis@, but

> Index: lib/csu/boot.h
> ===================================================================
> RCS file: /data/src/openbsd/src/lib/csu/boot.h,v
> retrieving revision 1.21
> diff -u -p -r1.21 boot.h
> --- lib/csu/boot.h    7 Aug 2016 02:44:00 -0000       1.21
> +++ lib/csu/boot.h    8 Aug 2016 03:00:53 -0000
> @@ -86,8 +86,6 @@ struct boot_dyn {
>   */
>  void _dl_boot_bind(const long, long *, Elf_Dyn *);
>  
> -extern char __plt_start[];
> -extern char __plt_end[];
>  extern char __got_start[];
>  extern char __got_end[];
>  
> @@ -106,6 +104,7 @@ _dl_boot_bind(const long sp, long *dl_da
>       long            loff;
>       int             prot_exec = 0;
>       RELOC_TYPE      *rp;
> +     Elf_Phdr        *phdp;
>       Elf_Addr        i;
>  
>       /*
> @@ -220,12 +219,29 @@ _dl_boot_bind(const long sp, long *dl_da
>       else
>               pagesize = 4096;
>  
> +     /* do any RWX -> RX fixups for executable PLTs and apply GNU_RELRO */
> +     phdp = (Elf_Phdr *)dl_data[AUX_phdr];
> +     for (i = 0; i < dl_data[AUX_phnum]; i++, phdp++) {
> +             switch (phdp->p_type) {
>  #if defined(__alpha__) || defined(__powerpc__) || defined(__sparc__) || \
> -    defined(__sparc64__)
> -     start = ELF_TRUNC((Elf_Addr)__plt_start, pagesize);
> -     size = ELF_ROUND((Elf_Addr)__plt_end - start, pagesize);
> -     mprotect((void *)start, size, PROT_READ);
> +    defined(__sparc64__) || defined(__hppa__)


Could you keep that list of architectures sorted alphabetically?  Yes
I know, OCD and all that...

> +             case PT_LOAD:
> +                     if ((phdp->p_flags & (PF_X | PF_W)) != (PF_X | PF_W))
> +                             break;
> +                     mprotect((void *)(phdp->p_vaddr + loff), phdp->p_memsz,
> +                         PROT_READ);
> +                     break;
>  #endif
> +             case PT_GNU_RELRO:
> +                     mprotect((void *)(phdp->p_vaddr + loff), phdp->p_memsz,
> +                         PROT_READ);
> +                     /*
> +                      * GNU_RELRO (a) covers the GOT, and (b) comes after
> +                      * all LOAD sections, so if we found it then we're done
> +                      */
> +                     return;
> +             }
> +     }
>  
>  #if defined(__powerpc__)
>       if (dynld.dt_proc[DT_PROC(DT_PPC_GOT)] == 0)
> 

Reply via email to