svn commit: r208256 - in head/libexec/rtld-elf: . amd64 arm i386 powerpc sparc64

Roman Divacky rdivacky at FreeBSD.org
Tue May 18 08:55:24 UTC 2010


Author: rdivacky
Date: Tue May 18 08:55:23 2010
New Revision: 208256
URL: http://svn.freebsd.org/changeset/base/208256

Log:
  Only use the cache after the early stage of loading. This is
  because calling mmap() etc. may use GOT which is not set up
  yet. Use calloc() instead of mmap() in cases where this
  was the case before (sparc64, powerpc, arm).
  
  Submitted by:	Dimitry Andric (dimitry andric com)
  Reviewed by:	kan
  Approved by:	ed (mentor)

Modified:
  head/libexec/rtld-elf/amd64/reloc.c
  head/libexec/rtld-elf/arm/reloc.c
  head/libexec/rtld-elf/i386/reloc.c
  head/libexec/rtld-elf/powerpc/reloc.c
  head/libexec/rtld-elf/rtld.c
  head/libexec/rtld-elf/sparc64/reloc.c

Modified: head/libexec/rtld-elf/amd64/reloc.c
==============================================================================
--- head/libexec/rtld-elf/amd64/reloc.c	Tue May 18 07:45:27 2010	(r208255)
+++ head/libexec/rtld-elf/amd64/reloc.c	Tue May 18 08:55:23 2010	(r208256)
@@ -118,15 +118,16 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	const Elf_Rela *relalim;
 	const Elf_Rela *rela;
 	SymCache *cache;
-	int bytes = obj->nchains * sizeof(SymCache);
 	int r = -1;
 
 	/*
 	 * The dynamic loader may be called from a thread, we have
 	 * limited amounts of stack available so we cannot use alloca().
 	 */
-	cache = mmap(NULL, bytes, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0);
-	if (cache == MAP_FAILED)
+	if (obj != obj_rtld) {
+	    cache = calloc(obj->nchains, sizeof(SymCache));
+	    /* No need to check for NULL here */
+	} else
 	    cache = NULL;
 
 	relalim = (const Elf_Rela *) ((caddr_t) obj->rela + obj->relasize);
@@ -322,8 +323,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	}
 	r = 0;
 done:
-	if (cache)
-	    munmap(cache, bytes);
+	if (cache != NULL)
+	    free(cache);
 	return(r);
 }
 

Modified: head/libexec/rtld-elf/arm/reloc.c
==============================================================================
--- head/libexec/rtld-elf/arm/reloc.c	Tue May 18 07:45:27 2010	(r208255)
+++ head/libexec/rtld-elf/arm/reloc.c	Tue May 18 08:55:23 2010	(r208256)
@@ -245,7 +245,6 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	const Elf_Rel *rellim;
 	const Elf_Rel *rel;
 	SymCache *cache;
-	int bytes = obj->nchains * sizeof(SymCache);
 	int r = -1;
 	
 	/* The relocation for the dynamic loader has already been done. */
@@ -255,10 +254,9 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
  	 * The dynamic loader may be called from a thread, we have
 	 * limited amounts of stack available so we cannot use alloca().
 	 */
-	cache = mmap(NULL, bytes, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0);
-	if (cache == MAP_FAILED)
-		cache = NULL;
-	
+	cache = calloc(obj->nchains, sizeof(SymCache));
+	/* No need to check for NULL here */
+
 	rellim = (const Elf_Rel *)((caddr_t)obj->rel + obj->relsize);
 	for (rel = obj->rel; rel < rellim; rel++) {
 		if (reloc_nonplt_object(obj, rel, cache) < 0)
@@ -266,9 +264,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	}
 	r = 0;
 done:
-	if (cache) {
-		munmap(cache, bytes);
-	}
+	if (cache != NULL)
+		free(cache);
 	return (r);
 }
 

Modified: head/libexec/rtld-elf/i386/reloc.c
==============================================================================
--- head/libexec/rtld-elf/i386/reloc.c	Tue May 18 07:45:27 2010	(r208255)
+++ head/libexec/rtld-elf/i386/reloc.c	Tue May 18 08:55:23 2010	(r208256)
@@ -119,15 +119,16 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	const Elf_Rel *rellim;
 	const Elf_Rel *rel;
 	SymCache *cache;
