ld.so slight difference Linux and FreeBSD ports/127946
Kostik Belousov
kostikbel at gmail.com
Sun Jun 14 10:16:09 UTC 2009
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);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-openoffice/attachments/20090614/b541e45c/attachment.pgp
More information about the freebsd-openoffice
mailing list