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 If a DF_1_NODELETE DSO has been removed fr...



details:   https://anonhg.NetBSD.org/src/rev/1f4a67910ea8
branches:  trunk
changeset: 355677:1f4a67910ea8
user:      joerg <joerg%NetBSD.org@localhost>
date:      Wed Aug 09 18:44:32 2017 +0000

description:
If a DF_1_NODELETE DSO has been removed from the DAG list, it still
needs to be able to resolve relocations against itself. As such, search
the referencing object explicitly last, if it hasn't been searched
before.

diffstat:

 libexec/ld.elf_so/symbol.c |  19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)

diffs (40 lines):

diff -r be8e9968b751 -r 1f4a67910ea8 libexec/ld.elf_so/symbol.c
--- a/libexec/ld.elf_so/symbol.c        Wed Aug 09 17:20:44 2017 +0000
+++ b/libexec/ld.elf_so/symbol.c        Wed Aug 09 18:44:32 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: symbol.c,v 1.68 2017/06/19 11:57:01 joerg Exp $         */
+/*     $NetBSD: symbol.c,v 1.69 2017/08/09 18:44:32 joerg Exp $         */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: symbol.c,v 1.68 2017/06/19 11:57:01 joerg Exp $");
+__RCSID("$NetBSD: symbol.c,v 1.69 2017/08/09 18:44:32 joerg Exp $");
 #endif /* not lint */
 
 #include <err.h>
@@ -480,6 +480,21 @@
        }
 
        /*
+        * Finally, look in the referencing object if not linked symbolically.
+        * This is necessary for DF_1_NODELETE objects where the containing DAG
+        * has been unlinked, so local references are resolved properly.
+        */
+       if ((def == NULL || ELF_ST_BIND(def->st_info) == STB_WEAK) &&
+           !refobj->symbolic && !_rtld_donelist_check(&donelist, refobj)) {
+               rdbg(("search referencing object for %s", name));
+               symp = _rtld_symlook_obj(name, hash, refobj, flags, ventry);
+               if (symp != NULL) {
+                       def = symp;
+                       defobj = refobj;
+               }
+       }
+
+       /*
         * Search the dynamic linker itself, and possibly resolve the
         * symbol from there.  This is how the application links to
         * dynamic linker services such as dlopen.



Home | Main Index | Thread Index | Old Index