Module Name:    src
Committed By:   christos
Date:           Wed Jan 13 20:17:23 UTC 2010

Modified Files:
        src/libexec/ld.elf_so: reloc.c rtld.h symbol.c
        src/libexec/ld.elf_so/arch/alpha: alpha_reloc.c
        src/libexec/ld.elf_so/arch/arm: mdreloc.c
        src/libexec/ld.elf_so/arch/hppa: hppa_reloc.c
        src/libexec/ld.elf_so/arch/i386: mdreloc.c
        src/libexec/ld.elf_so/arch/m68k: mdreloc.c
        src/libexec/ld.elf_so/arch/mips: mips_reloc.c
        src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c
        src/libexec/ld.elf_so/arch/sh3: mdreloc.c
        src/libexec/ld.elf_so/arch/sparc: mdreloc.c
        src/libexec/ld.elf_so/arch/sparc64: mdreloc.c
        src/libexec/ld.elf_so/arch/vax: mdreloc.c
        src/libexec/ld.elf_so/arch/x86_64: mdreloc.c

Log Message:
PR/39240: Satoshi Suetake: Don't fail when attempting to resolve weak symbols
when we are doing immediate binding, leave them alone and they will be dealt
with later during lazy binding. From skrll@


To generate a diff of this commit:
cvs rdiff -u -r1.97 -r1.98 src/libexec/ld.elf_so/reloc.c
cvs rdiff -u -r1.83 -r1.84 src/libexec/ld.elf_so/rtld.h
cvs rdiff -u -r1.49 -r1.50 src/libexec/ld.elf_so/symbol.c
cvs rdiff -u -r1.33 -r1.34 src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c
cvs rdiff -u -r1.30 -r1.31 src/libexec/ld.elf_so/arch/arm/mdreloc.c
cvs rdiff -u -r1.30 -r1.31 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c
cvs rdiff -u -r1.28 -r1.29 src/libexec/ld.elf_so/arch/i386/mdreloc.c
cvs rdiff -u -r1.24 -r1.25 src/libexec/ld.elf_so/arch/m68k/mdreloc.c
cvs rdiff -u -r1.56 -r1.57 src/libexec/ld.elf_so/arch/mips/mips_reloc.c
cvs rdiff -u -r1.43 -r1.44 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
cvs rdiff -u -r1.26 -r1.27 src/libexec/ld.elf_so/arch/sh3/mdreloc.c
cvs rdiff -u -r1.42 -r1.43 src/libexec/ld.elf_so/arch/sparc/mdreloc.c
cvs rdiff -u -r1.45 -r1.46 src/libexec/ld.elf_so/arch/sparc64/mdreloc.c
cvs rdiff -u -r1.25 -r1.26 src/libexec/ld.elf_so/arch/vax/mdreloc.c
cvs rdiff -u -r1.35 -r1.36 src/libexec/ld.elf_so/arch/x86_64/mdreloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/reloc.c
diff -u src/libexec/ld.elf_so/reloc.c:1.97 src/libexec/ld.elf_so/reloc.c:1.98
--- src/libexec/ld.elf_so/reloc.c:1.97	Thu Sep 24 17:21:34 2009
+++ src/libexec/ld.elf_so/reloc.c	Wed Jan 13 15:17:21 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: reloc.c,v 1.97 2009/09/24 21:21:34 pooka Exp $	 */
+/*	$NetBSD: reloc.c,v 1.98 2010/01/13 20:17:21 christos Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -39,7 +39,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: reloc.c,v 1.97 2009/09/24 21:21:34 pooka Exp $");
+__RCSID("$NetBSD: reloc.c,v 1.98 2010/01/13 20:17:21 christos Exp $");
 #endif /* not lint */
 
 #include <err.h>
@@ -84,7 +84,7 @@
 	srcaddr = (const void *)(srcobj->relocbase + srcsym->st_value);
 	(void)memcpy(dstaddr, srcaddr, size);
 	rdbg(("COPY %s %s %s --> src=%p dst=%p size %ld",
-	    dstobj->path, srcobj->path, name, (void *)srcaddr,
+	    dstobj->path, srcobj->path, name, srcaddr,
 	    (void *)dstaddr, (long)size));
 	return (0);
 }
