Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Sep 2010 17:04:51 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r212497 - in head/libexec/rtld-elf: . powerpc64
Message-ID:  <201009121704.o8CH4pVT081646@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Sun Sep 12 17:04:51 2010
New Revision: 212497
URL: http://svn.freebsd.org/changeset/base/212497

Log:
  Check for undefined weak symbols during PLT binding on powerpc64, and do
  not attempt to copy NULL function descriptors. This fixes LD_BIND_NOW on
  powerpc64 after r211706.
  
  Reviewed by:	kib

Modified:
  head/libexec/rtld-elf/powerpc64/reloc.c
  head/libexec/rtld-elf/rtld.c
  head/libexec/rtld-elf/rtld.h

Modified: head/libexec/rtld-elf/powerpc64/reloc.c
==============================================================================
--- head/libexec/rtld-elf/powerpc64/reloc.c	Sun Sep 12 16:28:26 2010	(r212496)
+++ head/libexec/rtld-elf/powerpc64/reloc.c	Sun Sep 12 17:04:51 2010	(r212497)
@@ -405,8 +405,13 @@ reloc_jmpslots(Obj_Entry *obj)
 		    (void *)target, basename(defobj->path));
 #endif
 
-		reloc_jmpslot(where, target, defobj, obj,
-		    (const Elf_Rel *) rela);
+		if (def == &sym_zero) {
+			/* Zero undefined weak symbols */
+			bzero(where, sizeof(struct funcdesc));
+		} else {
+			reloc_jmpslot(where, target, defobj, obj,
+			    (const Elf_Rel *) rela);
+		}
 	}
 
 	obj->jmpslots_done = true;

Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c	Sun Sep 12 16:28:26 2010	(r212496)
+++ head/libexec/rtld-elf/rtld.c	Sun Sep 12 17:04:51 2010	(r212497)
@@ -183,7 +183,7 @@ static Objlist list_main =	/* Objects lo
 static Objlist list_fini =	/* Objects needing fini() calls */
   STAILQ_HEAD_INITIALIZER(list_fini);
 
-static Elf_Sym sym_zero;	/* For resolving undefined weak refs. */
+Elf_Sym sym_zero;		/* For resolving undefined weak refs. */
 
 #define GDB_STATE(s,m)	r_debug.r_state = s; r_debug_state(&r_debug,m);
 

Modified: head/libexec/rtld-elf/rtld.h
==============================================================================
--- head/libexec/rtld-elf/rtld.h	Sun Sep 12 16:28:26 2010	(r212496)
+++ head/libexec/rtld-elf/rtld.h	Sun Sep 12 17:04:51 2010	(r212497)
@@ -261,6 +261,7 @@ extern void *xcalloc(size_t);
 extern void *xmalloc(size_t);
 extern char *xstrdup(const char *);
 extern Elf_Addr _GLOBAL_OFFSET_TABLE_[];
+extern Elf_Sym sym_zero;	/* For resolving undefined weak refs. */
 
 extern void dump_relocations (Obj_Entry *);
 extern void dump_obj_relocations (Obj_Entry *);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201009121704.o8CH4pVT081646>