This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: Solution to --> Re: dlopen() bug on Linux/Alpha
- To: Stefan Traby <stefan at sime dot com>
- Subject: Re: Solution to --> Re: dlopen() bug on Linux/Alpha
- From: Richard Hadsell <hadsell at blueskystudios dot com>
- Date: Sun, 11 Jan 1998 11:30:33 -0500
- CC: danimal at blueskystudios dot com, axp-list at redhat dot com, egcs-bugs at cygnus dot com, bug-glibc at prep dot ai dot mit dot edu, steve at icarus dot com
- Organization: Blue Sky | VIFX
- References: <199801110859.JAA12769@kotter.atko.at>
Stefan Traby wrote:
>
> Hi !
>
> > ST: 'Try to link the main (!) program with "-export-dynamic -shared"'
> >
> > rather than the dynamic library only we got dlopen to work. This
> > might be the solution to GNU glibc PR number 387. I am not going to
> > say it is a fix, but it is working for us.
>
> To maintainers: I don't have an AXP-machine and currently don't use gibc.
> Please check another special condition: Make a simple program
> which does dlopen and dlsym (no, don't call main :-) on itself.
> Simplified I mean dlopen(argv[0],...) but argv[0] may not contain
> the full path...
> Does it work ?
> If and only if, why ? is (export == dlsym(, "export") in this special
> case ?
>
> Of corse this is a hack and not a real-world solution. On a non glibc
> GNU-Linux/i386 system, linking with "-shared" makes the
> program dump core _before_ main is called. SIGSEGV "#0 0x4 in ?? ()"
>
> The hack is simply based on a special, simplified point of view:
> A program is a special case of an dynamic library.
> (it contains _start and main()).
> This may not be true and is not portable.
I fixed the problem by using "-export-dynamic" when linking the
executable that calls dlopen(). I did not use "-shared". The man page
for "ld" mentions that "-export-dynamic" is needed when using dlopen(),
but it doesn't say where it is needed. I had incorrectly assumed it was
needed when building the shared library that would be linked by
dlopen(), because dlopen() and dlsym() would need to be able to see the
symbols defined in the library. Instead, it seems to be equivalent to
the "-E" option on the HP-UX linker.
It would be nice for someone to improve the description of this option
on the man page. Please pass this on to anyone who knows how to do
that.
Thanks for your help.
--
Dick Hadsell 914-381-8400 Fax: 914-381-9790
Reply-to: hadsell@blueskystudios.com
Blue Sky | VIFX http://www.blueskystudios.com
1 South Road, Harrison, NY 10528