mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
40 lines
2.1 KiB
Text
40 lines
2.1 KiB
Text
Thread support on Linux is confused by the recent thread local storage (TLS)
|
|
support that has been put into the ELF tool chain. The TLS libraries are
|
|
installed in /lib/tls on most Linux systems.
|
|
|
|
We provide two different implementations of the os-dependent parts
|
|
of libthread for Linux. The first is intended for use on Linux 2.4 and earlier
|
|
kernels, which do not support TLS. It is in Linux.c and Linuxasm.c and
|
|
does not use the pthread interface. The second is intended for Linux 2.6
|
|
and later kernels, which do support TLS. It is in pthread.c and uses the
|
|
standard pthread interface. It expects to be linked against the TLS-aware
|
|
thread library aka NPTL.
|
|
|
|
If you use Linux.c and Linuxasm.c with TLS libraries, they do not
|
|
set up the TLS properly so you will get incorrect programs.
|
|
For example, there will only be one errno among all the procs
|
|
in your program instead of one per proc. The pthread NPTL
|
|
implementation is needed to use the TLS libraries properly.
|
|
|
|
If you use pthread.c without TLS libraries (i.e., with the old Linux
|
|
pthread library known as LinuxThreads), then you will also get
|
|
incorrect programs, although more obviously so. The LinuxThreads
|
|
library assumes it can look at the stack pointer to distinguish between
|
|
threads, but libthread does its own stack management, breaking this
|
|
assumption. If you run a pthread-compiled program with the
|
|
LinuxThreads library, LinuxThreads itself will cause a segmentation
|
|
fault in __pthread_getspecific() the first time it is called from a
|
|
non-standard stack.
|
|
|
|
So, it is important that you compile binaries that match your
|
|
system's choice of TLS vs. not-TLS libraries. The hard part is figuring
|
|
out which your system has chosen. Plan9port looks at the kernel
|
|
version you are running and assumes that on kernels that support
|
|
TLS (2.6+) you will be using TLS.
|
|
|
|
Apparently Gentoo and maybe other distributions do not follow this rule.
|
|
They use non-TLS libraries even on kernels that can support TLS.
|
|
To accomodate them, you can add a line SYSVERSION=2.4 to $PLAN9/config
|
|
to force the build to think you are running an old kernel.
|
|
The INSTALL script sets up this file automatically on Linux systems.
|
|
|