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