@@ -198,8 +198,6 @@
 		if (!ok)
 			return -1;
 
-		(void)dlerror(); /* clear any errors since all is good */
-
 		/* Set some sanity-checking numbers in the Obj_Entry. */
 		obj->magic = RTLD_MAGIC;
 		obj->version = RTLD_VERSION;

Index: src/libexec/ld.elf_so/rtld.h
diff -u src/libexec/ld.elf_so/rtld.h:1.83 src/libexec/ld.elf_so/rtld.h:1.84
--- src/libexec/ld.elf_so/rtld.h:1.83	Sun Jan 10 02:29:47 2010
+++ src/libexec/ld.elf_so/rtld.h	Wed Jan 13 15:17:21 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld.h,v 1.83 2010/01/10 07:29:47 skrll Exp $	 */
+/*	$NetBSD: rtld.h,v 1.84 2010/01/13 20:17:21 christos Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -272,6 +272,9 @@
     const Obj_Entry *, bool);
 const Elf_Sym *_rtld_find_symdef(unsigned long, const Obj_Entry *,
     const Obj_Entry **, bool);
+const Elf_Sym *_rtld_find_plt_symdef(unsigned long, const Obj_Entry *, 
+    const Obj_Entry **, bool);
+
 const Elf_Sym *_rtld_symlook_list(const char *, unsigned long,
     const Objlist *, const Obj_Entry **, bool);
 const Elf_Sym *_rtld_symlook_default(const char *, unsigned long,

Index: src/libexec/ld.elf_so/symbol.c
diff -u src/libexec/ld.elf_so/symbol.c:1.49 src/libexec/ld.elf_so/symbol.c:1.50
--- src/libexec/ld.elf_so/symbol.c:1.49	Sun Jan 10 02:29:47 2010
+++ src/libexec/ld.elf_so/symbol.c	Wed Jan 13 15:17:21 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: symbol.c,v 1.49 2010/01/10 07:29:47 skrll Exp $	 */
+/*	$NetBSD: symbol.c,v 1.50 2010/01/13 20:17:21 christos Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: symbol.c,v 1.49 2010/01/10 07:29:47 skrll Exp $");
+__RCSID("$NetBSD: symbol.c,v 1.50 2010/01/13 20:17:21 christos Exp $");
 #endif /* not lint */
 
 #include <err.h>
@@ -314,11 +314,6 @@
 	 * symbol as having the value zero.
 	 */
 	if (def == NULL && ELF_ST_BIND(ref->st_info) == STB_WEAK) {
-		if (in_plt) {
-			_rtld_error(
-			    "%s: Trying to call undefined weak symbol `%s'",
-			    refobj->path, name);
-		}
 		rdbg(("  returning _rtld_sym_z...@_rtld_objself"));
 		def = &_rtld_sym_zero;
 		defobj = &_rtld_objself;
@@ -346,6 +341,29 @@
 	return def;
 }
 
