|  | 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. | 
|  |  |