svn commit: r268182 - in head/libexec/rtld-elf: . ia64

Marcel Moolenaar marcel at FreeBSD.org
Wed Jul 2 22:04:13 UTC 2014


Author: marcel
Date: Wed Jul  2 22:04:12 2014
New Revision: 268182
URL: http://svnweb.freebsd.org/changeset/base/268182

Log:
  Fix r264346 for ia64. We need to allocate memory for the function
  descriptors in order to relocate RTLD itself. To allocate memory,
  we need the pagesizes array initialized, but that happens after
  RTLD is relocated. This ordering is important for amd64, but it's
  opposite of what ia64 needs. Handle this conflict with the define
  called RTLD_INIT_PAGESIZES_EARLY. When defined, obtain the page
  sizes before relocating rtld, otherwise do it after.

Modified:
  head/libexec/rtld-elf/ia64/rtld_machdep.h
  head/libexec/rtld-elf/rtld.c

Modified: head/libexec/rtld-elf/ia64/rtld_machdep.h
==============================================================================
--- head/libexec/rtld-elf/ia64/rtld_machdep.h	Wed Jul  2 21:53:34 2014	(r268181)
+++ head/libexec/rtld-elf/ia64/rtld_machdep.h	Wed Jul  2 22:04:12 2014	(r268182)
@@ -69,4 +69,6 @@ extern void *__tls_get_addr(unsigned lon
 #define	RTLD_DEFAULT_STACK_PF_EXEC	0
 #define	RTLD_DEFAULT_STACK_EXEC		0
 
+#define	RTLD_INIT_PAGESIZES_EARLY	1
+
 #endif

Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c	Wed Jul  2 21:53:34 2014	(r268181)
+++ head/libexec/rtld-elf/rtld.c	Wed Jul  2 22:04:12 2014	(r268182)
@@ -1802,6 +1802,11 @@ init_rtld(caddr_t mapbase, Elf_Auxinfo *
     const Elf_Dyn *dyn_soname;
     const Elf_Dyn *dyn_runpath;
 
+#ifdef RTLD_INIT_PAGESIZES_EARLY
+    /* The page size is required by the dynamic memory allocator. */
+    init_pagesizes(aux_info);
+#endif
+
     /*
      * Conjure up an Obj_Entry structure for the dynamic linker.
      *
@@ -1838,8 +1843,10 @@ init_rtld(caddr_t mapbase, Elf_Auxinfo *
     /* Now that non-local variables can be accesses, copy out obj_rtld. */
     memcpy(&obj_rtld, &objtmp, sizeof(obj_rtld));
 
+#ifndef RTLD_INIT_PAGESIZES_EARLY
     /* The page size is required by the dynamic memory allocator. */
     init_pagesizes(aux_info);
+#endif
 
     if (aux_info[AT_OSRELDATE] != NULL)
 	    osreldate = aux_info[AT_OSRELDATE]->a_un.a_val;


More information about the svn-src-all mailing list