+const Elf_Sym *
+_rtld_find_plt_symdef(unsigned long symnum, const Obj_Entry *obj,
+    const Obj_Entry **defobj, bool imm)
+{
+ 	const Elf_Sym  *def = _rtld_find_symdef(symnum, obj, defobj, true);
+	if (__predict_false(def == NULL))
+ 		return NULL;
+
+	if (__predict_false(def == &_rtld_sym_zero)) {
+		/* tp is set during lazy binding. */
+		if (imm) {
+			const Elf_Sym	*ref = obj->symtab + symnum;
+			const char	*name = obj->strtab + ref->st_name;
+
+			_rtld_error(
+			    "%s: Trying to call undefined weak symbol `%s'",
+			    obj->path, name);
+			return NULL;
+		}
+	}
+	return def;
+}
+
 /*
  * Given a symbol name in a referencing object, find the corresponding
  * definition of the symbol.  Returns a pointer to the symbol, or NULL if

Index: src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c
diff -u src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.33 src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.34
--- src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.33	Sat Aug 29 09:46:54 2009
+++ src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c	Wed Jan 13 15:17:21 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: alpha_reloc.c,v 1.33 2009/08/29 13:46:54 jmmv Exp $	*/
+/*	$NetBSD: alpha_reloc.c,v 1.34 2010/01/13 20:17:21 christos Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -62,7 +62,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: alpha_reloc.c,v 1.33 2009/08/29 13:46:54 jmmv Exp $");
+__RCSID("$NetBSD: alpha_reloc.c,v 1.34 2010/01/13 20:17:21 christos Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -304,15 +304,18 @@
 {
 	Elf_Addr *where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
 	Elf_Addr new_value;
-	const Elf_Sym  *def;
+	const Elf_Sym *def;
 	const Obj_Entry *defobj;
 	Elf_Addr stubaddr; 
+	unsigned long info = rela->r_info;
 
-	assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
+	assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
 
-	def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, true);
-	if (def == NULL)
+	def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj, tp != NULL);
+	if (__predict_false(def == NULL))
 		return -1;
+	if (__predict_false(def == &_rtld_sym_zero))
+		return 0;
 
 	new_value = (Elf_Addr)(defobj->relocbase + def->st_value);
 	rdbg(("bind now/fixup in %s --> old=%p new=%p",
@@ -481,7 +484,7 @@
 	int err;
 
 	err = _rtld_relocate_plt_object(obj, rela, &result);
-	if (err || result == 0)
+	if (err)
 		_rtld_die();
 
 	return (caddr_t)result;

Index: src/libexec/ld.elf_so/arch/arm/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.30 src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.31
--- src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.30	Sat Aug 29 09:46:54 2009
+++ src/libexec/ld.elf_so/arch/arm/mdreloc.c	Wed Jan 13 15:17:22 2010
@@ -1,8 +1,8 @@
-/*	$NetBSD: mdreloc.c,v 1.30 2009/08/29 13:46:54 jmmv Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.31 2010/01/13 20:17:22 christos Exp $	*/
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.30 2009/08/29 13:46:54 jmmv Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.31 2010/01/13 20:17:22 christos Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -225,12 +225,15 @@
 	Elf_Addr new_value;
 	const Elf_Sym  *def;
 	const Obj_Entry *defobj;
+	unsigned long info = rel->r_info;
 
-	assert(ELF_R_TYPE(rel->r_info) == R_TYPE(JUMP_SLOT));
+	assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
 
-	def = _rtld_find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, true);
-	if (def == NULL)
+	def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj, tp != NULL);
+	if (__predict_false(def == NULL))
 		return -1;
+	if (__predict_false(def == &_rtld_sym_zero))
+		return 0;
 
 	new_value = (Elf_Addr)(defobj->relocbase + def->st_value);
 	/* Set the Thumb bit, if needed.  */
@@ -254,7 +257,7 @@
 	int err;
 
 	err = _rtld_relocate_plt_object(obj, rel, &new_value);
-	if (err || new_value == 0)
+	if (err)
 		_rtld_die();
 
 	return (caddr_t)new_value;

Index: src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c
diff -u src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.30 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.31
--- src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.30	Fri Sep 25 13:49:56 2009
+++ src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c	Wed Jan 13 15:17:22 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: hppa_reloc.c,v 1.30 2009/09/25 17:49:56 skrll Exp $	*/
+/*	$NetBSD: hppa_reloc.c,v 1.31 2010/01/13 20:17:22 christos Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2004 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: hppa_reloc.c,v 1.30 2009/09/25 17:49:56 skrll Exp $");
+__RCSID("$NetBSD: hppa_reloc.c,v 1.31 2010/01/13 20:17:22 christos Exp $");
 #endif /* not lint */
 
 #include <stdlib.h>
@@ -549,16 +549,20 @@
 	const Elf_Sym *def;
 	const Obj_Entry *defobj;
 	Elf_Addr	func_pc, func_sl;
+	unsigned long info = rela->r_info;
 
-	assert(ELF_R_TYPE(rela->r_info) == R_TYPE(IPLT));
+	assert(ELF_R_TYPE(info) == R_TYPE(IPLT));
 
