From owner-freebsd-hackers@FreeBSD.ORG Mon Jul 17 09:02:53 2006 Return-Path: X-Original-To: hackers@freebsd.org Delivered-To: freebsd-hackers@FreeBSD.ORG Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 53AD016A4DA for ; Mon, 17 Jul 2006 09:02:53 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from fw.zoral.com.ua (fw.zoral.com.ua [213.186.206.134]) by mx1.FreeBSD.org (Postfix) with ESMTP id 98FE443D45 for ; Mon, 17 Jul 2006 09:02:52 +0000 (GMT) (envelope-from kostikbel@gmail.com) Received: from deviant.kiev.zoral.com.ua (root@deviant.kiev.zoral.com.ua [10.1.1.148]) by fw.zoral.com.ua (8.13.4/8.13.4) with ESMTP id k6GI71Nt020502 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 16 Jul 2006 21:07:01 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: from deviant.kiev.zoral.com.ua (kostik@localhost [127.0.0.1]) by deviant.kiev.zoral.com.ua (8.13.6/8.13.6) with ESMTP id k6GI71Vb047611; Sun, 16 Jul 2006 21:07:01 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: (from kostik@localhost) by deviant.kiev.zoral.com.ua (8.13.6/8.13.6/Submit) id k6GI70li047497; Sun, 16 Jul 2006 21:07:00 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: deviant.kiev.zoral.com.ua: kostik set sender to kostikbel@gmail.com using -f Date: Sun, 16 Jul 2006 21:07:00 +0300 From: Kostik Belousov To: Roland Dittel Message-ID: <20060716180700.GP32624@deviant.kiev.zoral.com.ua> References: <62d3f75eb4400604406fdea341d91e41@web.de> <44B92FD7.90801@fs.ei.tum.de> <44BA1B7B.8000305@web.de> <44BA31FE.7070200@fs.ei.tum.de> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="JvUS8mwutKMHKosv" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: ClamAV version 0.88.2, clamav-milter version 0.88.2 on fw.zoral.com.ua X-Virus-Status: Clean X-Spam-Status: No, score=0.4 required=5.0 tests=ALL_TRUSTED, DNS_FROM_RFC_ABUSE,SPF_NEUTRAL autolearn=no version=3.1.3 X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on fw.zoral.com.ua Cc: hackers@freebsd.org, Simon 'corecode' Schubert Subject: Re: dlsym() on implicit loaded symbols X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 Jul 2006 09:02:53 -0000 --JvUS8mwutKMHKosv Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Sun, Jul 16, 2006 at 03:26:33PM +0200, Roland Dittel wrote: >=20 > Am 16.07.2006 um 14:33 schrieb Simon 'corecode' Schubert: >=20 > >Roland Dittel wrote: > >>>>We have a issue with dlsym() on symbols imported by a library that=20 > >>>>was loaded with dlopen(). Our code loads the libssl with dlopen()=20 > >>>>and then do a dlsym() on several symbols. This works for all=20 > >>>>symbols exported by libssl itself but fails for symbols exported by= =20 > >>>>libcrypto. > >[..] > >> func =3D dlsym(handle, "CRYPTO_set_id_callback"); > > > >you have to use RTLD_DEFAULT instead of handle, but I agree, this is=20 > >not in conformance with SUSv3: >=20 > That's it. Thank you very much. >=20 > Roland >=20 > > > > The dlsym() function shall search for the named symbol in all=20 > >objects loaded automatically as a result of loading the object=20 > >referenced by handle (see dlopen()). Load ordering is used in dlsym()=20 > >operations upon the global symbol object. The symbol resolution=20 > >algorithm used shall be dependency order as described in dlopen(). > > > > The RTLD_DEFAULT and RTLD_NEXT flags are reserved for future use. > > > >Note "in all objects loaded automatically". Good catch! > > Try this (against RELENG_6), patch for CURRENT needs some editing. Index: rtld.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /usr/local/arch/ncvs/src/libexec/rtld-elf/rtld.c,v retrieving revision 1.106.2.2 diff -u -r1.106.2.2 rtld.c --- rtld.c 30 Dec 2005 22:13:56 -0000 1.106.2.2 +++ rtld.c 16 Jul 2006 18:05:39 -0000 @@ -123,7 +123,7 @@ static const Elf_Sym *symlook_default(const char *, unsigned long hash, const Obj_Entry *refobj, const Obj_Entry **defobj_out, bool in_plt); static const Elf_Sym *symlook_list(const char *, unsigned long, - Objlist *, const Obj_Entry **, bool in_plt, DoneList *); + const Objlist *, const Obj_Entry **, bool in_plt, DoneList *); static void trace_loaded_objects(Obj_Entry *obj); static void unlink_object(Obj_Entry *); static void unload_object(Obj_Entry *); @@ -1805,25 +1805,22 @@ def =3D symlook_default(name, hash, obj, &defobj, true); } } else { + DoneList donelist; + if ((obj =3D dlcheck(handle)) =3D=3D NULL) { rlock_release(rtld_bind_lock, lockstate); return NULL; } =20 + donelist_init(&donelist); if (obj->mainprog) { - DoneList donelist; =20 /* Search main program and all libraries loaded by it. */ - donelist_init(&donelist); def =3D symlook_list(name, hash, &list_main, &defobj, true, &donelist); } else { - /* - * XXX - This isn't correct. The search should include the whole - * DAG rooted at the given object. - */ - def =3D symlook_obj(name, hash, obj, true); - defobj =3D obj; + def =3D symlook_list(name, hash, &(obj->dagmembers), &defobj, true, + &donelist); } } =20 @@ -2274,7 +2271,7 @@ } =20 static const Elf_Sym * -symlook_list(const char *name, unsigned long hash, Objlist *objlist, +symlook_list(const char *name, unsigned long hash, const Objlist *objlist, const Obj_Entry **defobj_out, bool in_plt, DoneList *dlp) { const Elf_Sym *symp; --JvUS8mwutKMHKosv Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.4 (FreeBSD) iD8DBQFEuoBDC3+MBN1Mb4gRApgAAKC+IOPo/dHm5SnzfTHYikN2vfXnIQCgn6/f imNm8J4tjJ0MyvLCzeC8bLw= =VGKN -----END PGP SIGNATURE----- --JvUS8mwutKMHKosv--