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;