-	if (ELF_R_SYM(rela->r_info) == 0) {
+	if (ELF_R_SYM(info) == 0) {
 		func_pc = (Elf_Addr)(obj->relocbase + rela->r_addend);
 		func_sl = (Elf_Addr)(obj->pltgot);
 	} else {
-		def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, true);
-		if (def == NULL)
+		def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj,
+		    tp != NULL);
+		if (__predict_false(def == NULL))
 			return -1;
+		if (__predict_false(def == &_rtld_sym_zero))
+			return 0;
 
 		func_pc = (Elf_Addr)(defobj->relocbase + def->st_value + rela->r_addend);
 		func_sl = (Elf_Addr)(defobj->pltgot);
@@ -594,7 +598,7 @@
 	assert(ELF_R_SYM(rela->r_info) != 0);
 
 	err = _rtld_relocate_plt_object(obj, rela, &new_value); 
-	if (err || new_value == 0)
+	if (err)
 		_rtld_die();
 
 	return (caddr_t)new_value;

Index: src/libexec/ld.elf_so/arch/i386/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.28 src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.29
--- src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.28	Sat Aug 29 09:46:54 2009
+++ src/libexec/ld.elf_so/arch/i386/mdreloc.c	Wed Jan 13 15:17:22 2010
@@ -1,8 +1,8 @@
-/*	$NetBSD: mdreloc.c,v 1.28 2009/08/29 13:46:54 jmmv Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.29 2010/01/13 20:17:22 christos Exp $	*/
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.28 2009/08/29 13:46:54 jmmv Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.29 2010/01/13 20:17:22 christos Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -164,12 +164,16 @@
 	Elf_Addr target;
 	const Elf_Sym *def;
 	const Obj_Entry *defobj;
+	unsigned long info = rel->r_info;
 
-	assert(ELF_R_TYPE(rel->r_info) == R_TYPE(JMP_SLOT));
+	assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
 
-	def = _rtld_find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, true);
-	if (def == NULL)
+	def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj, tp != NULL);
+	if (__predict_false(def == NULL))
 		return -1;
+	if (__predict_false(def == &_rtld_sym_zero))
+		return 0;
+
 	target = (Elf_Addr)(defobj->relocbase + def->st_value);
 	rdbg(("bind now/fixup in %s --> old=%p new=%p",
 	    defobj->strtab + def->st_name, (void *)*where, 
@@ -189,7 +193,7 @@
 	int err;
 
 	err = _rtld_relocate_plt_object(obj, rel, &new_value);
-	if (err || new_value == 0)
+	if (err)
 		_rtld_die();
 
 	return (caddr_t)new_value;

Index: src/libexec/ld.elf_so/arch/m68k/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.24 src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.25
--- src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.24	Sat Aug 29 09:46:55 2009
+++ src/libexec/ld.elf_so/arch/m68k/mdreloc.c	Wed Jan 13 15:17:22 2010
@@ -1,13 +1,13 @@
-/*	$NetBSD: mdreloc.c,v 1.24 2009/08/29 13:46:55 jmmv Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.25 2010/01/13 20:17:22 christos Exp $	*/
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.24 2009/08/29 13:46:55 jmmv Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.25 2010/01/13 20:17:22 christos Exp $");
 #endif /* not lint */
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.24 2009/08/29 13:46:55 jmmv Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.25 2010/01/13 20:17:22 christos Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -171,12 +171,15 @@
 	Elf_Addr new_value;
 	const Elf_Sym  *def;
 	const Obj_Entry *defobj;
+	unsigned long info = rela->r_info;
 
-	assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
+	assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
 
-	def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, true);
-	if (def == NULL)
+	def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj, tp != NULL);
+	if (__predict_false(def == NULL))
 		return -1;
