Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/libexec/ld.elf_so PR/39240: Satoshi Suetake: Don't fail when...
details: https://anonhg.NetBSD.org/src/rev/8925ce47f54b
branches: trunk
changeset: 750770:8925ce47f54b
user: christos <christos%NetBSD.org@localhost>
date: Wed Jan 13 20:17:21 2010 +0000
description:
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@
diffstat:
libexec/ld.elf_so/arch/alpha/alpha_reloc.c | 17 +++++++++------
libexec/ld.elf_so/arch/arm/mdreloc.c | 15 ++++++++-----
libexec/ld.elf_so/arch/hppa/hppa_reloc.c | 18 ++++++++++------
libexec/ld.elf_so/arch/i386/mdreloc.c | 16 +++++++++-----
libexec/ld.elf_so/arch/m68k/mdreloc.c | 17 +++++++++------
libexec/ld.elf_so/arch/mips/mips_reloc.c | 12 ++++++----
libexec/ld.elf_so/arch/powerpc/ppc_reloc.c | 15 ++++++++-----
libexec/ld.elf_so/arch/sh3/mdreloc.c | 17 +++++++++------
libexec/ld.elf_so/arch/sparc/mdreloc.c | 17 ++++++++-------
libexec/ld.elf_so/arch/sparc64/mdreloc.c | 17 ++++++++-------
libexec/ld.elf_so/arch/vax/mdreloc.c | 17 +++++++++------
libexec/ld.elf_so/arch/x86_64/mdreloc.c | 16 +++++++++-----
libexec/ld.elf_so/reloc.c | 8 ++----
libexec/ld.elf_so/rtld.h | 5 +++-
libexec/ld.elf_so/symbol.c | 32 +++++++++++++++++++++++------
15 files changed, 146 insertions(+), 93 deletions(-)
diffs (truncated from 676 to 300 lines):
diff -r 6480c42d0958 -r 8925ce47f54b libexec/ld.elf_so/arch/alpha/alpha_reloc.c
--- a/libexec/ld.elf_so/arch/alpha/alpha_reloc.c Wed Jan 13 15:31:47 2010 +0000
+++ b/libexec/ld.elf_so/arch/alpha/alpha_reloc.c Wed Jan 13 20:17:21 2010 +0000
@@ -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;
diff -r 6480c42d0958 -r 8925ce47f54b libexec/ld.elf_so/arch/arm/mdreloc.c
--- a/libexec/ld.elf_so/arch/arm/mdreloc.c Wed Jan 13 15:31:47 2010 +0000
+++ b/libexec/ld.elf_so/arch/arm/mdreloc.c Wed Jan 13 20:17:21 2010 +0000
@@ -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;
diff -r 6480c42d0958 -r 8925ce47f54b libexec/ld.elf_so/arch/hppa/hppa_reloc.c
--- a/libexec/ld.elf_so/arch/hppa/hppa_reloc.c Wed Jan 13 15:31:47 2010 +0000
+++ b/libexec/ld.elf_so/arch/hppa/hppa_reloc.c Wed Jan 13 20:17:21 2010 +0000
@@ -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;
diff -r 6480c42d0958 -r 8925ce47f54b libexec/ld.elf_so/arch/i386/mdreloc.c
--- a/libexec/ld.elf_so/arch/i386/mdreloc.c Wed Jan 13 15:31:47 2010 +0000
+++ b/libexec/ld.elf_so/arch/i386/mdreloc.c Wed Jan 13 20:17:21 2010 +0000
@@ -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;
diff -r 6480c42d0958 -r 8925ce47f54b libexec/ld.elf_so/arch/m68k/mdreloc.c
--- a/libexec/ld.elf_so/arch/m68k/mdreloc.c Wed Jan 13 15:31:47 2010 +0000
+++ b/libexec/ld.elf_so/arch/m68k/mdreloc.c Wed Jan 13 20:17:21 2010 +0000
@@ -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;
diff -r 6480c42d0958 -r 8925ce47f54b libexec/ld.elf_so/arch/mips/mips_reloc.c
--- a/libexec/ld.elf_so/arch/mips/mips_reloc.c Wed Jan 13 15:31:47 2010 +0000
+++ b/libexec/ld.elf_so/arch/mips/mips_reloc.c Wed Jan 13 20:17:21 2010 +0000
@@ -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 <mhitch%montana.edu@localhost>
@@ -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;
diff -r 6480c42d0958 -r 8925ce47f54b libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
--- a/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c Wed Jan 13 15:31:47 2010 +0000
+++ b/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c Wed Jan 13 20:17:21 2010 +0000
@@ -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;
Home |
Main Index |
Thread Index |
Old Index