Author: kib
Date: Thu Jun 18 23:06:05 2020
New Revision: 362346
URL: https://svnweb.freebsd.org/changeset/base/362346

Log:
  rtld: Parse own phdr and notes.
  
  Reviewed by:  emaste
  Sponsored by: The FreeBSD Foundation
  MFC after:    1 week
  Differential revision:        https://reviews.freebsd.org/D25319

Modified:
  head/libexec/rtld-elf/rtld.c

Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c        Thu Jun 18 22:10:06 2020        
(r362345)
+++ head/libexec/rtld-elf/rtld.c        Thu Jun 18 23:06:05 2020        
(r362346)
@@ -2182,6 +2182,34 @@ process_z(Obj_Entry *root)
                }
        }
 }
+
+static void
+parse_rtld_phdr(Obj_Entry *obj)
+{
+       const Elf_Phdr *ph;
+       Elf_Addr note_start, note_end;
+
+       obj->stack_flags = PF_X | PF_R | PF_W;
+       for (ph = obj->phdr;  (const char *)ph < (const char *)obj->phdr +
+           obj->phsize; ph++) {
+               switch (ph->p_type) {
+               case PT_GNU_STACK:
+                       obj->stack_flags = ph->p_flags;
+                       break;
+               case PT_GNU_RELRO:
+                       obj->relro_page = obj->relocbase +
+                           trunc_page(ph->p_vaddr);
+                       obj->relro_size = round_page(ph->p_memsz);
+                       break;
+               case PT_NOTE:
+                       note_start = (Elf_Addr)obj->relocbase + ph->p_vaddr;
+                       note_end = note_start + ph->p_filesz;
+                       digest_notes(obj, note_start, note_end);
+                       break;
+               }
+       }
+}
+
 /*
  * Initialize the dynamic linker.  The argument is the address at which
  * the dynamic linker has been mapped into memory.  The primary task of
@@ -2250,6 +2278,8 @@ init_rtld(caddr_t mapbase, Elf_Auxinfo **aux_info)
 
     /* Replace the path with a dynamically allocated copy. */
     obj_rtld.path = xstrdup(ld_path_rtld);
+
+    parse_rtld_phdr(&obj_rtld);
 
     r_debug.r_brk = r_debug_state;
     r_debug.r_state = RT_CONSISTENT;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to