+	if (__predict_false(def == &_rtld_sym_zero))
+		return 0;
 
 	assert(rela->r_addend == 0);
 	new_value = (Elf_Addr)(defobj->relocbase + def->st_value +
@@ -202,7 +205,7 @@
 	result = 0;	/* XXX gcc */
 
 	err = _rtld_relocate_plt_object(obj, rela, &result);
-	if (err || result == 0)
+	if (err)
 		_rtld_die();
 
 	return (caddr_t)result;

Index: src/libexec/ld.elf_so/arch/mips/mips_reloc.c
diff -u src/libexec/ld.elf_so/arch/mips/mips_reloc.c:1.56 src/libexec/ld.elf_so/arch/mips/mips_reloc.c:1.57
--- src/libexec/ld.elf_so/arch/mips/mips_reloc.c:1.56	Sun Dec 13 19:41:18 2009
+++ src/libexec/ld.elf_so/arch/mips/mips_reloc.c	Wed Jan 13 15:17:22 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: mips_reloc.c,v 1.56 2009/12/14 00:41:18 matt Exp $	*/
+/*	$NetBSD: mips_reloc.c,v 1.57 2010/01/13 20:17:22 christos Exp $	*/
 
 /*
  * Copyright 1997 Michael L. Hitch <[email protected]>
@@ -30,7 +30,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mips_reloc.c,v 1.56 2009/12/14 00:41:18 matt Exp $");
+__RCSID("$NetBSD: mips_reloc.c,v 1.57 2010/01/13 20:17:22 christos Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -407,9 +407,11 @@
 	const Obj_Entry *defobj;
 	Elf_Addr new_value;
 
-	def = _rtld_find_symdef(sym, obj, &defobj, true);
-	if (def == NULL)
+	def = _rtld_find_plt_symdef(sym, obj, &defobj, tp != NULL);
+	if (__predict_false(def == NULL))
 		return -1;
+	if (__predict_false(def == &_rtld_sym_zero))
+		return 0;
 
 	new_value = (Elf_Addr)(defobj->relocbase + def->st_value);
 	rdbg(("bind now/fixup in %s --> new=%p",
@@ -430,7 +432,7 @@
 	int err;
 
 	err = _rtld_relocate_plt_object(obj, a0, &new_value);
-	if (err || new_value == 0)
+	if (err)
 		_rtld_die();
 
 	return (caddr_t)new_value;

Index: src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.43 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.44
--- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.43	Sat Aug 29 09:46:55 2009
+++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c	Wed Jan 13 15:17:22 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ppc_reloc.c,v 1.43 2009/08/29 13:46:55 jmmv Exp $	*/
+/*	$NetBSD: ppc_reloc.c,v 1.44 2010/01/13 20:17:22 christos Exp $	*/
 
 /*-
  * Copyright (C) 1998	Tsubai Masanari
@@ -30,7 +30,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ppc_reloc.c,v 1.43 2009/08/29 13:46:55 jmmv Exp $");
+__RCSID("$NetBSD: ppc_reloc.c,v 1.44 2010/01/13 20:17:22 christos Exp $");
 #endif /* not lint */
 
 #include <stdarg.h>
@@ -253,12 +253,15 @@
 	const Elf_Sym *def;
 	const Obj_Entry *defobj;
 	int distance;
+	unsigned long info = rela->r_info;
 
-	assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
+	assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
 
-	def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, true);
-	if (def == NULL)
+	def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj, tp != NULL);
+	if (__predict_false(def == NULL))
 		return -1;
+	if (__predict_false(def == &_rtld_sym_zero))
+		return 0;
 
 	value = (Elf_Addr)(defobj->relocbase + def->st_value);
 	distance = value - (Elf_Addr)where;
@@ -312,7 +315,7 @@
 	new_value = 0;	/* XXX gcc */
 
 	err = _rtld_relocate_plt_object(obj, rela, reloff, &new_value); 
-	if (err || new_value == 0)
+	if (err)
 		_rtld_die();
 
 	return (caddr_t)new_value;

