This version of Slackware contains support in glibc for NPTL (the
Native POSIX Thread Library). NPTL works with newer kernels (meaning
2.6.x, or a 2.4 kernel that is patched to support NPTL, but not an
unmodified "vanilla" 2.4 kernel such as Slackware uses) to provide
improved performance for threads. For most applications that do not
start large numbers of threads the difference here will not be large,
but for high traffic servers, databases, or anything that runs large
numbers of threads, NPTL should bring some improvements in scalability
and performance. For compatibility, the regular (linuxthreads)
libraries are installed in /lib, and the new NPTL versions are
installed in /lib/tls. Which versions are used depends on the kernel
you're using. If it's newer than 2.6.13, then the NPTL libraries in
/lib/tls will be used. TLS stands for "thread-local storage", and the
directory name /lib/tls is a little bit misleading since now both the
linuxthreads and NPTL versions of glibc are compiled with TLS support
included (this is needed to produce versions of tools such as ldconfig
that can run under either kind of system).
Getting all the kinks out of the build script to be able to get this to
work with either 2.4 or 2.6 kernels and be able to switch back and
forth without issues was quite a challenge, to say the least, and would
have been much harder without all the good advice and help folks sent
in to help me along and give me important hints. A special thanks goes
to Chad Corkrum for sending in some ./configure options that really
helped get the ball rolling here.
Here's some information about compiling things using these libraries --
by default, if you compile something the headers and shared libraries
used to compile and link the binary will be the linuxthreads versions,
but when you go to run the binary it will link to the NPTL library
versions (and you'll get the NPTL speed improvements) if you are
running an NPTL capable kernel. In rare cases you may find that an old
binary doesn't work right when run against the NPTL libs, and in this
case you can force it to run against the linuxthreads versions by
setting the LD_ASSUME_KERNEL variable to assume the use of a 2.4.x
(non-NPTL) kernel so that NPTL will not be used. An easy way to see
the effect of this is to try something like the following while using
an NPTL enabled kernel:
volkerdi@tree:~$ ldd /bin/bash
linux-gate.so.1 => (0xffffe000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0xb7fcf000)
libdl.so.2 => /lib/tls/libdl.so.2 (0xb7fcb000)
libc.so.6 => /lib/tls/libc.so.6 (0xb7eaf000)
/lib/ld-linux.so.2 (0xb7feb000)
Note that in the example above, the binary is running against the NPTL
libraries in /lib/tls. Now, let's try setting LD_ASSUME_KERNEL:
volkerdi@tree:~$ LD_ASSUME_KERNEL=2.4.30 ldd /bin/bash
linux-gate.so.1 => (0xffffe000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0xb7fcf000)
libdl.so.2 => /lib/libdl.so.2 (0xb7fcb000)
libc.so.6 => /lib/libc.so.6 (0xb7eb2000)
/lib/ld-linux.so.2 (0xb7feb000)
As you can see, now the binary is running against the linuxthreads
version of glibc in /lib. If you find old things that won't work with
NPTL (which should be rare), this is the method you'll want to use to
work around it.
Now for a little note about compiling things. In most cases it will be
just fine to compile against linuxthreads and run against NPTL, and
this approach will produce the most flexible binaries (ones that will
run against either linuxthreads or NPTL.) However, in some cases you
might want to use some of the new functions that are only available in
NPTL, and to do that you'll need to use the NPTL versions of pthread.h
and other headers that are different and link against the NPTL versions
of the glibc libraries. To do this you'll need to add these compile
flags to your build in an appropriate spot:
-I/usr/include/nptl -L/usr/lib/nptl
(and link with -lpthread, of course)
Have fun, and report any problems to volkerdi@slackware.com.
Pat