From: niklas Date: Mon, 24 Apr 2000 17:56:34 +0000 (+0000) Subject: Make dlopened modules prefer symbols defined locally X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=6eaff3b1dfdbf31c216559f91c5fb735349a3c9e;p=openbsd Make dlopened modules prefer symbols defined locally --- diff --git a/gnu/usr.bin/ld/rtld/rtld.c b/gnu/usr.bin/ld/rtld/rtld.c index 40cb78cc220..2485ffec926 100644 --- a/gnu/usr.bin/ld/rtld/rtld.c +++ b/gnu/usr.bin/ld/rtld/rtld.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld.c,v 1.16 2000/02/03 17:19:07 millert Exp $ */ +/* $OpenBSD: rtld.c,v 1.17 2000/04/24 17:56:34 niklas Exp $ */ /* $NetBSD: rtld.c,v 1.43 1996/01/14 00:35:17 pk Exp $ */ /* * Copyright (c) 1993 Paul Kranenburg @@ -1100,10 +1100,10 @@ long binder(jsp) jmpslot_t *jsp; { - struct so_map *smp, *src_map = NULL; + struct so_map *smp, *src_map; long addr; char *sym; - struct nzlist *np; + struct nzlist *np = NULL; int index; /* @@ -1124,7 +1124,18 @@ binder(jsp) sym = LM_STRINGS(smp) + LM_SYMBOL(smp,RELOC_SYMBOL(&LM_REL(smp)[index]))->nz_strx; - np = lookup(sym, &src_map, 1); + /* + * If this is a call from a dlopen(3) object, try to resolve locally + * first + */ + if (LM_PRIVATE(smp)->spd_flags & RTLD_DL) { + src_map = smp; + np = lookup(sym, &src_map, 1); + } + if (np == NULL) { + src_map = NULL; + np = lookup(sym, &src_map, 1); + } if (np == NULL) errx(1, "Undefined symbol \"%s\" called from %s:%s at %#x", sym, main_progname, smp->som_path, jsp);