Date: Mon, 18 Sep 2006 12:58:51 +0300 From: Kostik Belousov <kostikbel@gmail.com> To: Jung-uk Kim <jkim@freebsd.org> Cc: kan@freebsd.org, freebsd-openoffice@freebsd.org, h.blanke@chello.nl Subject: [patch] Re: OpenOffice.org-2.0.4rc1 compile problems on -CURRENT Message-ID: <20060918095851.GA90925@deviant.kiev.zoral.com.ua> In-Reply-To: <200609151417.14241.jkim@FreeBSD.org> References: <200609142219.19636.nb_root@videotron.ca> <200609151417.14241.jkim@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--u3/rZRmxL6MmkK24 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Sep 15, 2006 at 02:17:12PM -0400, Jung-uk Kim wrote: > On Thursday 14 September 2006 10:19 pm, Nicolas Blais wrote: > --- >8 --- SNIP!!! --- >8 --- > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > Building project udkapi > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > /usr/ports/editors/openoffice.org-2.0/work/OOD680_m3/udkapi/com/sun > >/star/uno mkout -- version: 1.7 > > idlc @/tmp/mkmJ4vAL > > idlc: compile 'Exception.idl' ... > > idlc: could not load registry dll. > > idlc: detected 1 errors > > Sun Microsystems (R) idlc Version 1.1 > > > > dmake: Error code 1, while > > making '../../../../unxfbsdi.pro/misc/urd_cssuno.don' > > '---* tg_merge.mk *---' > > > > ERROR: Error 65280 occurred while > > making > > /usr/ports/editors/openoffice.org-2.0/work/OOD680_m3/udkapi/com/sun > >/star/uno dmake: Error code 1, while making > > 'build_instsetoo_native' '---* *---' > > *** Error code 255 > > > > Stop in /usr/ports/editors/openoffice.org-2.0. > > > > The port tree is up to date and so is -CURRENT. Any suggestions? >=20 > src/libexec/rtld-elf/rtld.c 1.117 has serious regression: >=20 > http://docs.freebsd.org/cgi/mid.cgi?200609081459.k88ExtSR084500 >=20 > You can revert to 1.116 and pass this but there is some other=20 > issues. :-( >=20 > Jung-uk Kim Ok, below is the patch that shall fix the issue. It was tested by Jung-uk Kim' regression test. Also, adopted patch (for STABLE) was tested with KDE (opening https:// sites) and OpenOffice 2.0.3. The latter was simply run and several documents of different types where opended. I have no resources to rebuild the beast myself. Konqueror issued a lot of warning for undefined symbols (like kdecore (KLibLoader): WARNING: KLibrary: Undefined symbol "OPENSSL_add_all_algorithms" ), but it does it with both patched and non-patched rtld on 6-STABLE. In both cases it worked normally, allowed to open the sites, and I see no excessive VM usage (I assume 30-40Mb is normal for it). Original patch (committed as rev. 1.117) scanned objects from the obj->dagmembers list for symbol retrieved by dlsym(). This appeared to be wrong by two reasons: 1. dagmembers are initialized only when dlopen actually load the dso. This caused the second test from Jung-uk Kim' regression set to fail, because it dlopen() depended dso and tries to lookup symbol from there. 2. In the case dso A depends on B and C, usage of dagmembers would cause B to expose symbols from C, that is wrong too. Attached patch uses obj->needed, that is filled for each dso, and is a real DAG instead of list. Patch (hopefully) implements SUSv3-required breadth-fi= rst lookup for dependent symbols. Please, give it a try. Patch for rtld.c rev. 1.117 (CURRENT) 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.117 diff -u -r1.117 rtld.c --- rtld.c 8 Sep 2006 14:59:54 -0000 1.117 +++ rtld.c 18 Sep 2006 09:54:02 -0000 @@ -125,6 +125,9 @@ const Obj_Entry *, const Obj_Entry **, const Ver_Entry *, int); static const Elf_Sym *symlook_list(const char *, unsigned long, const Objl= ist *, const Obj_Entry **, const Ver_Entry *, int flags, DoneList *); +static const Elf_Sym *symlook_needed(const char *, unsigned long, + const Needed_Entry *, const Obj_Entry **, const Ver_Entry *, + int flags, DoneList *dlp); static void trace_loaded_objects(Obj_Entry *obj); static void unlink_object(Obj_Entry *); static void unload_object(Obj_Entry *); @@ -1852,17 +1855,21 @@ } =20 DoneList donelist; - const Objlist *srch_list; donelist_init(&donelist); if (obj->mainprog) { /* Search main program and all libraries loaded by it. */ - srch_list =3D &list_main; + def =3D symlook_list(name, hash, &list_main, &defobj, ve, flags, + &donelist); } else { + Needed_Entry fake; + /* Search the whole DAG rooted at the given object. */ - srch_list =3D &(obj->dagmembers); + fake.next =3D NULL; + fake.obj =3D (Obj_Entry *)obj; + fake.name =3D 0; + def =3D symlook_needed(name, hash, &fake, &defobj, ve, flags, + &donelist); } - def =3D symlook_list(name, hash, srch_list, &defobj, ve, flags, - &donelist); } =20 if (def !=3D NULL) { @@ -2362,6 +2369,57 @@ } =20 /* + * Search the symbol table of a shared object and all objects needed + * by it for a symbol of the given name. Search order is + * breadth-first. Returns a pointer to the symbol, or NULL if no + * definition was found. + */ +static const Elf_Sym * +symlook_needed(const char *name, unsigned long hash, const Needed_Entry *n= eeded, + const Obj_Entry **defobj_out, const Ver_Entry *ventry, int flags, + DoneList *dlp) +{ + const Elf_Sym *def, *def_w; + const Needed_Entry *n; + const Obj_Entry *obj, *defobj, *defobj1; + =20 + def =3D def_w =3D NULL; + defobj =3D NULL; + for (n =3D needed; n !=3D NULL; n =3D n->next) { + if ((obj =3D n->obj) =3D=3D NULL || + donelist_check(dlp, obj) || + (def =3D symlook_obj(name, hash, obj, ventry, flags)) =3D=3D N= ULL) + continue; + defobj =3D obj; + if (ELF_ST_BIND(def->st_info) !=3D STB_WEAK) { + *defobj_out =3D defobj; + return (def); + } + } + /* + * There we come when either symbol definition is not found in + * directly needed objects, or found symbol is weak. + */ + for (n =3D needed; n !=3D NULL; n =3D n->next) { + if ((obj =3D n->obj) =3D=3D NULL) + continue; + def_w =3D symlook_needed(name, hash, obj->needed, &defobj1, + ventry, flags, dlp); + if (def_w =3D=3D NULL) + continue; + if (def =3D=3D NULL) { + def =3D def_w; + defobj =3D defobj1; + } + if (ELF_ST_BIND(def_w->st_info) !=3D STB_WEAK) + break; + } + if (def !=3D NULL) + *defobj_out =3D defobj; + return def; +} + +/* * Search the symbol table of a single shared object for a symbol of * the given name and version, if requested. Returns a pointer to the * symbol, or NULL if no definition was found. For rtld.c rev. 1.106.2.3 from 6-STABLE: 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.3 diff -u -r1.106.2.3 rtld.c --- rtld.c 2 Sep 2006 20:38:13 -0000 1.106.2.3 +++ rtld.c 18 Sep 2006 08:45:49 -0000 @@ -123,7 +123,9 @@ 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 const Elf_Sym *symlook_needed(const char *, unsigned long, + const Needed_Entry *, const Obj_Entry **, bool, DoneList *); static void trace_loaded_objects(Obj_Entry *obj); static void unlink_object(Obj_Entry *); static void unload_object(Obj_Entry *); @@ -1810,20 +1812,22 @@ return NULL; } =20 + DoneList donelist; + 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); + /* Search main program and all libraries loaded by it. */ + 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; + Needed_Entry fake; + =09 + /* Search the DAG rooted at the given object */ + fake.next =3D NULL; + fake.name =3D 0; + fake.obj =3D (Obj_Entry *)obj; + def =3D symlook_needed(name, hash, &fake, &defobj, true, + &donelist); } } =20 @@ -2274,7 +2278,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; @@ -2302,6 +2306,58 @@ } =20 /* + * Search the symbol table of a shared object and all objects needed + * by it for a symbol of the given name. Search order is + * breadth-first. Returns a pointer to the symbol, or NULL if no + * definition was found. + */ +static const Elf_Sym * +symlook_needed(const char *name, unsigned long hash, const Needed_Entry *n= eeded, + const Obj_Entry **defobj_out, bool in_plt, DoneList *dlp) +{ + const Elf_Sym *def, *def_w; + const Needed_Entry *n; + const Obj_Entry *obj, *defobj, *defobj1; + =20 + def =3D def_w =3D NULL; + defobj =3D NULL; + for (n =3D needed; n !=3D NULL; n =3D n->next) { + if ((obj =3D n->obj) =3D=3D NULL || + donelist_check(dlp, obj) || + (def =3D symlook_obj(name, hash, obj, in_plt)) =3D=3D NULL) + continue; + defobj =3D obj; + if (ELF_ST_BIND(def->st_info) !=3D STB_WEAK) { + *defobj_out =3D defobj; + return (def); + } + } + /* + * There we come when either symbol definition is not found in + * directly needed objects, or found symbol is weak. + */ + for (n =3D needed; n !=3D NULL; n =3D n->next) { + if ((obj =3D n->obj) =3D=3D NULL) + continue; + def_w =3D symlook_needed(name, hash, obj->needed, &defobj1, + in_plt, dlp); + if (def_w =3D=3D NULL) + continue; + if (ELF_ST_BIND(def_w->st_info) !=3D STB_WEAK) { + *defobj_out =3D defobj1; + return (def_w); + } + if (def =3D=3D NULL) { + def =3D def_w; + defobj =3D defobj1; + } + } + if (def !=3D NULL) + *defobj_out =3D defobj; + return def; +} + +/* * Search the symbol table of a single shared object for a symbol of * the given name. Returns a pointer to the symbol, or NULL if no * definition was found. --u3/rZRmxL6MmkK24 Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (FreeBSD) iD8DBQFFDm3bC3+MBN1Mb4gRAvzKAJ98LWaKuCubzC2yjwusmmJN8qzxFQCfYUJm Om4bWhSm5E7265AaoOESAfU= =kbCM -----END PGP SIGNATURE----- --u3/rZRmxL6MmkK24--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060918095851.GA90925>