Date: Mon, 15 Jun 2009 05:46:54 +0900 (JST) From: Maho NAKATA <chat95@mac.com> To: kostikbel@gmail.com Cc: kan@freebsd.org, openoffice@freebsd.org Subject: Re: ld.so slight difference Linux and FreeBSD ports/127946 Message-ID: <20090615.054654.71139727.chat95@mac.com> In-Reply-To: <20090614094141.GF23592@deviant.kiev.zoral.com.ua> References: <1244902235.49065.33.camel@localhost> <20090614.081457.193757375.chat95@mac.com> <20090614094141.GF23592@deviant.kiev.zoral.com.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi Konstantin, Your patch rocks! tested on FBSD7/i386 and it works! * Small test program works. * also PR 127946 and Issue 22253 went away. Is your patch can be commit to FBSD8 or MFC'ed to 7? Best, From: Kostik Belousov <kostikbel@gmail.com> Subject: Re: ld.so slight difference Linux and FreeBSD ports/127946 Date: Sun, 14 Jun 2009 12:41:41 +0300 > On Sun, Jun 14, 2009 at 08:14:57AM +0900, Maho NAKATA wrote: >> Hello Konstantin, and * >> >> We have a longstanding OpenOffice.org porting issue for FreeBSD. >> Strange crashes. >> So I'd like to ask you about following issue. >> http://www.openoffice.org/issues/show_bug.cgi?id=22253 >> . >> There are some small difference between ld.so implementation >> between FreeBSD and Linux. Here is the test program that identify >> the difference clearly. (it also applies to NetBSD) >> >> ------------------------------------------------ >> "dlsym() search _on_the_main_program_" i.e. the handle is not the >> dlopen()ed shared library itself, but the main program (which you get >> back with dlopen(NULL, RTLD_LAZY) ) >> I've modified your test program a bit: >> >> #include <stdio.h> >> #include <stdlib.h> >> #include <dlfcn.h> >> >> int main(int argc, char **argv) { >> void *handle, *handlemain; >> double (*cosine)(double); >> char *error; >> >> handle = dlopen ("libm.so", RTLD_LAZY|RTLD_GLOBAL); >> if (!handle) { >> fprintf (stderr, "%s\n", dlerror()); >> exit(1); >> } >> >> handlemain = dlopen(NULL, RTLD_LAZY); >> cosine = dlsym(handlemain, "cos"); >> if ((error = dlerror()) != NULL) { >> fprintf (stderr, "%s\n", error); >> exit(1); >> } >> >> printf ("%f\n", (*cosine)(2.0)); >> dlclose(handle); >> return 0; >> } >> >> On Linux: >> bash-2.05b$ ./a.out >> -0.416147 >> >> while on NetBSD: >> -bash-2.05b$ ./a.out >> Undefined symbol "cos" >> ------------------------------------------------ >> >> It seems that this is the root cause of some issues. >> http://www.openoffice.org/issues/show_bug.cgi?id=22253 >> http://www.openoffice.org/issues/show_bug.cgi?id=98781 >> maybe also >> http://www.freebsd.org/cgi/query-pr.cgi?pr=128176 >> >> It seems ld.so employs same mechanism between Linux and MacOSX. >> >> Could you please help me a bit? > > According to the Solaris dlopen(3) and dlsym(3) documentation, > objects opened with RTLD_GLOBAL shall participate in any dlsym() > search. Please, try the following patch. > > diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c > index 40ed6ed..2badcfc 100644 > --- a/libexec/rtld-elf/rtld.c > +++ b/libexec/rtld-elf/rtld.c > @@ -2141,6 +2141,11 @@ do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve, > &donelist); > } > } > + if (def == NULL) { > + donelist_init(&donelist); > + def = symlook_list(name, hash, &list_global, &defobj, ve, flags, > + &donelist); > + } > > if (def != NULL) { > rlock_release(rtld_bind_lock, lockstate);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090615.054654.71139727.chat95>