Merge from vendor branch LIBARCHIVE:
[dragonfly.git] / lib / libpthread / README
1 $DragonFly: src/lib/libpthread/README,v 1.1 2007/04/17 12:34:07 corecode Exp $
2
3 Proxy libpthread
4 ================
5
6 We want to be able to switch between threading libraries at execution
7 time.  This problem is solved by this proxy libpthread.  Its operation is
8 as follows.
9
10 During link time a library is needed which defines all necessary pthread
11 functions.  By linking libpthread.so to any threading lib (default is
12 libc_r.so), this requirement is (indirectly) met.
13
14 Unfortuately ld wants to link in also recursively DT_NEEDED libs if any
15 specified object needs a symbol from these libs.  We cheat by doing the
16 following:  libc.so anyways defines all pthread functions as weak symbols
17 except for pthread_create.  libpthread.so now also defines a dummy
18 pthread_create as weak symbol and ld is satisfied.  At execution time
19 later rtld will resolve all these references to the strong symbols in the
20 right thread library.
21
22 Allowing the user to switch the threading lib works like this:  At link
23 time ld reads the SONAME of libpthread.so, which is set to libpthread.so.0
24 (or a higher major, if ABI changes).  Usually libfoo.so is a symlink to
25 libfoo.so.3 which also has set its SONAME to libfoo.so.3, so that if
26 libfoo.so.4 is being installed, programs will still continue to use
27 libfoo.so.3 and not follow the symlink libfoo.so to the newer -- and
28 possibly incompatible -- libfoo.so.4.  What we do is approximately the
29 opposite:  libpthread.so is no symlink, but nevertheless has its SONAME
30 set to libpthread.so.0.  Now, however, libpthread.so.0 is a symlink to the
31 threading library of your choice.  The linker will use the default
32 threading lib which libpthread.so is linked to, but the runtime linker
33 will instead follow the symlink.
34
35 This (obviously) does not work for static linking.