Index: src/libexec/ld.elf_so/arch/sh3/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/sh3/mdreloc.c:1.26 src/libexec/ld.elf_so/arch/sh3/mdreloc.c:1.27
--- src/libexec/ld.elf_so/arch/sh3/mdreloc.c:1.26	Sat Aug 29 09:46:55 2009
+++ src/libexec/ld.elf_so/arch/sh3/mdreloc.c	Wed Jan 13 15:17:22 2010
@@ -1,13 +1,13 @@
-/*	$NetBSD: mdreloc.c,v 1.26 2009/08/29 13:46:55 jmmv Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.27 2010/01/13 20:17:22 christos Exp $	*/
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.26 2009/08/29 13:46:55 jmmv Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.27 2010/01/13 20:17:22 christos Exp $");
 #endif /* not lint */
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.26 2009/08/29 13:46:55 jmmv Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.27 2010/01/13 20:17:22 christos Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -202,7 +202,7 @@
 	new_value = 0;	/* XXX gcc */
 
 	err = _rtld_relocate_plt_object(obj, rela, &new_value);
-	if (err || new_value == 0)
+	if (err)
 		_rtld_die();
 
 	return (caddr_t)new_value;
@@ -227,12 +227,15 @@
 	Elf_Addr new_value;
 	const Elf_Sym  *def;
 	const Obj_Entry *defobj;
+	unsigned long info = rela->r_info;
 
-	assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
+	assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
 
-	def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, true);
-	if (def == NULL)
+	def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj, tp != NULL);
+	if (__predict_false(def == NULL))
 		return -1;
+	if (__predict_false(def == &_rtld_sym_zero))
+		return 0;
 
 	new_value = (Elf_Addr)(defobj->relocbase + def->st_value);
 	rdbg(("bind now/fixup in %s --> old=%p new=%p",

Index: src/libexec/ld.elf_so/arch/sparc/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/sparc/mdreloc.c:1.42 src/libexec/ld.elf_so/arch/sparc/mdreloc.c:1.43
--- src/libexec/ld.elf_so/arch/sparc/mdreloc.c:1.42	Sun Mar 15 22:46:47 2009
+++ src/libexec/ld.elf_so/arch/sparc/mdreloc.c	Wed Jan 13 15:17:22 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: mdreloc.c,v 1.42 2009/03/16 02:46:47 lukem Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.43 2010/01/13 20:17:22 christos Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2002 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.42 2009/03/16 02:46:47 lukem Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.43 2010/01/13 20:17:22 christos Exp $");
 #endif /* not lint */
 
 #include <errno.h>
@@ -327,7 +327,7 @@
 	value = 0;	/* XXX gcc */
 
 	err = _rtld_relocate_plt_object(obj, rela, &value);
-	if (err || value == 0)
+	if (err)
 		_rtld_die();
 
 	return (caddr_t)value;
@@ -352,14 +352,15 @@
 	const Obj_Entry *defobj;
 	Elf_Word *where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
 	Elf_Addr value;
+	unsigned long info = rela->r_info;
 
-	/* Fully resolve procedure addresses now */
+	assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
 
-	assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
-
-	def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, true);
-	if (def == NULL)
+	def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj, tp != NULL);
+	if (__predict_false(def == NULL))
 		return -1;
+	if (__predict_false(def == &_rtld_sym_zero))
+		return 0;
 
 	value = (Elf_Addr)(defobj->relocbase + def->st_value);
 	rdbg(("bind now/fixup in %s --> new=%p", 

Index: src/libexec/ld.elf_so/arch/sparc64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.45 src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.46
--- src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.45	Fri May 22 17:47:46 2009
+++ src/libexec/ld.elf_so/arch/sparc64/mdreloc.c	Wed Jan 13 15:17:22 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: mdreloc.c,v 1.45 2009/05/22 21:47:46 martin Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.46 2010/01/13 20:17:22 christos Exp $	*/
 
 /*-
  * Copyright (c) 2000 Eduardo Horvath.
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.45 2009/05/22 21:47:46 martin Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.46 2010/01/13 20:17:22 christos Exp $");
 #endif /* not lint */
 
 #include <errno.h>
@@ -473,7 +473,7 @@
 	}
 
 	err = _rtld_relocate_plt_object(obj, rela, &result);
-	if (err || result == 0)
+	if (err)
 		_rtld_die();
 
 	return (caddr_t)result;
@@ -511,14 +511,15 @@
 	const Elf_Sym *def;
 	const Obj_Entry *defobj;
 	Elf_Addr value, offset;
+	unsigned long info = rela->r_info;
 
-	/* Fully resolve procedure addresses now */
+	assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
 
-	assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
-
-	def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, true);
-	if (def == NULL)
+	def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj, tp != NULL);
+	if (__predict_false(def == NULL))
 		return -1;