-	int bytes = obj->nchains * sizeof(SymCache);
 	int r = -1;
 
 	/*
 	 * The dynamic loader may be called from a thread, we have
 	 * limited amounts of stack available so we cannot use alloca().
 	 */
-	cache = mmap(NULL, bytes, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0);
-	if (cache == MAP_FAILED)
+	if (obj != obj_rtld) {
+	    cache = calloc(obj->nchains, sizeof(SymCache));
+	    /* No need to check for NULL here */
+	} else
 	    cache = NULL;
 
 	rellim = (const Elf_Rel *) ((caddr_t) obj->rel + obj->relsize);
@@ -273,8 +274,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	}
 	r = 0;
 done:
-	if (cache)
-	    munmap(cache, bytes);
+	if (cache != NULL)
+	    free(cache);
 	return(r);
 }
 

Modified: head/libexec/rtld-elf/powerpc/reloc.c
==============================================================================
--- head/libexec/rtld-elf/powerpc/reloc.c	Tue May 18 07:45:27 2010	(r208255)
+++ head/libexec/rtld-elf/powerpc/reloc.c	Tue May 18 08:55:23 2010	(r208256)
@@ -287,7 +287,6 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	const Elf_Rela *relalim;
 	const Elf_Rela *rela;
 	SymCache *cache;
-	int bytes = obj->nchains * sizeof(SymCache);
 	int r = -1;
 
 	/*
@@ -295,10 +294,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	 * limited amounts of stack available so we cannot use alloca().
 	 */
 	if (obj != obj_rtld) {
-		cache = mmap(NULL, bytes, PROT_READ|PROT_WRITE, MAP_ANON,
-		    -1, 0);
-		if (cache == MAP_FAILED)
-			cache = NULL;
+		cache = calloc(obj->nchains, sizeof(SymCache));
+		/* No need to check for NULL here */
 	} else
 		cache = NULL;
 
@@ -314,9 +311,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	}
 	r = 0;
 done:
-	if (cache) {
-		munmap(cache, bytes);
-	}
+	if (cache != NULL)
+		free(cache);
 	return (r);
 }
 

Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c	Tue May 18 07:45:27 2010	(r208255)
+++ head/libexec/rtld-elf/rtld.c	Tue May 18 08:55:23 2010	(r208256)
@@ -3311,6 +3311,10 @@ allocate_module_tls(int index)
     }
 
     p = malloc(obj->tlssize);
+    if (p == NULL) {
+	_rtld_error("Cannot allocate TLS block for index %d", index);
+	die();
+    }
     memcpy(p, obj->tlsinit, obj->tlsinitsize);
     memset(p + obj->tlsinitsize, 0, obj->tlssize - obj->tlsinitsize);
 

Modified: head/libexec/rtld-elf/sparc64/reloc.c
==============================================================================
--- head/libexec/rtld-elf/sparc64/reloc.c	Tue May 18 07:45:27 2010	(r208255)
+++ head/libexec/rtld-elf/sparc64/reloc.c	Tue May 18 08:55:23 2010	(r208256)
@@ -254,7 +254,6 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	const Elf_Rela *relalim;
 	const Elf_Rela *rela;
 	SymCache *cache;
-	int bytes = obj->nchains * sizeof(SymCache);
 	int r = -1;
 
 	/*
@@ -262,10 +261,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	 * limited amounts of stack available so we cannot use alloca().
 	 */
 	if (obj != obj_rtld) {
-		cache = mmap(NULL, bytes, PROT_READ|PROT_WRITE, MAP_ANON,
-		    -1, 0);
-		if (cache == MAP_FAILED)
-			cache = NULL;
+		cache = calloc(obj->nchains, sizeof(SymCache));
+		/* No need to check for NULL here */
 	} else
 		cache = NULL;
 
@@ -276,8 +273,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry 
 	}
 	r = 0;
 done:
-	if (cache)
-		munmap(cache, bytes);
+	if (cache != NULL)
+		free(cache);
 	return (r);
 }
 


More information about the svn-src-all mailing list