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.
This commit is contained in:
joerg 2017-08-09 18:44:32 +00:00
parent a2c4fad4b4
commit 493a7561e4

View File

@ -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>
@ -479,6 +479,21 @@ _rtld_symlook_default(const char *name, unsigned long hash,
}
}
/*
* 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