+	if (__predict_false(def == &_rtld_sym_zero))
+		return 0;
 
 	value = (Elf_Addr)(defobj->relocbase + def->st_value);
 	rdbg(("bind now/fixup in %s --> new=%p", 

Index: src/libexec/ld.elf_so/arch/vax/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/vax/mdreloc.c:1.25 src/libexec/ld.elf_so/arch/vax/mdreloc.c:1.26
--- src/libexec/ld.elf_so/arch/vax/mdreloc.c:1.25	Sat Aug 29 09:46:55 2009
+++ src/libexec/ld.elf_so/arch/vax/mdreloc.c	Wed Jan 13 15:17:23 2010
@@ -1,13 +1,13 @@
-/*	$NetBSD: mdreloc.c,v 1.25 2009/08/29 13:46:55 jmmv Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.26 2010/01/13 20:17:23 christos Exp $	*/
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.25 2009/08/29 13:46:55 jmmv Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.26 2010/01/13 20:17:23 christos Exp $");
 #endif /* not lint */
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.25 2009/08/29 13:46:55 jmmv Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.26 2010/01/13 20:17:23 christos Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -156,12 +156,15 @@
 	Elf_Addr new_value;
 	const Elf_Sym  *def;
 	const Obj_Entry *defobj;
+	unsigned long info = rela->r_info;
 
-	assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
+	assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
 
-	def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, true);
-	if (def == NULL)
+	def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj, tp != NULL);
+	if (__predict_false(def == NULL))
 		return -1;
+	if (__predict_false(def == &_rtld_sym_zero))
+		return 0;
 
 	new_value = (Elf_Addr)(defobj->relocbase + def->st_value +
 	    rela->r_addend);
@@ -186,7 +189,7 @@
 	result = 0;	/* XXX gcc */
 
 	err = _rtld_relocate_plt_object(obj, rela, &result);
-	if (err || result == 0)
+	if (err)
 		_rtld_die();
 
 	return (caddr_t)result;

Index: src/libexec/ld.elf_so/arch/x86_64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:1.35 src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:1.36
--- src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:1.35	Sat Aug 29 09:46:55 2009
+++ src/libexec/ld.elf_so/arch/x86_64/mdreloc.c	Wed Jan 13 15:17:23 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: mdreloc.c,v 1.35 2009/08/29 13:46:55 jmmv Exp $	*/
+/*	$NetBSD: mdreloc.c,v 1.36 2010/01/13 20:17:23 christos Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -68,7 +68,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.35 2009/08/29 13:46:55 jmmv Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.36 2010/01/13 20:17:23 christos Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -259,12 +259,16 @@
 	Elf_Addr new_value;
 	const Elf_Sym  *def;
 	const Obj_Entry *defobj;
+	unsigned long info = rela->r_info;
 
-	assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JUMP_SLOT));
+	assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
 
-	def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, true);
-	if (def == NULL)
+	def = _rtld_find_plt_symdef(ELF_R_SYM(info), obj, &defobj, tp != NULL);
+	if (__predict_false(def == NULL))
 		return -1;
+	if (__predict_false(def == &_rtld_sym_zero))
+		return 0;
+
 	new_value = (Elf_Addr)(defobj->relocbase + def->st_value +
 	    rela->r_addend);
 	rdbg(("bind now/fixup in %s --> old=%p new=%p", 
@@ -288,7 +292,7 @@
 	new_value = 0; /* XXX GCC4 */
 
 	error = _rtld_relocate_plt_object(obj, rela, &new_value);
-	if (error || new_value == 0)
+	if (error)
 		_rtld_die();
 
 	return (caddr_t)new_value;

Reply via email to