Dynamic Linker feature set query
Darryl Miles
darryl-mailinglists@netbauds.net
Wed Jun 30 11:10:00 GMT 2010
Mike Frysinger wrote:
> On Tuesday, June 29, 2010 08:10:36 Petr Baudis wrote:
> glibc already provides support for this exact scenario. many of the main
> libpthread functions are merely stubs in the C library that return appropriate
> success values when libpthread is not loaded. if an app does link against
> libpthread, then the real pthread functions are called transparently.
>
> i.e. on glibc systems, you may always utilize pthread mutex functions in
> shared libraries without needing to link against libpthread yourself and
> things will "just work".
Okay to understand this better.
In glibc enviroments where libpthread is not loaded (or not supplied by
the platform) there are still available symbols for pthread mutex
functions but calling them is a no-op ?
Are there any issues with the point in time when libpthread maybe loaded
versus the point in time when OpenSSL maybe loaded ? How does this
interaction play out, there is an implicit notation that libpthread is
not being used by libc so it not loaded already at the start of these
interactions. It also needs to be taken into account that OpenSSL maybe
loaded more than once by independent user unaware of each other.
I think you are still under the thought that OpenSSL will use no-op
pthread mutexes by default, this is not how it has ever worked. This
could however be considered under a new DSO soname, such as
libcrypto_r.so and libssl_r.so.
> agreed. openssl's configure system is already a huge pile of crap with
> system-specific checks sprinkled all over. simply add one more for glibc
> compatible targets and use the native threading library.
OpenSSL doesn't require to use threading itself, since by default it is
a single-threaded library. This means it doesn't link with libpthread
directly (which would make it a mandatory runtime requirement to use
OpenSSL).
However if the application program using OpenSSL requires to use
multi-threading and wants to make certain API calls into OpenSSL
concurrently then it can configure OpenSSL at runtime to achieve this.
This is a runtime configuration choice of their use of OpenSSL.
A large portion of OpenSSL API is not affected one way or the other by
threading. So different independent users within the same process may
or may not have the need to configure up threading at all. It is the
arbitration of the first user to do so (migrate from single to multi)
that is the focal point of the problem.
I can certainly see there is a lack of any API or mechanism by the GNU
dynamic linker to help arbitrate concerns over DSO load/unload
operations and before-first-use and after-last-use DSO
initialization/shutdown operations.
It seems the dynamic linker itself already has taken the necessary steps
internally to protect itself (from concurrency issues) but failed to
understand that it maybe charged with the task of loading/unloading
single-threaded DSOs into a multi-threaded environment. This is not a
problem presented in a static linked environment but one created by the
advent of dynamic linking in the way GNU does it (other platforms have
workable solutions, that would not require mutating the library build to
provide a new DSO soname).
Also to add: my previous example of some kind of dlopen() flag would not
address all issues, but it would address concurrency issues relating to
before-first-use and after-last-use. I think also DL API to ask the
handle for its reference count would be needed as well. A well designed
_DllMain would be better however, easier for users of DSOs to manage.
Thanks for your replies so far. This exercise is more of clarification
of what stuff exists outside of the OpenSSL project that may assist with
the problem and the general view point of the GNU runtime system
maintainers.
Darryl
More information about the Libc-help
mailing list