Date: Tue, 3 Oct 2000 11:12:06 -0700 (PDT) From: jdp@polstra.com To: hackers@freebsd.org Cc: mirko.viviani@rccr.cremona.it Subject: Re: dlopen() & objc initializer... Message-ID: <200010031812.e93IC6l16826@vashon.polstra.com> In-Reply-To: <200010031324.PAA21704@rccr1.rccr.cremona.it> References: <200010031324.PAA21704@rccr1.rccr.cremona.it>
next in thread | previous in thread | raw e-mail | index | archive | help
In article <200010031324.PAA21704@rccr1.rccr.cremona.it>,
<mirko.viviani@rccr.cremona.it> wrote:
> I have an ObjC shared object compiled in this way:
>
> gcc -shared -rdynamic -o Bundle BreakTest.o SetTestCase.o -lSenFoundation -lSenTestingKit
>
> When I load this object with dlopen() the __objc_exec_class() initializer
> of the libraries's classes are called first than the objc initializers of the
> bundle shared objects (BreakTest.o and SetTestCase.o).
> Why ?
Because by specifying the needed libraries (-lSenFoundation
-lSenTestingKit) you are in effect stating that the other shared
objects depend on those libraries. The dynamic linker initializes
the libraries before it initializes the shared objects which depend
on them. That is almost always the correct thing to do. Suppose for
example that BreakTest.o contains a constructor which calls a function
in libSenFoundation. The library had better be initialized already
when that happens.
This is also the ordering used in Solaris, by the way. From their
ld.so.1(1):
o It calls any initialization functions provided by the
shared object dependencies. By default these are
called in the reverse order of the topologically
sorted dependencies. Should cyclic dependencies exist,
the initialization functions are called using the
sorted order with the cycle removed. ldd(1) can be
used to display the initialization order of shared
object dependencies. See also LD_BREADTH.
I have tried a lot of different strategies for initializing shared
libraries, and the current one breaks fewer programs than any of the
others.
> Is it possible to tell the dynamic loader to call the
> BreakTest/SetTestCase objc initializer before the libs initializers
> ?
No.
> When I open an handle with dlopen() is possible to get the executable
> names/paths of the libs linked to it ?
Not directly. But you might be able to achieve what you want by
using dladdr(3).
> Is there in elf something like the __CTOR_LIST__ ?
No, nothing that is available to application programs.
> With this example is possible to know in which libs a particular symbol
> resides ?
You might be able to look up the symbol using dlsym with RTLD_DEFAULT.
Then you could pass its address to dladdr() to find out which shared
library contained the definition. See the notes in the BUGS section
of dladdr(3), though.
Also, you might need to specify RTLD_GLOBAL when loading the
libraries, if you use dlopen() for that.
By the way, when asking questions it is a good idea to say which
version of FreeBSD you are using.
John
--
John Polstra jdp@polstra.com
John D. Polstra & Co., Inc. Seattle, Washington USA
"Disappointment is a good sign of basic intelligence." -- Chögyam Trungpa
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200010031812.e93IC6l16826>
