Date: Wed, 8 Oct 2008 19:29:05 -0400 From: Alexander Kabaev <kabaev@gmail.com> To: Maxim Sobolev <sobomax@FreeBSD.org> Cc: Alexander Kabaev <kan@FreeBSD.org>, "current@freebsd.org" <current@FreeBSD.org> Subject: Re: dlsym(RTLD_NEXT) and weak symbols Message-ID: <20081008192905.0b75b0a6@kan.dnsalias.net> In-Reply-To: <48ED3545.6030609@FreeBSD.org> References: <48ED27EA.9020407@FreeBSD.org> <48ED3545.6030609@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
On Wed, 08 Oct 2008 15:33:41 -0700
Maxim Sobolev <sobomax@FreeBSD.org> wrote:
>
> The following patch fixes the issue for me:
>
<SKIP>
I do not think your patch is completely correct. How about this one
instead:
=== rtld.c
==================================================================
--- rtld.c (revision 183657)
+++ rtld.c (local)
@@ -1925,7 +1925,7 @@
{
DoneList donelist;
const Obj_Entry *obj, *defobj;
- const Elf_Sym *def;
+ const Elf_Sym *def, *symp;
unsigned long hash;
int lockstate;
@@ -1951,11 +1951,28 @@
if (handle == RTLD_NEXT)
obj = obj->next;
for (; obj != NULL; obj = obj->next) {
- if ((def = symlook_obj(name, hash, obj, ve, flags)) != NULL) {
- defobj = obj;
- break;
+ if ((symp = symlook_obj(name, hash, obj, ve, flags)) != NULL) {
+ if (def == NULL || ELF_ST_BIND(symp->st_info) != STB_WEAK) {
+ def = symp;
+ defobj = obj;
+ if (ELF_ST_BIND(def->st_info) != STB_WEAK)
+ break;
+ }
}
}
+ /*
+ * 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. Only the values listed
+ * in the "exports" array can be resolved from the dynamic linker.
+ */
+ if (def == NULL || ELF_ST_BIND(def->st_info) == STB_WEAK) {
+ symp = symlook_obj(name, hash, &obj_rtld, ve, flags);
+ if (symp != NULL && is_exported(symp)) {
+ def = symp;
+ defobj = &obj_rtld;
+ }
+ }
} else {
assert(handle == RTLD_DEFAULT);
def = symlook_default(name, hash, obj, &defobj, ve, flags);
[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (FreeBSD)
iD8DBQFI7UJBQ6z1jMm+XZYRAimTAJ4sud5blRPU3p56/6DOBLj042J4NgCfRefv
qN8RLZfeIQ7PznnKigTBvm4=
=h2Bm
-----END PGP SIGNATURE-----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20081008192905.0b75b0a6>
