This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Global Constructors and Shared Libraries
- To: "Martin v. Loewis" <martin at loewis dot home dot cs dot tu-berlin dot de>
- Subject: Re: Global Constructors and Shared Libraries
- From: Jeffrey A Law <law at cygnus dot com>
- Date: Mon, 26 Jun 2000 09:29:13 -0600
- cc: mklein at dis dot com, gcc at gcc dot gnu dot org
- Reply-To: law at cygnus dot com
In message <200006260724.JAA00859@loewis.home.cs.tu-berlin.de>you write:
> > So collect should emit some "global initializer" into the library that
> > __main can invoke, and therefore invoke each constructor in the library?
>
> As I said: You should rather check whether you can have the system
> linker collect things, e.g. by means of special sections.
The HPUX system linker does sections, but it's handling of initializers is
fundamentally broken (it's been years since Jason & I worked on this stuff,
so I don't remember the details).
I'd be surprised if the MPE linker's behavior is significantly different
than the HPUX linker since they're built from the same sources.
> In write_c_file_stat, functions _GLOBAL__FI_<output file> are generated,
> together with optional functions _GLOBAL__
Right. The _GLOBAL__FI_<output_file> is the initializer for the shared
library <output_file> as a whole.
The following is how things work on SOM systems (32bit HPUX, MPE):
When a shared library is listed on the link line for a user program that
shared library initializer will be added to the main programs's list of
ctors to fire out of __main.
When a shared library is loaded at runtime via dl_open/shl_open calls, it
is the program's responsibility to use shl_findsym to get a pointer to the
library's initializer routine and call it.
jeff