When is shared library initialization function executed?
Paulo Pinto
pjmlp at progtools.org
Thu Jul 22 12:11:39 UTC 2021
On Thursday, 22 July 2021 at 07:09:31 UTC, Ali Çehreli wrote:
> And who is responsible for it?
>
> I had issues with shared library initialization functions being
> executed only sometimes. That would result in shared library
> features not registering themselves with the loading program.
> (It would work when D program loaded it but not when C++ loaded
> the D library.)
>
> I opened a couple of forum threads about this but luckily I
> worked around the issue.
>
> My question is related to something a colleague told me today:
> A shared library's initialization function is not guaranteed to
> be called unless a feature of a library is actually used. This
> page seems to describe the same issue:
>
> http://interreality.org/~reed/dylib_init.html
>
> Although that page thinks this issue may not be relevant
> anymore, the fact that my colleague had it with a recent C++
> version tells me its still current.
>
> What do you know about this? Is this the same in D? Is this
> simply a loader (linker?) issue, which would affect any
> language?
>
> Thank you,
> Ali
This is very OS specific.
On Windows, it makes a difference if the DLL is an old style DLL,
or is making use of COM, because in addition to the raw DLLs
behaviours, COM introduces threading execution appartments, and
can execute either in-proc or external process (in same machine
or over the network, e.g. DCOM).
Basically if you want to control initilization code, you need to
provide a DllMain function, which gets called, when the library
is loaded for the very first time, when it is mapped into other
execution threads contexts or shared with other processes.
https://docs.microsoft.com/en-us/windows/win32/dlls/dllmain
https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-best-practices
In general POSIX shared libraries behave in a different way,
however certain UNIX variants like AIX, do have Windows like
capabilities for their shared libraries.
Then there are all the other OSes that aren't either POSIX nor
Windows based, like the aging mainframes and micro-computers.
Naturally on top of this, you have to map possible
interoperabilitiy issues with the D runtime for the said OSes.
More information about the Digitalmars-d
mailing list