summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ldso/README841
-rw-r--r--ldso/man/Makefile22
-rw-r--r--ldso/man/dlopen.3217
-rw-r--r--ldso/man/ld.so.8113
-rw-r--r--ldso/man/ld.so.texi411
-rw-r--r--ldso/man/ldconfig.8189
-rw-r--r--ldso/man/ldd.159
-rw-r--r--libpthread/linuxthreads/linuxthreads.texi1627
8 files changed, 0 insertions, 3479 deletions
diff --git a/ldso/README b/ldso/README
deleted file mode 100644
index dc37ea65c..000000000
--- a/ldso/README
+++ /dev/null
@@ -1,841 +0,0 @@
-
-Apr 20, 2001 -- Manuel Novoa III
-
-Inital port for uClibc from debian ld.so_1.9.11-9.tar.gz.
-
-Removed a.out support.
-
-****************** original ld.so.lsm file **************************
-Begin3
-Title: Linux shared, dynamic linker and utilities.
-Version: 1.9.11
-Entered-date: 01MAY99
-Description: This package contains ld.so, ld-linux.so, ldconfig,
- ldd and libdl.
-Keywords: dynamic linker, shared library, ld.so, ld-linux.so,
- ldconfig, ldd, libdl
-Author: david@ods.com (David Engel)
-Maintained-by: david@ods.com (David Engel)
-Primary-site: tsx-11.mit.edu /pub/linux/packages/GCC
- ld.so-1.9.11.tar.gz
-Alternate-site: sunsite.unc.edu /pub/Linux/GCC
- ld.so-1.9.11.tar.gz
-Platform: Linux 2.0.0 or later.
-Copying-policy: Copyrighted but freely distributable.
-End
-*********************************************************************
- Original README starts here
-*********************************************************************
-
-This package contains my ELF dynamic linkers (ld-linux.so.1), dynamic
-linker library (libdl.so.1) and utilities (ldconfig and ldd) for Linux.
-
-You need Linux kernel 2.0.0 or later with ELF support compiled in
-(i.e. not loaded as a module) to use this package.
-
-The dynamic linker is used to bootstrap programs and load shared
-libraries at startup. The dynamic linker library is used to
-dynamically load shared libraries after a program is running.
-Ldconfig is used to automatically update the symbolic links to shared
-libraries and build the cache file used by the dynamic linker. Ldd is
-used to list the shared libraries used by a program.
-
-Please see the included manual pages for further details.
-
-To install, simply run "sh instldso.sh" as root. Ready-to-go versions
-of all end-products are provided so nothing should need to be compiled
-or linked. If you are still using libc5 as your primary development
-library, you should use the "--devfiles" option when running
-instldso.sh to install the file needed to compile with libdl.
-
-ELF versions of gcc, binutils and libc are now required to compile
-everything, including the old, unsupported, a.out dynamic linker.
-Finally, an optimization level of O2 or higher must be used to compile
-ld-linux.so and libdl.so due the use of inline functions.
-
-Notable contributors to this package include Eric Youngdale, Peter
-MacDonald, Hongjiu Lu, Linus Torvalds, Lars Wirzenius, Mitch D'Souza,
-Rik Faith, Andreas Schwab and Adam Richter (not necessarily in that
-order).
-
-###################### IMPORTANT NOTICES #############################
-
-A.OUT SUPPORT:
-
-As of ld.so-1.9.0, the old, a.out dynamic loader is no longer
-officially supported. The code is still included and built, but I
-make no promises that it will work. I will accept patches for it,
-but they will not be tested by me.
-
-GLIBC (AKA LIBC6) SUPPORT:
-
-As of ld.so-1.9.0, the main focus of this package is to ease the
-transition to libc6. No significant, new features are expected to be
-added. If you need new features, switch to libc6.
-
-Except for libpthread.so, the sonames of the core libraries provided
-with libc6 have been chosen so they do not conflict with those
-provided by libc5 and ld.so. However, the current plan is not use
-new, nonconflicting sonames for other libraries such as ncurses and
-X11. This presents two problems. First, libraries using the same
-soname for both libc5 and libc6 can not be placed in the same
-directory. Second, the dynamic linkers need to make sure not to load
-a library for the wrong version of libc.
-
-The first problem is easy. Just move the old, libc5-based libraries
-to new directories (e.g. /lib/libc5-compat, /usr/lib/libc5-compat,
-etc.) and add those directories to /etc/ld.so.conf. Then install the
-new, libc6-based versions in the standard places.
-
-The second problem is more difficult. Ideally, the dynamic linkers
-would be changed to perform a complete dependency analysis on every
-library to be loaded to make sure the wrong versions aren't used.
-This approach doesn't seem worth the added complexity, especially
-since we now have symbol versioning for ELF libraries. Instead a
-simpler approach will be used, at least initially.
-
-Ldconfig has been modified to perform a (currently simple) dependency
-analysis on libraries and to store an indication in /etc/ld.so.cache
-of whether a library is for libc5, libc6 or an unknown libc. The
-dynamic linkers then only need to make a simple check at run-time to
-make sure they don't load the wrong version of a library.
-
-The dynamic linker for libc5 provided in this package, has already
-been modified to use the new information in /etc/ld.so.cache. For
-glibc versions 2.0.1 and earlier, the dynamic linker for libc6 needs
-the patch contained in glibc.patch. You should apply the patch and
-rebuild glibc before using the new ldconfig.
-
-As stated above, the dependency analysis currently done by ldconfig is
-rather simple. Basically, it looks for the sonames used by the
-various versions of libc, libm and libdl. For any approach using a
-dependency analysis such as this to work, it is very important that
-shared libraries be built with complete dependency information. This
-can be done by using the appropriate -l options when running 'gcc
--shared'. For example, when building libfoo.so which depends on libc
-and libbar, you should add -lbar and -lc gcc command line.
-
-######################################################################
-
-Changes in version 1.9.11:
-
- Fixed a bug in ld-linux.so where a reference to an
- undefined symbol could cause a segfault.
-
- Added a clarification for LD_PRELOAD to the ld.so manual
- page and added a symlink for ld-linux.so (Bug#33123).
-
- Don't install ldd for Debian except for the m68k arch
- because glibc 2.1 now includes it (Bug#35458).
-
-Changes in version 1.9.10:
-
- Changed ldconfig to issue a warning and not overwrite a
- regular file with a symlink (Bug#30859).
-
- Changed Debian packaging to conflict with and replace the
- ldconfig package (Bug#29398).
-
-Changes in version 1.9.9:
-
- Changed ld-linux.so and libdl.so to match glibc by not
- allowing user preloads of system libraries into setu/gid
- binaries unless the library itself is setuid.
-
- Fixed problems in ld-linux.so on the sparc architecture
- (Juan Cespedes).
-
-Changes in version 1.9.8:
-
- Changed ldconfig to allow the expected type for all
- libraries in a directory to be optionally specified
- (Mark Phillips). See the ldconfig man page.
-
- Changed ldconfig to use the same type names used in the
- change above when the -p option is used.
-
-Changes in version 1.9.7:
-
- Changed ldd for m68k to use /lib/ld.so.1 instead of
- /lib/ld-linux.so.2.
-
- Added support for dladdr to libdl.so (Eduard Gode).
-
- Fixed a small memory leak in libdl.so (Richard Garnish).
-
- Fixed a bug in ldconfig when the -l option was used on a
- filename without a '/' in it.
-
- Updated the man pages (Bug#6404, Bug#9721, Bug#10652,
- Bug#13494 and Bug#14127). They could still use some work.
-
- No longer install the info page since it's way out of date.
-
- Fixed minor Debian packaging problems (Bug#13160,
- Bug#15577 and Bug#19345).
-
-Changes in version 1.9.6:
-
- Changed ldd to not use the glibc dynamic linker when run
- on a libc5-based shared library.
-
- Added a -q option to ldconfig which causes warnings not
- to be printed (Bob Tinsley).
-
- Dropped support for the Debian libdl1-dev package.
-
- Changed ld-linux.so to be compilable with gcc 2.8.0 (Sven
- Verdoolaege)
-
-Changes in version 1.9.5:
-
- Fixed a bug in ldd where ld-linux.so.2 was not called
- correctly when run on shared libraries.
-
- Fixed a problem in the previous version where some
- Makefiles were not architecture independent.
-
-Changes in version 1.9.4:
-
- Fixed a bug in ld.so introduced in the previous version
- which broke preloads.
-
- Turned a.out support back on by default, at least for the
- time being. There are no promises to keep it.
-
-Changes in version 1.9.3:
-
- Fixed buffer overflow bugs in ld-linux.so and ld.so.
-
- Changed the README file a little to clarify a couple of
- things.
-
- Changed ldconfig to chroot to the specified directory when
- the new -r option is used (Bob Tinsley).
-
-Changes in version 1.9.2:
-
- Removed /usr/local/lib from the default /etc/ld.so.conf
- for Debian (Bug#8181).
-
- Changed ldconfig to be 64-bit clean (H.J. Lu).
-
-Changes in version 1.9.1:
-
- Changed ldconfig to try to determine which libc a
- library is for even if it doesn't have an soname.
-
- Fixed a bug in ldconfig where an older library using
- the glibc naming convention would be used instead of
- a newer library.
-
- Changed to ld-linux.so and libdl.so to not require the
- libc5 headers in order to compile.
-
- Changed ldconfig and ldd to be compilable with either
- libc5 or libc6.
-
-Changes in version 1.9.0:
-
- Changed to not build the old, a.out dynamic loader by
- default.
-
- Changed instldso.sh to require the --force option to
- make sure users read the README file.
-
- Changed instldso.sh to not install the libdl.so
- development files unless the --devfiles option is used.
-
- Changed instldso.sh to not strip binaries and libraries
- if the --no-strip option is used.
-
- Changed the Debian packaging to put the development files
- which conflict with glibc in a new libdl1-dev package.
-
- Changed ldd to use the glibc dynamic linker, if it is
- available, when run on a shared library.
-
- Changed ld-linux.so to print the load addresses of
- libraries, ala glibc, when run by ldd.
-
- Changed ld-linux.so to allow the libraries listed in
- LD_PRELOAD to be separated by white space in addition to
- colons.
-
- Changed ld-linux.so to load the libraries listed in
- LD_PRELOAD for setu/gid programs as long as they can be
- loaded securely.
-
- Changed ldconfig to update the symlinks for the dynamic
- linkers.
-
- Changed ldconfig to try to determine if an ELF library is
- intended for libc5 or libc6 and save the infomation in the
- cache. The mechanism used is rather simplistic and may
- need to be enhanced.
-
- Changed ldconfig to print the type of ELF library when
- printing the cache.
-
- Changed ld-linux.so to only load ELF shared libraries for
- use with libc5 or an unknown libc.
-
-Changes in version 1.8.10:
-
- Fixed a bug in ldconfig where a symlink could be used
- instead of a regular file.
-
- Fixed a Debian packaging problem for the sparc
- architecture.
-
-Changes in version 1.8.9:
-
- Changed ldconfig to only cache the symlinks it creates.
- This make the behavior of the dynamic linkers consistent
- with how they would behave if a cache was not used.
-
- Changed ldconfig to cache the symlinks that it finds but
- use the name of the symlink as the soname instead of the
- actual soname.
-
-Changes in version 1.8.8:
-
- Minor documentation updates to reflect recent changes.
-
- Changed ld.so and ld-linux.so to perform more complete
- validation on ld.so.cache before using it.
-
- Changed ldconfig to accept libraries with inconsistent
- sonames since glibc is going to use them. A warning is
- still printed in debug mode.
-
- Changed the install script to not strip _dl_debug_state
- from ld-linux.so since gdb needs it.
-
- More sparc fixes (Derrick Brashear).
-
- Changed ldconfig to not issue a warning when a linker
- script disguised as a shared library is found.
-
- Fixed a bug in ld-linux.so where some registers were
- not preserved on the first call to a function causing
- problems for non-C-like languages (Tim Renouf).
-
- Fixed a bug in ld-linux.so where global variables were
- not always mapped correctly across dynamically loaded
- libraries (Mikihiko Nakao).
-
- Converted to new Debian source packaging format (Shaya
- Potter).
-
-Changes in version 1.8.6/7:
-
- Never released as some unofficial patches used these
- version numbers.
-
-Changes in version 1.8.5:
-
- Fixed a bug in ld.so introduced in the previous changes.
-
-Changes in version 1.8.4:
-
- Changed ldconfig to completely ignore symbolic links.
-
- Changed ldconfig to issue the warning concerning an
- inconsistent soname in non-verbose mode.
-
- Changed ld-linux.so back to not keep ld.so.cache mapped
- at all times.
-
- Changed Debian packaging to compress man pages, strip all
- binaries (Bug#5125) and include a shlibs file.
-
-Changes in version 1.8.3:
-
- Changed ld-linux.so to process LD_PRELOAD before
- /etc/ld.so.preload.
-
- Fixed a Debian packaging problem where libdl might not
- be available if other packages were upgraded at the same
- time (Debian Bug#4728).
-
- Changed ldd to always exit with status 1 if any errors
- occur (Debian Bug#4188).
-
- Fixed some minor problems in instldso.sh (Mike Castle and
- Wolfgang Franke).
-
- Changed ldconfig to issue a warning in verbose mode when
- skipping a library because the soname doesn't match.
-
- More sparc fixes (Miguel de Icaza).
-
- Don't link with -N when building ld.so (Alan Modra).
-
- Changed ld-linux.so to better support position-dependant
- libraries (NIIBE Yutaka).
-
-Changes in version 1.8.2:
-
- Added a texinfo file for ld.so and libdl (Michael
- Deutschmann).
-
- Minor sparc and installation changes (Elliot Lee).
-
- Added multiple architecture support for Debian (Leland
- Lucius).
-
- Changed libdl to better support RTLD_NEXT (Eric
- Youngdale). Note: the exact meaning of ETLD_NEXT is
- still not clear in all cases.
-
- Removed some libc dependencies from libdl. Still need
- to remove malloc and free.
-
-Changes in version 1.8.1:
-
- Changed ld.so to be compiled as ELF. This also means
- that ELF support is now required. A.out support is
- still optional.
-
- Changed ld-linux.so and libdl.so to use the rpath in the
- executable instead of in the invoking shared library.
-
- More m68k fixes (Andreas Schwab).
-
- Various sparc fixes (Miguel de Icaza).
-
- Changed ldcnnfig to ignore libraries ending in '~'.
-
- Changed ldconfig to allow alternative conf and cache
- files to be specified on the command-line.
-
- Changed libdl.so to work when dlsym is passed a NULL
- handle pointer.
-
-Changes in version 1.8.0:
-
- Changed ld-linux.so to be more liberal when checking to
- see if a library is already loaded. This should avoid
- the duplicate loading problem for programs linkeed with
- the -rpath option.
-
- Various m68k fixes (Andreas Schwab).
-
- Changed ld.so to only use LD_AOUT_LIBRARY_PATH and
- LD_AOUT_PRELOAD and ld-linux.so to only use
- LD_LIBRARY_PATH and LD_PRELOAD. LD_ELF_LIBRARY_PATH
- and LD_ELF_PRELOAD are no longer supported.
-
- Changed ld-linux.so to allow debugging of shared and
- dynamically loaded libraries (H.J. Lu, Andreas Schwab).
-
- Changed ld-linux.so to preload ELF shared libraries
- listed in /etc/ld.so.preload. This allows secure
- preloads, even for setuid/setgid programs.
-
- Changed ld-linux.so to keep ld.so.cache mapped at all
- times.
-
- Changed ldconfig to allow #-style comments in ld.so.conf.
-
- Removed various compiler warnings (Richard Sladkey and
- David Engel).
-
- Changed ldd to work on ELF shared libraries. This may
- need a little more work.
-
-Changes in version 1.7.14:
-
- Changed ldconfig to recognize ELF shared libraries
- generated by post-2.6 versions of ld (Andreas Schwab).
-
- Changed ldconfig to not remove stale links that do not
- have a version number since they may be needed by ld.
-
-Changes in version 1.7.13:
-
- Fixed a problem in ld-linux.so where a program linked
- with a shared library that was not used could result in
- a segmentation fault (H.J. Lu).
-
-Changes in version 1.7.12:
-
- Fixed a problem in libdl.so where the wrong library
- could be marked as global when RTLD_GLOBAL was used
- (Lars Heete).
-
- Installed dlfcn.h with libdl.so instead of requiring
- it to be supplied with libc.
-
- Removed support for libldso.a since it was nearly
- impossible to use anyway.
-
- Changed ldd to detect when the program being checked
- exited abnormally.
-
-Changes in version 1.7.11:
-
- Changed ld.so and ld-linux.so to delete all variations
- of LD_PRELOAD and LD_LIBRARY_PATH for set[ug]id programs,
- This makes it harder for broken set[ug]id programs to be
- compromised.
-
- Fixed a problem in libdl.so where dlsym would not accept
- the handle returned from dlopen(0, *).
-
-Changes in version 1.7.10:
-
- Changed ld-linux.so and libdl.so to support RTLD_GLOBAL
- (Eric Youngdale).
-
-Changes in version 1.7.9:
-
- Fixed a problem in ld-linux.so in detecting when the
- new user/group information is provided by the kernel.
-
- Fixed a problem in ld-linux.so where a buffer could be
- overflowed if a large number of libraries were loaded
- (Thomas Moore).
-
-Changes in version 1.7.8:
-
- Changed the Makefiles and install scripts to support
- a.out- and ELF-only configurations.
-
- Changed ld-linux.so to use the user/group information
- provided by linux 1.3.23+ instead of making syscalls
- to get it.
-
- Changed libdl.so to support RTLD_NEXT (Glenn Fowler).
-
- Changed libdl.so to only execute the fini sections
- instead of completely closing libraries at exit (Glenn
- Fowler).
-
- Changed ld.so and ld-linux.so to print the required
- cache version when a mismatch is detected.
-
- Changed ld-linux.so to not require on /dev/zero (Ralph
- Loader).
-
- Minor m68k cleanups (Andreas Schwab).
-
-Changes in version 1.7.7:
-
- Fixed problems compiling with recent 1.3.x kernels.
-
- Changed ld-linux.so to not use MAP_DENYWRITE until the
- permission issue regarding it is resolved.
-
-Changes in version 1.7.6:
-
- Fixed a bug in ld-linux.so dealing with a zero-length
- LD_{ELF_}PRELOAD.
-
- Changed ld.so and ld-linux.so to truncate all variations
- of LD_PRELOAD and LD_LIBRARY_PATH for set[ug]id programs.
-
-Changes in version 1.7.5:
-
- Changed ldconfig to recognize libraries without any
- version number (eg. libXYZ.so).
-
- Changed ldconfig to not generate a corrupt cache when
- the disk is full or other write errors occur.
-
- Changed ld-linux.so to map files with MAP_DENYWRITE to
- keep them from being changed while the file is in use
- (Rick Sladkey).
-
- Changed libdl to not overwrite the scope pointer of a
- library if it was already loaded (H.J. Lu).
-
- Changed ld-linux.so so gdb can be used on constructors
- (Eric Youngdale).
-
- Changed ldconfig to ignore ELF libraries where the soname
- does not match the file name on the assumption that it is
- a used at compile-time (eg. libcurses.so -> libncruses.so).
-
-Changes in version 1.7.4:
-
- Changed ld-linux.so and libdl to use the appropriate
- rpaths when searching for shared libraries (Eric
- Youngdale).
-
- Changed ld-linux.so to search rpath before using the
- cache. This more closely conforms to the IBCS standard.
-
-Changes in version 1.7.3:
-
- Changed ld-linux.so to only print a library name the
- first time it is loaded when run from ldd.
-
- Fixed a bug in ldconfig where an invalid cache could be
- generated if a directory was specified multiple times in
- ld.so.conf.
-
- Changed ld-linux.so so it will return the address of a
- weak symbol when called from dlsym in libdl (Eric
- Youngdale.
-
-Changes in version 1.7.2:
-
- Changed libdl.so again to fix the undefined foobar
- problem.
-
-Changes in version 1.7.1:
-
- Changed libdl so it will compile at optimization level
- O3 or higher.
-
- Changed ldconfig to always create the cache file with
- mode 644.
-
- Changed ldconfig to not ingore valid symlinks.
-
- Changed ldconfig to use the library name as the soname
- for ELF libraries that do not have an soname entry.
-
- Changed ld-linux.so to print the actual, requested library
- name at the time it is loaded instead of trying to figure
- it out after the fact.
-
-Changes in version 1.7.0:
-
- Changed ldconfig to read the actual soname from the image
- for ELF libraries and make it available to ld-linux.so.
- The soname for DLL libraries is still determined by
- truncating the minor numbers from the image file name.
-
- Changed ldconfig to no longer support the undocumented
- sort options.
-
- Changed ld.so to require a valid cache to find libraries
- in directories specified in ld.so.conf. /usr/lib and /lib
- are still searched as a last resort. Ld-linux.so already
- operated this way.
-
- Fixed a bug in libldso.a where the arguments to
- shared_loader were not parsed correctly (Wolfram Gloger).
-
- Added support for RELA-style relocations under Linux/68k
- (Andreas Schwab).
-
- Changed ld-linux.so to only map the cache once for all
- libraries instead of individually for each library.
-
- Changed ld-linux.so continue searching the cache instead of
- giving up when failing to load the first entry found.
-
- Changed ld-linux.so to produce output similar to ld.so when
- run from ldd or when errors occur.
-
-Changes in version 1.6.7:
-
- Changed the install scripts to make sure that ld.so and
- ld-linux.so are always usable.
-
- Added support for Linux/Sparc (Eric Youngdale).
-
- Added support for Linux/68k (Andreas Schwab).
-
- Fixed various bugs in ld-linux.so dealing with closing
- files, unmapping memory, dereferencing NULL pointers and
- printing library names (David Engel, Eric Youngdale and
- Andreas Schwab).
-
- Replaced the manual page for libdl with a freely
- distributable one (Adam Richter).
-
- Fixed a bug in ld-linux.so where LD_LIBRARY_PATH and
- LD_PRELOAD were not cleared for setuid/setgid programs.
-
- Fixed a bug in libdl where dlsym would not return the
- correct address of a symbol if it was redefined in another
- library (Oleg Kibirev).
-
- Changed ld-linux.so to use the following order to search
- for libraries: LD_{ELF_}LIBRARY_PATH, ld.so.cache, rpath,
- /usr/lib and /lib.
-
- Changed ld-linux.so to not needlessly allocate memory when
- using ld.so.cache.
-
-Changes in version 1.6.6:
-
- Changed ldconfig to not warn about removing stale links
- unless the -v option is specified.
-
- Added manual pages for libdl (from FreeBSD/Sun)
-
- Fixed a bug in ld.so dealing with preloading of objects
- generated by recent versions of ld (Mitch D'Souza).
-
- Fixed bugs in ldd where some errors were either not
- detected or not printed.
-
- Fixed a bug in ld-linux.so where the trailing nul in a
- library name was not being copied (Owen Taylor).
-
-Changes in version 1.6.5:
-
- Changed ldconfig to remove stale symbolic links.
-
- Added debug hooks in ld-linux.so and libdl.so to be used
- by a future version of gdb (Eric Youngdale).
-
-Changes in version 1.6.4:
-
- Change ld-linux.so to print on stdout instead of stderr
- when run from ldd.
-
- Added support for Debian GNU/Linux packaging.
-
-Changes in version 1.6.3:
-
- Fixed a bug in libdl when closing a library (H.J. Lu).
-
-Changes in version 1.6.2:
-
- Changed the error message printed by ldd when a file is
- not a.out or ELF. It used to only list a.out formats.
-
- Changed ldconfig to no longer cache and set up links for
- ld-linux.so.
-
- Changed ld-linux.so and libdl to not conflict with upcoming
- changes in kernel header files.
-
- Changed ld-linux.so to not print preloaded libraries.
-
-Changes in version 1.6.1:
-
- Updated the installation script.
-
- Changed ld.so and ld-linux.so to look for LD_AOUT_PRELOAD
- and LD_ELF_PRELOAD, respectively, before LD_PRELOAD.
-
- Changed ld.so and ld-linux.so to use LD_AOUT_LIBRARY_PATH
- and LD_ELF_LIBRARY_PATH, respectively, instead of
- AOUT_LD_LIBRARY_PATH and ELF_LD_LIBRARY_PATH.
-
-Changes in version 1.6.0:
-
- Changed ldconfig to process libraries which do not have
- a minor version or patch level number.
-
- Incorporated ld-linux.so and libdl.so.
-
- Changed ld.so and ld-linux.so to not miss entries in the
- cache when the fully qualified library is requested.
-
- Changed ldconfig to use stdout instead of stderr when
- printing the cache.
-
-Changes in version 1.5.3:
-
- LD_PRELOAD enhancements (Tristan Gigold).
-
- LD_PRELOAD patch for linux-68k (Andreas Schwab).
-
-Changes in version 1.5.2:
-
- More ELF changes (Mitch D'Souza).
-
- Changed ldconfig to also update the link for ld-linux.so.
-
-Changes in version 1.5.1:
-
- More ELF and LD_PRELOAD changes (Mitch D'Souza).
-
-Changes in version 1.5.0:
-
- Chnaged all executables to QMAGIC (Mitch D'Souza and Rick
- Sladkey).
-
- Added preliminary support for ELF to ldd and ldconfig (Eric
- Youndale and H.J. Lu).
-
- Added support for LD_PRELOAD to ld.so (Mitch D'Souza).
-
- Removed the "advertising" clause from the copyright notices
- in all source files.
-
-Changes in version 1.4.4:
-
- Changed ldconfig to support QMAGIC libraries.
-
- Fixed a bug in ld.so where some of the error messages had
- transposed arguments.
-
-Changes in version 1.4.3:
-
- Fixed an obscure bug in ld.so where an index was not being
- incremented when a library was not found using the cache.
-
-Changes in version 1.4.2:
-
- Changed ldconfig to issue a warning and continue instead
- of an error and exiting when a link can't be updated.
- This is useful when some libraries are imported on read-
- only file systems, such as an NFS mounted /usr.
-
- Changed ld.so to be more robust in searching for libraries.
- A library is not considered found unless it can actually be
- loaded. If a library is not found using the cache, the
- standard directories are searched as in pre-cache versions.
-
-Changes in version 1.4.1:
-
- Fixed minor Makefile problems.
-
- Added support for linux-68k.
-
- Fixed a bug in ld.so where libraries with absolute paths
- were not handled correctly.
-
- Changed ld.so to ignore the directory in the names of
- shared libraries by default. This allows older libraries
- with absolute paths, such as the XView libraries, to take
- advantage of the cache support.
-
- Added a minimal usage message to ldconfig.
-
-Changes in version 1.4:
-
- Fixed bug in ld.so where minor version numbers were not
- reported correctly when a minor version incompatibility
- was found.
-
- Fixed bug in ldconfig where libraries with subversion
- numbers greater than 9 were not compared correctly.
-
- Added Mitch D'Souza's support for suppressing warning
- messages from ld.so about minor version incompatibilities.
-
- Added Mitch D'Souza's support for using a cache to speed
- up searching for libraries in the standard directories.
-
- Added Mitch D'Souza's support for a debugging version of
- ld.so. Link with -lldso if you think you are experiencing
- dynamic linker problems.
-
-Changes in version 1.3:
-
- Added support for libraries using absolute pathnames. If I
- had known that the XView libraries used them, I would have
- added this earlier.
-
- Fixed a bug handling old libraries using a pathname beginning
- with '/' or '/lib/'.
-
-Changes in version 1.2a:
-
- Fixed a minor bug in ldd which caused all files, specifically
- scripts, to be recognized as binaries. Thanks to Olaf Flebbe
- for reporting it.
-
-David Engel
-david@sw.ods.com
diff --git a/ldso/man/Makefile b/ldso/man/Makefile
deleted file mode 100644
index d36225f52..000000000
--- a/ldso/man/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-# Makefile for uClibc
-#
-# Copyright (C) 2000,2001,2005 Erik Andersen <andersen@uclibc.org>
-#
-# Derived in part from the Linux-8086 C library, the GNU C Library, and several
-# other sundry sources. Files within this library are copyright by their
-# respective copyright holders.
-#
-# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
-#
-
-include ../Config.mk
-
-ALL = #ld.so.info
-
-all: $(ALL)
-
-ld.so.info: ld.so.texi
- makeinfo $<
-
-clean:
- $(RM) $(ALL) *~
diff --git a/ldso/man/dlopen.3 b/ldso/man/dlopen.3
deleted file mode 100644
index 0907aed9c..000000000
--- a/ldso/man/dlopen.3
+++ /dev/null
@@ -1,217 +0,0 @@
-.\" -*- nroff -*-
-.\" Copyright 1995 Yggdrasil Computing, Incorporated.
-.\" written by Adam J. Richter (adam@yggdrasil.com),
-.\" with typesetting help from Daniel Quinlan (quinlan@yggdrasil.com).
-.\"
-.\" This is free documentation; you can redistribute it and/or
-.\" modify it under the terms of the GNU General Public License as
-.\" published by the Free Software Foundation; either version 2 of
-.\" the License, or (at your option) any later version.
-.\"
-.\" The GNU General Public License's references to "object code"
-.\" and "executables" are to be interpreted as the output of any
-.\" document formatting or typesetting system, including
-.\" intermediate and printed output.
-.\"
-.\" This manual is distributed in the hope that it will be useful,
-.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
-.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-.\" GNU General Public License for more details.
-.\"
-.\" You should have received a copy of the GNU General Public
-.\" License along with this manual; if not, see
-.\" <http://www.gnu.org/licenses/>.
-.\"
-.TH DLOPEN 3 "16 May 1995" "Linux" "Linux Programmer's Manual"
-.SH NAME
-dlclose, dlerror, dlopen, dlsym \- Programming interface to dynamic linking loader.
-.SH SYNOPSIS
-.B #include <dlfcn.h>
-.sp
-.BI "void *dlopen (const char *" "filename" ", int " flag ");
-.br
-.BI "const char *dlerror(void);"
-.br
-.BI "void *dlsym(void *"handle ", char *"symbol ");"
-.br
-.BI "int dladdr(void *"address ", Dl_info *"dlip ");"
-.br
-.BI "int dlclose (void *"handle ");
-.sp
-Special symbols:
-.BR "_init" ", " "_fini" ". "
-.SH DESCRIPTION
-.B dlopen
-loads a dynamic library from the file named by the null terminated
-string
-.I filename
-and returns an opaque "handle" for the dynamic library.
-If
-.I filename
-is not an absolute path (i.e., it does not begin with a "/"), then the
-file is searched for in the following locations:
-.RS
-.PP
-A colon-separated list of directories in the user's
-\fBLD_LIBRARY\fP path environment variable.
-.PP
-The list of libraries specified in \fI/etc/ld.so.cache\fP.
-.PP
-\fI/usr/lib\fP, followed by \fI/lib\fP.
-.RE
-.PP
-If
-.I filename
-is a NULL pointer, then the returned handle is for the main program.
-.PP
-External references in the library are resolved using the libraries
-in that library's dependency list and any other libraries previously
-opened with the
-.B RTLD_GLOBAL
-flag.
-If the executable was linked
-with the flag "-rdynamic", then the global symbols in the executable
-will also be used to resolve references in a dynamically loaded
-library.
-.PP
-.I flag
-must be either
-.BR RTLD_LAZY ,
-meaning resolve undefined symbols as code from the dynamic library is
-executed, or
-.BR RTLD_NOW ,
-meaning resolve all undefined symbols before
-.B dlopen
-returns, and fail if this cannot be done.
-Optionally,
-.B RTLD_GLOBAL
-may be or'ed with
-.IR flag,
-in which case the external symbols defined in the library will be
-made available to subsequently loaded libraries.
-.PP
-If the library exports a routine named
-.BR _init ,
-then that code is executed before dlopen returns.
-If the same library is loaded twice with
-.BR dlopen() ,
-the same file handle is returned. The dl library maintains link
-counts for dynamic file handles, so a dynamic library is not
-deallocated until
-.B dlclose
-has been called on it as many times as
-.B dlopen
-has succeeded on it.
-.PP
-If
-.B dlopen
-fails for any reason, it returns NULL.
-A human readable string describing the most recent error that occurred
-from any of the dl routines (dlopen, dlsym or dlclose) can be
-extracted with
-.BR dlerror() .
-.B dlerror
-returns NULL if no errors have occurred since initialization or since
-it was last called. (Calling
-.B dlerror()
-twice consecutively, will always result in the second call returning
-NULL.)
-
-.B dlsym
-takes a "handle" of a dynamic library returned by dlopen and the null
-terminated symbol name, returning the address where that symbol is
-loaded. If the symbol is not found,
-.B dlsym
-returns NULL; however, the correct way to test for an error from
-.B dlsym
-is to save the result of
-.B dlerror
-into a variable, and then check if saved value is not NULL.
-This is because the value of the symbol could actually be NULL.
-It is also necessary to save the results of
-.B dlerror
-into a variable because if
-.B dlerror
-is called again, it will return NULL.
-.PP
-.B dladdr
-returns information about the shared library containing the memory
-location specified by
-.IR address .
-.B dladdr
-returns zero on success and non-zero on error.
-.PP
-.B dlclose
-decrements the reference count on the dynamic library handle
-.IR handle .
-If the reference count drops to zero and no other loaded libraries use
-symbols in it, then the dynamic library is unloaded. If the dynamic
-library exports a routine named
-.BR _fini ,
-then that routine is called just before the library is unloaded.
-.SH EXAMPLES
-.B Load the math library, and print the cosine of 2.0:
-.RS
-.nf
-.if t .ft CW
-#include <dlfcn.h>
-
-int main(int argc, char **argv) {
- void *handle = dlopen ("/lib/libm.so", RTLD_LAZY);
- double (*cosine)(double) = dlsym(handle, "cos");
- printf ("%f\\n", (*cosine)(2.0));
- dlclose(handle);
-}
-.if t .ft P
-.fi
-.PP
-If this program were in a file named "foo.c", you would build the program
-with the following command:
-.RS
-.LP
-gcc -rdynamic -o foo foo.c -ldl
-.RE
-.RE
-.LP
-.B Do the same thing, but check for errors at every step:
-.RS
-.nf
-.if t .ft CW
-#include <stdio.h>
-#include <dlfcn.h>
-
-int main(int argc, char **argv) {
- void *handle;
- double (*cosine)(double);
- char *error;
-
- handle = dlopen ("/lib/libm.so", RTLD_LAZY);
- if (!handle) {
- fputs (dlerror(), stderr);
- exit(1);
- }
-
- cosine = dlsym(handle, "cos");
- if ((error = dlerror()) != NULL) {
- fputs(error, stderr);
- exit(1);
- }
-
- printf ("%f\\n", (*cosine)(2.0));
- dlclose(handle);
-}
-.if t .ft P
-.fi
-.RE
-.SH ACKNOWLEDGEMENTS
-The dlopen interface standard comes from Solaris.
-The Linux dlopen implementation was primarily written by
-Eric Youngdale with help from Mitch D'Souza, David Engel,
-Hongjiu Lu, Andreas Schwab and others.
-The manual page was written by Adam Richter.
-.SH SEE ALSO
-.BR ld(1) ,
-.BR ld.so(8) ,
-.BR ldconfig(8) ,
-.BR ldd(1) ,
-.BR ld.so.info .
diff --git a/ldso/man/ld.so.8 b/ldso/man/ld.so.8
deleted file mode 100644
index 59ec8530d..000000000
--- a/ldso/man/ld.so.8
+++ /dev/null
@@ -1,113 +0,0 @@
-.TH ld.so 8 "14 March 1998"
-.SH NAME
-ld.so/ld-linux.so \- dynamic linker/loader
-.SH DESCRIPTION
-.B ld.so
-loads the shared libraries needed by a program, prepares the program
-to run, and then runs it.
-Unless explicitly specified via the
-.B \-static
-option to
-.B ld
-during compilation, all Linux programs are incomplete and require
-further linking at run time.
-.PP
-The necessary shared libraries needed by the program are searched for
-in the following order
-.IP o
-Using the environment variable
-.B LD_LIBRARY_PATH
-.RB ( LD_AOUT_LIBRARY_PATH
-for a.out programs).
-Except if the executable is a setuid/setgid binary, in which case it
-is ignored.
-.IP o
-From the cache file
-.BR /etc/ld.so.cache
-which contains a compiled list of candidate libraries previously found
-in the augmented library path.
-.IP o
-In the default path
-.BR /usr/lib ,
-and then
-.BR /lib .
-.SH ENVIRONMENT
-.TP
-.B LD_LIBRARY_PATH
-A colon-separated list of directories in which to search for
-ELF libraries at execution-time.
-Similar to the
-.B PATH
-environment variable.
-.TP
-.B LD_PRELOAD
-A whitespace-separated list of additional, user-specified, ELF shared
-libraries to be loaded before all others.
-This can be used to selectively override functions in other shared libraries.
-For setuid/setgid ELF binaries, only libraries in the standard search
-directories that are also setgid will be loaded.
-.TP
-.B LD_TRACE_LOADED_OBJECTS
-If present, causes the program to list its dynamic library dependencies,
-as if run by ldd, instead of running normally.
-.TP
-.B LD_BIND_NOW
-If present, causes the dynamic linker to resolve all symbols at program
-startup instead of when they are first referenced.
-.TP
-.B LD_AOUT_LIBRARY_PATH
-A colon-separated list of directories in which to search for
-a.out libraries at execution-time.
-Similar to the
-.B PATH
-environment variable.
-.TP
-.B LD_AOUT_PRELOAD
-The name of an additional, user-specified, a.out shared library to be loaded
-after all others.
-This can be used to selectively override functions in other shared libraries.
-.TP
-.B LD_NOWARN
-Suppress warnings about a.out libraries with incompatible minor
-version numbers.
-.TP
-.B LD_KEEPDIR
-Don't ignore the directory in the names of a.out libraries to be loaded.
-Use of this option is strongly discouraged.
-.SH FILES
-.PD 0
-.TP 20
-.B /lib/ld.so
-a.out dynamic linker/loader
-.TP 20
-.B /lib/ld-linux.so.*
-ELF dynamic linker/loader
-.TP
-.B /etc/ld.so.cache
-File containing a compiled list of directories in which to search for
-libraries and an ordered list of candidate libraries.
-.TP
-.B /etc/ld.so.preload
-File containing a whitespace separated list of ELF shared libraries to
-be loaded before the program.
-libraries and an ordered list of candidate libraries.
-.TP
-.B lib*.so*
-shared libraries
-.PD
-.SH SEE ALSO
-.BR ldd (1),
-.BR ldconfig (8).
-.SH BUGS
-.LP
-Currently
-.B ld.so
-has no means of unloading and searching for compatible or newer version of
-libraries.
-.PP
-.B ld.so
-functionality is only available for executables compiled using libc version
-4.4.3 or greater.
-.SH AUTHORS
-David Engel, Eric Youngdale, Peter MacDonald, Hongjiu Lu, Linus
-Torvalds, Lars Wirzenius and Mitch D'Souza (not necessarily in that order).
diff --git a/ldso/man/ld.so.texi b/ldso/man/ld.so.texi
deleted file mode 100644
index 4e5fb841b..000000000
--- a/ldso/man/ld.so.texi
+++ /dev/null
@@ -1,411 +0,0 @@
-\input texinfo @c -*-texinfo-*-
-@c %**start of header
-@setfilename ld.so.info
-@settitle ld.so : Dynamic-Link Library support
-@c %**end of header
-
-@ifinfo
-This file documents the dynamic-link support libraries and utilities for the
-Linux OS, version 1.8.1.
-
-Copyright 1996 Michael Deutschmann
-
-This document is subject to the GNU General Public License as published by
-the Free Software foundation, version 2 or later (your choice).
-
-Note: The software described in this document is under a different copyright
-and license.
-
-@end ifinfo
-
-@titlepage
-@title ld.so
-@subtitle Dynamic Link library support for the Linux OS.
-@author David Engel
-@author Eric Youngdale
-@author Peter Macdonald
-@author Hongjiu Lu
-@author Mitch D'Souza
-@author Michael Deutschmann (this documentation)
-
-@page
-Copyright @copyright{} 1996 Michael Deutschmann
-
-This document is subject to the GNU General Public License as published by
-the Free Software foundation, version 2 or later (your choice).
-
-Note: The software described in this document is under a different copyright
-and license.
-@end titlepage
-
-@ifinfo
-@node Top
-@top
-
-The @code{ld.so} module provides dynamic linked library support in Linux.
-This file documents @code{ld.so} and its companion software.
-
-@menu
-* intro:: Introduction
-
-* ld.so:: The dynamic linker core program
-* ldd:: A utility to print out dependencies
-* ldconfig:: A utility to maintain the cache and symlinks
-* libdl:: Manual dynamic linking library
-@end menu
-
-@end ifinfo
-
-@node intro
-@unnumbered Introduction
-
-The @code{ld.so} suite contains special files and utilities needed for linux
-to handle @dfn{dynamic libraries}.
-
-Ordinary static libraries (@file{lib*.a} files) are included into executables
-that use their functions. A file that only uses static libraries needs less
-intelligence to load, but takes up more space. If many executables use the
-same library, there can be much wastage of storage space, since multiple
-copies of the library functions are scattered across the executables.
-However, static libraries are easier to make.
-
-Dynamic libraries (@file{lib*.so*} files) are not copied into executables ---
-the executable is written in such a way that it will automatically load the
-libraries. In linux, the executable will first load the special library
-@code{ld.so} or @code{ld-linux.so}, which contains the intelligence
-to load further dynamic libraries. Since multiple files end up getting
-executable data from the same file, dynamic libraries are also known as
-shared libraries.
-
-Linux executables come in two flavors, @sc{elf} and a.out.
-
-a.out is the original executable format used by Linux. It has somewhat less
-overhead than @sc{elf}. However creating shared libraries for a.out is
-@emph{very} involved, and each a.out shared library must be explicitly
-registered.
-
-@sc{elf} is a more recent format, which supports a much simpler method of
-creating libraries. @sc{elf} libraries may also be linked manually
-(@pxref{libdl}).
-
-Since many library authors prefer @sc{elf} and no longer release shared a.out
-libraries, a.out is moribund on Linux. This version of the @code{ld.so} can
-be compiled to support only @sc{elf}, or to support both formats. (The last
-release of ld.so to support a.out alone was 1.8.0.)
-
-@node ld.so
-@chapter @code{ld.so}: Dynamic linker core
-
-@code{ld.so} works behind the scenes to handle dynamic libraries in Linux.
-Users will almost never have to deal with it directly, but in special cases
-one can send instructions to it through environment variables. Also, if
-something is wrong with your libraries (usually an incorrect version) ld.so
-will give error messages.
-
-Actually @code{ld.so} is the a.out linker. The new @sc{elf} executables are
-handled by a related program @code{ld-linux.so}.
-
-@menu
-* files:: Configuration files used by the suite
-* environment:: Environment settings that tweak @code{ld.so}
-* errors:: Complaints @code{ld.so} might make
-@end menu
-
-@node files
-@section Configuration Files
-
-@table @file
-@item /etc/ld.so.cache
-A file created by @code{ldconfig} and used to speed linking. It's structure
-is private to the suite.
-
-@item /etc/ld.so.conf
-A simple list of directories to scan for libraries, in addition to
-@file{/usr/lib} and @file{/lib}, which are hardwired. It may contain
-comments started with a @samp{#}.
-
-@item /etc/ld.so.preload
-A list of libraries to preload. This allows preloading libraries for
-setuid/setgid executables securely. It may contain comments.
-@end table
-
-@node environment
-@section Environment Variables
-
-@table @code
-@item LD_AOUT_LIBRARY_PATH
-@itemx LD_LIBRARY_PATH
-These variables supply a library path for finding dynamic libraries, in the
-standard colon seperated format. These variables are ignored when executing
-setuid/setgid programs, because otherwise they would be a security hazard.
-@code{ld.so} will use @code{LD_AOUT_LIBRARY_PATH} and @code{ld-linux.so} will
-use @code{LD_LIBRARY_PATH}.
-
-@item LD_AOUT_PRELOAD
-@itemx LD_PRELOAD
-These variables allow an extra library not specified in the executable to be
-loaded. Generally this is only useful if you want to override a function.
-These are also ignored when running setuid/setgid executables. @code{ld.so}
-will use @code{LD_AOUT_PRELOAD} and @code{ld-linux.so} will use
-@code{LD_PRELOAD}.
-
-@item LD_NOWARN
-If non-empty, errors about incompatible minor revisions are suppressed.
-
-@item LD_KEEPDIR
-If non-empty, allow executables to specify absolute library names. This
-option is deprecated.
-@c FIXME:
-@c The following are things I noticed in the ld-linux.so source.
-@c I don't really understand 'em. Could someone help me?
-@c
-@c @item LD_BIND_NOW
-@c This option is used by the @code{ld-linux.so} only. I don't know
-@c what it does. (I suspect, looking at the code, that it specifies
-@c "RTLD_NOW" rather than "RTLD_LAZY" mode for the shared libraries.)
-@c
-@c @item LD_TRACE_LOADED_OBJECTS
-@c @itemx LD_WARN
-@c These seem to have something to do with the communication between the
-@c @code{ld-linux.so} and @code{ldd}. I don't know more.
-@end table
-
-@node errors
-@section Errors
-
-@table @samp
-@item Can't find library @var{library}
-The executable required a dynamically linked library that ld.so cannot find.
-Your symbolic links may be not set right, or you may have not installed a
-library needed by the program.
-
-@item Can't load library @var{library}
-The library is corrupt.
-
-@item Incompatible library @var{library}
-@itemx Require major version @var{x} and found @var{y}
-Your version of the library is incompatible with the executable. Recompiling
-the executable, or upgrading the library will fix the problem.
-
-@item using incompatible library @var{library}
-@itemx Desire minor version >= @var{x} and found @var{y}.
-Your version of the library is older than that expected by the executable,
-but not so old that the library interface has radically changed, so the
-linker will attempt to run anyway. There is a chance that it will work, but
-you should upgrade the library or recompile the software. The environment
-variable @code{LD_NOWARN} can be used to supress this message.
-
-@item too many directories in library path
-The linker only supports up to 32 library directories. You have too many.
-
-@item dynamic linker error in @var{blah}
-The linker is having trouble handling a binary - it is probably corrupt.
-
-@item can't map cache file @var{cache-file}
-@itemx cache file @var{cache-file} @var{blah}
-The linker cache file (generally @file{/etc/ld.so.cache}) is corrupt or
-non-existent. These errors can be ignored, and can be prevented by
-regenerating the cache file with @code{ldconfig}.
-@end table
-
-@node ldd
-@chapter @code{ldd}: Dependency scanner
-
-@code{ldd} is a utility that prints out the dynamic libraries that an
-executable is linked to.
-
-Actually @code{ldd} works by signalling ld.so to print the dependencies.
-For a.out executables this is done by starting the executable with
-@code{argc} equal to 0. The linker detects this and prints the dependencies.
-(This can cause problems with @emph{very} old binaries, which would run as
-normal only with an inappropriate @code{argc}.)
-
-For @sc{elf} executables, special environment variables are used to tell the
-linker to print the dependencies.
-
-@code{ldd} has a few options:
-
-@table @samp
-@item -v
-Print the version number of @code{ldd} itself
-
-@item -V
-Print the version number of the dynamic linker
-
-@item -d
-Report missing functions. This is only supported for @sc{elf} executables.
-
-@item -r
-Report missing objects. This is also only available for @sc{elf}
-executables.
-@end table
-
-@node ldconfig
-@chapter @code{ldconfig}: Setup program
-
-This utility is used by the system administrator to automatically set up
-symbolic links needed by the libraries, and also to set up the cache file.
-
-@code{ldconfig} is run after new dynamic libraries are installed, and if the
-cache file or links are damaged. It is also run when upgrading the
-@code{ld.so} suite itself.
-
-The @file{/lib} and @file{/usr/lib} directories, and any listed in the file
-@file{/etc/ld.so.conf} are scanned by default unless @samp{-n} is used.
-Additional directories may be specified on the command line.
-
-It has the following options:
-
-@table @samp
-@item -D
-Enter debug mode. Implies @samp{-N} and @samp{-X}.
-
-@item -v
-Verbose. Print out links created and directories scanned.
-
-@item -n
-Check directories specified on the commandline @emph{only}.
-
-@item -N
-Do not regenerate the cache.
-
-@item -X
-Do not rebuild symbolic links.
-
-@item -l
-Set up symbolic links for only libraries presented on the command line.
-
-@item -p
-Print out the library pathnames in the cache file (@file{/etc/ld.so.cache})
-@end table
-
-@node libdl
-@chapter User dynamic linking library
-
-The @code{ld.so} package includes a small library of functions
-(@code{libdl}) to allow manual dynamic linking. Normally programs are linked
-so that dynamic functions and objects are automagically available. These
-functions allow one to manually load and access a symbol from a library.
-They are only available for @sc{elf} executables.
-
-@menu
-* using libdl:: General points
-* functions:: How to use the functions
-* example:: A sample program
-@end menu
-
-@node using libdl
-@section Overview
-
-To access this library, add the flag @samp{-ldl} to your compile command when
-linking the executable. You also must include the header file
-@code{dlfcn.h}. You may also need the flag @samp{-rdynamic}, which enables
-resolving references in the loaded libraries against your executable.
-
-Generally, you will first use @code{dlopen} to open a library. Then you use
-@code{dlsym} one or more times to access symbols. Finally you use
-@code{dlclose} to close the library.
-
-These facilities are most useful for language interpreters that provide
-access to external libraries. Without @code{libdl}, it would be neccessary
-to link the interpreter executable with any and all external libraries
-needed by the programs it runs. With @code{libdl}, the interpreter only
-needs to be linked with the libraries it uses itself, and can dynamically
-load in additional ones if programs need it.
-
-@node functions
-@section Functions
-
-@deftypefun void *dlopen ( const char @var{filename}, int @var{flags} )
-
-This function opens the dynamic library specified by @var{filename}
-and returns an abstract handle, which can be used in subsequent calls to
-@code{dlsym}. The function will respect the @code{LD_ELF_LIBRARY_PATH} and
-@code{LD_LIBRARY_PATH} environment variables.
-
-@end deftypefun
-
-The following flags can be used with @code{dlopen}:
-
-@deftypevr Macro int RTLD_LAZY
-Resolve symbols in the library as they are needed.
-@end deftypevr
-
-@deftypevr Macro int RTLD_NOW
-Resolve all symbols in the library before returning, and fail if not all can
-be resolved. This is mutually exclusive with @code{RTLD_LAZY}.
-@end deftypevr
-
-@deftypevr Macro int RTLD_GLOBAL
-Make symbols in this library available for resolving symbols in other
-libraries loaded with @code{dlopen}.
-@end deftypevr
-
-@deftypefun int dlclose ( void *@var{handle} )
-
-This function releases a library handle.
-
-Note that if a library opened twice, the handle will be the same. However,
-a reference count is used, so you should still close the library as many
-times as you open it.
-
-@end deftypefun
-
-@deftypefun void *dlsym (void *@var{handle},char *@var{symbol-name})
-
-This function looks up the name @var{symbol-name} in the library and returns
-it in the void pointer.
-
-If there is an error, a null pointer will be returned. However, it is
-possible for a valid name in the library to have a null value, so
-@code{dlerror} should be used to check if there was an error.
-
-@end deftypefun
-
-@deftypefun {libdl function} {const char} *dlerror( void )
-
-This function is used to read the error state. It returns a human-readable
-string describing the last error, or null, meaning no error.
-
-The function resets the error value each time it is called, so the result
-should be copied into a variable. If the function is called more than once
-after an error, the second and subsequent calls will return null.
-
-@end deftypefun
-
-@node example
-@section Example program
-
-Here is an example program that prints the cosine of two by manually linking
-to the math library:
-
-@example
-@c The following was snarfed verbatim from the dlopen.3 man file.
-#include <stdio.h>
-#include <dlfcn.h>
-
-int main(int argc, char **argv) @{
- void *handle;
- double (*cosine)(double);
- char *error;
-
- handle = dlopen ("/lib/libm.so", RTLD_LAZY);
- if (!handle) @{
- fputs (dlerror(), stderr);
- exit(1);
- @}
-
- cosine = dlsym(handle, "cos");
- if ((error = dlerror()) != NULL) @{
- fputs(error, stderr);
- exit(1);
- @}
-
- printf ("%f\\n", (*cosine)(2.0));
- dlclose(handle);
-@}
-@end example
-
-@contents
-
-@bye
diff --git a/ldso/man/ldconfig.8 b/ldso/man/ldconfig.8
deleted file mode 100644
index 82285291f..000000000
--- a/ldso/man/ldconfig.8
+++ /dev/null
@@ -1,189 +0,0 @@
-.TH ldconfig 8 "14 March 1998"
-.SH NAME
-ldconfig \- determine run-time link bindings
-.SH SYNOPSIS
-ldconfig
-.RB [ \-DvqnNX ]
-.RB [ \-f\ conf ]
-.RB [ \-C\ cache ]
-.RB [ \-r\ root ]
-.IR directory \ ...
-.PD 0
-.PP
-.PD
-ldconfig
-.B \-l
-.RB [ \-Dvq ]
-.IR library \ ...
-.PD 0
-.PP
-.PD
-ldconfig
-.B \-p
-.SH DESCRIPTION
-.B ldconfig
-creates the necessary links and cache (for use by the run-time linker,
-.IR ld.so )
-to the most recent shared libraries found in the directories specified
-on the command line, in the file
-.IR /etc/ld.so.conf ,
-and in the trusted directories
-.RI ( /usr/lib
-and
-.IR /lib ).
-.B ldconfig
-checks the header and file names of the libraries it encounters when
-determining which versions should have their links updated.
-.B ldconfig
-ignores symbolic links when scanning for libraries.
-.PP
-.B ldconfig
-will attempt to deduce the type of ELF libs (ie. libc5 or libc6/glibc)
-based on what C libs if any the library was linked against, therefore when
-making dynamic libraries, it is wise to explicitly link against libc (use -lc).
-.PP
-Some existing libs do not contain enough information to allow the deduction of
-their type, therefore the
-.IR /etc/ld.so.conf
-file format allows the specification of an expected type. This is
-.B only
-used for those ELF libs which we can not work out. The format
-is like this "dirname=TYPE", where type can be libc4, libc5 or libc6.
-(This syntax also works on the command line). Spaces are
-.B not
-allowed. Also see the
-.B -p
-option.
-.PP
-Directory names containing an
-.B = are no longer legal
-unless they also have an expected type specifier.
-.PP
-.B ldconfig
-should normally be run by the super-user as it may require write
-permission on some root owned directories and files.
-It is normally run automatically at bootup, from /etc/rc, or manually
-whenever new DLL's are installed.
-.SH OPTIONS
-.TP
-.B \-D
-Debug mode.
-Implies
-.B \-N
-and
-.BR \-X .
-.TP
-.B \-v
-Verbose mode.
-Print current version number, the name of each directory as it
-is scanned and any links that are created.
-Overrides quiet mode.
-.TP
-.B \-q
-Quiet mode.
-Don't print warnings.
-.TP
-.B \-n
-Only process directories specified on the command line.
-Don't process the trusted directories
-.RI ( /usr/lib
-and
-.IR /lib )
-nor those specified in
-.IR /etc/ld.so.conf .
-Implies
-.BR \-N .
-.TP
-.B \-N
-Don't rebuild the cache.
-Unless
-.B \-X
-is also specified, links are still updated.
-.TP
-.B \-X
-Don't update links.
-Unless
-.B \-N
-is also specified, the cache is still rebuilt.
-.TP
-.B \-f conf
-Use
-.B conf
-instead of
-.IR /etc/ld.so.conf .
-.TP
-.B \-C cache
-Use
-.B cache
-instead of
-.IR /etc/ld.so.cache .
-.TP
-.B \-r root
-Change to and use
-.B root
-as the root directory.
-.TP
-.B \-l
-Library mode.
-Manually link individual libraries.
-Intended for use by experts only.
-.TP
-.B \-p
-Print the lists of directories and candidate libraries stored in
-the current cache.
-.SH EXAMPLES
-In the bootup file
-.I /etc/rc
-having the line
-.RS
-
-/sbin/ldconfig -v
-
-.RE
-will set up the correct links for the shared binaries and rebuild
-the cache.
-.TP
-On the command line
-.RS
-
-# /sbin/ldconfig -n /lib
-
-.RE
-as root after the installation of a new DLL, will properly update the
-shared library symbolic links in /lib.
-
-.SH FILES
-.PD 0
-.TP 20
-.B /lib/ld.so
-execution time linker/loader
-.TP 20
-.B /etc/ld.so.conf
-File containing a list of colon, space, tab, newline, or comma spearated
-directories in which to search for libraries.
-.TP 20
-.B /etc/ld.so.cache
-File containing an ordered list of libraries found in the directories
-specified in
-.BR /etc/ld.so.conf .
-.TP
-.B lib*.so.version
-shared libraries
-.PD
-.SH SEE ALSO
-.BR ldd (1),
-.BR ld.so (8).
-.SH BUGS
-.LP
-.BR ldconfig 's
-functionality, in conjunction with
-.BR ld.so ,
-is only available for executables compiled using libc version 4.4.3 or greater.
-.PP
-.BR ldconfig ,
-being a user process, must be run manually and has no means of dynamically
-determining and relinking shared libraries for use by
-.BR ld.so
-when a new DLL is installed.
-.SH AUTHORS
-David Engel and Mitch D'Souza.
diff --git a/ldso/man/ldd.1 b/ldso/man/ldd.1
deleted file mode 100644
index 20c557847..000000000
--- a/ldso/man/ldd.1
+++ /dev/null
@@ -1,59 +0,0 @@
-.\" Copyright 1995-2000 David Engel (david@ods.com)
-.\" Copyright 1995 Rickard E. Faith (faith@cs.unc.edu)
-.\" Most of this was copied from the README file. Do not restrict distribution.
-.\" May be distributed under the GNU General Public License
-.TH LDD 1 "14 March 1998"
-.SH NAME
-ldd \- print shared library dependencies
-.SH SYNOPSIS
-.B ldd
-.RB [ \-vVdr ]
-program|library ...
-.SH DESCRIPTION
-.B ldd
-prints the shared libraries required by each program or shared library
-specified on the command line.
-If a shared library name does not contain a '/',
-.B ldd
-attempts to locate the library in the standard locations.
-To run
-.B ldd
-on a shared library in the current directory, a "./" must be prepended
-to its name.
-.SH OPTIONS
-.TP
-.B \-v
-Print the version number of
-.BR ldd .
-.TP
-.B \-V
-Print the version number of the dynamic linker,
-.BR ld.so .
-.TP
-.B \-d
-Perform relocations and report any missing functions (ELF only).
-.TP
-.B \-r
-Perform relocations for both data objects and functions, and
-report any missing objects (ELF only).
-.SH BUGS
-.B ldd
-does not work very well on libc.so.5 itself.
-.PP
-.B ldd
-does not work on a.out shared libraries.
-.PP
-.B ldd
-does not work with some extremely old a.out programs which were
-built before
-.B ldd
-support was added to the compiler releases.
-If you use
-.B ldd
-on one of these programs, the program will attempt to run with argc = 0 and
-the results will be unpredictable.
-.SH AUTHOR
-David Engel.
-.SH SEE ALSO
-.BR ldconfig (8),
-.BR ld.so (8).
diff --git a/libpthread/linuxthreads/linuxthreads.texi b/libpthread/linuxthreads/linuxthreads.texi
deleted file mode 100644
index 795fb7097..000000000
--- a/libpthread/linuxthreads/linuxthreads.texi
+++ /dev/null
@@ -1,1627 +0,0 @@
-@node POSIX Threads
-@c @node POSIX Threads, , Top, Top
-@chapter POSIX Threads
-@c %MENU% The standard threads library
-
-@c This chapter needs more work bigtime. -zw
-
-This chapter describes the pthreads (POSIX threads) library. This
-library provides support functions for multithreaded programs: thread
-primitives, synchronization objects, and so forth. It also implements
-POSIX 1003.1b semaphores (not to be confused with System V semaphores).
-
-The threads operations (@samp{pthread_*}) do not use @var{errno}.
-Instead they return an error code directly. The semaphore operations do
-use @var{errno}.
-
-@menu
-* Basic Thread Operations:: Creating, terminating, and waiting for threads.
-* Thread Attributes:: Tuning thread scheduling.
-* Cancellation:: Stopping a thread before it's done.
-* Cleanup Handlers:: Deallocating resources when a thread is
- canceled.
-* Mutexes:: One way to synchronize threads.
-* Condition Variables:: Another way.
-* POSIX Semaphores:: And a third way.
-* Thread-Specific Data:: Variables with different values in
- different threads.
-* Threads and Signal Handling:: Why you should avoid mixing the two, and
- how to do it if you must.
-* Threads and Fork:: Interactions between threads and the
- @code{fork} function.
-* Streams and Fork:: Interactions between stdio streams and
- @code{fork}.
-* Miscellaneous Thread Functions:: A grab bag of utility routines.
-@end menu
-
-@node Basic Thread Operations
-@section Basic Thread Operations
-
-These functions are the thread equivalents of @code{fork}, @code{exit},
-and @code{wait}.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_create (pthread_t * @var{thread}, pthread_attr_t * @var{attr}, void * (*@var{start_routine})(void *), void * @var{arg})
-@code{pthread_create} creates a new thread of control that executes
-concurrently with the calling thread. The new thread calls the
-function @var{start_routine}, passing it @var{arg} as first argument. The
-new thread terminates either explicitly, by calling @code{pthread_exit},
-or implicitly, by returning from the @var{start_routine} function. The
-latter case is equivalent to calling @code{pthread_exit} with the result
-returned by @var{start_routine} as exit code.
-
-The @var{attr} argument specifies thread attributes to be applied to the
-new thread. @xref{Thread Attributes}, for details. The @var{attr}
-argument can also be @code{NULL}, in which case default attributes are
-used: the created thread is joinable (not detached) and has an ordinary
-(not realtime) scheduling policy.
-
-On success, the identifier of the newly created thread is stored in the
-location pointed by the @var{thread} argument, and a 0 is returned. On
-error, a non-zero error code is returned.
-
-This function may return the following errors:
-@table @code
-@item EAGAIN
-Not enough system resources to create a process for the new thread,
-or more than @code{PTHREAD_THREADS_MAX} threads are already active.
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun void pthread_exit (void *@var{retval})
-@code{pthread_exit} terminates the execution of the calling thread. All
-cleanup handlers (@pxref{Cleanup Handlers}) that have been set for the
-calling thread with @code{pthread_cleanup_push} are executed in reverse
-order (the most recently pushed handler is executed first). Finalization
-functions for thread-specific data are then called for all keys that
-have non-@code{NULL} values associated with them in the calling thread
-(@pxref{Thread-Specific Data}). Finally, execution of the calling
-thread is stopped.
-
-The @var{retval} argument is the return value of the thread. It can be
-retrieved from another thread using @code{pthread_join}.
-
-The @code{pthread_exit} function never returns.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cancel (pthread_t @var{thread})
-
-@code{pthread_cancel} sends a cancellation request to the thread denoted
-by the @var{thread} argument. If there is no such thread,
-@code{pthread_cancel} fails and returns @code{ESRCH}. Otherwise it
-returns 0. @xref{Cancellation}, for details.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_join (pthread_t @var{th}, void **thread_@var{return})
-@code{pthread_join} suspends the execution of the calling thread until
-the thread identified by @var{th} terminates, either by calling
-@code{pthread_exit} or by being canceled.
-
-If @var{thread_return} is not @code{NULL}, the return value of @var{th}
-is stored in the location pointed to by @var{thread_return}. The return
-value of @var{th} is either the argument it gave to @code{pthread_exit},
-or @code{PTHREAD_CANCELED} if @var{th} was canceled.
-
-The joined thread @code{th} must be in the joinable state: it must not
-have been detached using @code{pthread_detach} or the
-@code{PTHREAD_CREATE_DETACHED} attribute to @code{pthread_create}.
-
-When a joinable thread terminates, its memory resources (thread
-descriptor and stack) are not deallocated until another thread performs
-@code{pthread_join} on it. Therefore, @code{pthread_join} must be called
-once for each joinable thread created to avoid memory leaks.
-
-At most one thread can wait for the termination of a given
-thread. Calling @code{pthread_join} on a thread @var{th} on which
-another thread is already waiting for termination returns an error.
-
-@code{pthread_join} is a cancellation point. If a thread is canceled
-while suspended in @code{pthread_join}, the thread execution resumes
-immediately and the cancellation is executed without waiting for the
-@var{th} thread to terminate. If cancellation occurs during
-@code{pthread_join}, the @var{th} thread remains not joined.
-
-On success, the return value of @var{th} is stored in the location
-pointed to by @var{thread_return}, and 0 is returned. On error, one of
-the following values is returned:
-@table @code
-@item ESRCH
-No thread could be found corresponding to that specified by @var{th}.
-@item EINVAL
-The @var{th} thread has been detached, or another thread is already
-waiting on termination of @var{th}.
-@item EDEADLK
-The @var{th} argument refers to the calling thread.
-@end table
-@end deftypefun
-
-@node Thread Attributes
-@section Thread Attributes
-
-@comment pthread.h
-@comment POSIX
-
-Threads have a number of attributes that may be set at creation time.
-This is done by filling a thread attribute object @var{attr} of type
-@code{pthread_attr_t}, then passing it as second argument to
-@code{pthread_create}. Passing @code{NULL} is equivalent to passing a
-thread attribute object with all attributes set to their default values.
-
-Attribute objects are consulted only when creating a new thread. The
-same attribute object can be used for creating several threads.
-Modifying an attribute object after a call to @code{pthread_create} does
-not change the attributes of the thread previously created.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_attr_init (pthread_attr_t *@var{attr})
-@code{pthread_attr_init} initializes the thread attribute object
-@var{attr} and fills it with default values for the attributes. (The
-default values are listed below for each attribute.)
-
-Each attribute @var{attrname} (see below for a list of all attributes)
-can be individually set using the function
-@code{pthread_attr_set@var{attrname}} and retrieved using the function
-@code{pthread_attr_get@var{attrname}}.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_attr_destroy (pthread_attr_t *@var{attr})
-@code{pthread_attr_destroy} destroys the attribute object pointed to by
-@var{attr} releasing any resources associated with it. @var{attr} is
-left in an undefined state, and you must not use it again in a call to
-any pthreads function until it has been reinitialized.
-@end deftypefun
-
-@findex pthread_attr_setdetachstate
-@findex pthread_attr_setguardsize
-@findex pthread_attr_setinheritsched
-@findex pthread_attr_setschedparam
-@findex pthread_attr_setschedpolicy
-@findex pthread_attr_setscope
-@findex pthread_attr_setstack
-@findex pthread_attr_setstackaddr
-@findex pthread_attr_setstacksize
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_attr_setattr (pthread_attr_t *@var{obj}, int @var{value})
-Set attribute @var{attr} to @var{value} in the attribute object pointed
-to by @var{obj}. See below for a list of possible attributes and the
-values they can take.
-
-On success, these functions return 0. If @var{value} is not meaningful
-for the @var{attr} being modified, they will return the error code
-@code{EINVAL}. Some of the functions have other failure modes; see
-below.
-@end deftypefun
-
-@findex pthread_attr_getdetachstate
-@findex pthread_attr_getguardsize
-@findex pthread_attr_getinheritsched
-@findex pthread_attr_getschedparam
-@findex pthread_attr_getschedpolicy
-@findex pthread_attr_getscope
-@findex pthread_attr_getstack
-@findex pthread_attr_getstackaddr
-@findex pthread_attr_getstacksize
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_attr_getattr (const pthread_attr_t *@var{obj}, int *@var{value})
-Store the current setting of @var{attr} in @var{obj} into the variable
-pointed to by @var{value}.
-
-These functions always return 0.
-@end deftypefun
-
-The following thread attributes are supported:
-@table @samp
-@item detachstate
-Choose whether the thread is created in the joinable state (value
-@code{PTHREAD_CREATE_JOINABLE}) or in the detached state
-(@code{PTHREAD_CREATE_DETACHED}). The default is
-@code{PTHREAD_CREATE_JOINABLE}.
-
-In the joinable state, another thread can synchronize on the thread
-termination and recover its termination code using @code{pthread_join},
-but some of the thread resources are kept allocated after the thread
-terminates, and reclaimed only when another thread performs
-@code{pthread_join} on that thread.
-
-In the detached state, the thread resources are immediately freed when
-it terminates, but @code{pthread_join} cannot be used to synchronize on
-the thread termination.
-
-A thread created in the joinable state can later be put in the detached
-thread using @code{pthread_detach}.
-
-@item schedpolicy
-Select the scheduling policy for the thread: one of @code{SCHED_OTHER}
-(regular, non-realtime scheduling), @code{SCHED_RR} (realtime,
-round-robin) or @code{SCHED_FIFO} (realtime, first-in first-out).
-The default is @code{SCHED_OTHER}.
-@c Not doc'd in our manual: FIXME.
-@c See @code{sched_setpolicy} for more information on scheduling policies.
-
-The realtime scheduling policies @code{SCHED_RR} and @code{SCHED_FIFO}
-are available only to processes with superuser privileges.
-@code{pthread_attr_setschedparam} will fail and return @code{ENOTSUP} if
-you try to set a realtime policy when you are unprivileged.
-
-The scheduling policy of a thread can be changed after creation with
-@code{pthread_setschedparam}.
-
-@item schedparam
-Change the scheduling parameter (the scheduling priority)
-for the thread. The default is 0.
-
-This attribute is not significant if the scheduling policy is
-@code{SCHED_OTHER}; it only matters for the realtime policies
-@code{SCHED_RR} and @code{SCHED_FIFO}.
-
-The scheduling priority of a thread can be changed after creation with
-@code{pthread_setschedparam}.
-
-@item inheritsched
-Choose whether the scheduling policy and scheduling parameter for the
-newly created thread are determined by the values of the
-@var{schedpolicy} and @var{schedparam} attributes (value
-@code{PTHREAD_EXPLICIT_SCHED}) or are inherited from the parent thread
-(value @code{PTHREAD_INHERIT_SCHED}). The default is
-@code{PTHREAD_EXPLICIT_SCHED}.
-
-@item scope
-Choose the scheduling contention scope for the created thread. The
-default is @code{PTHREAD_SCOPE_SYSTEM}, meaning that the threads contend
-for CPU time with all processes running on the machine. In particular,
-thread priorities are interpreted relative to the priorities of all
-other processes on the machine. The other possibility,
-@code{PTHREAD_SCOPE_PROCESS}, means that scheduling contention occurs
-only between the threads of the running process: thread priorities are
-interpreted relative to the priorities of the other threads of the
-process, regardless of the priorities of other processes.
-
-@code{PTHREAD_SCOPE_PROCESS} is not supported in LinuxThreads. If you
-try to set the scope to this value, @code{pthread_attr_setscope} will
-fail and return @code{ENOTSUP}.
-
-@item stackaddr
-Provide an address for an application managed stack. The size of the
-stack must be at least @code{PTHREAD_STACK_MIN}.
-
-@item stacksize
-Change the size of the stack created for the thread. The value defines
-the minimum stack size, in bytes.
-
-If the value exceeds the system's maximum stack size, or is smaller
-than @code{PTHREAD_STACK_MIN}, @code{pthread_attr_setstacksize} will
-fail and return @code{EINVAL}.
-
-@item stack
-Provide both the address and size of an application managed stack to
-use for the new thread. The base of the memory area is @var{stackaddr}
-with the size of the memory area, @var{stacksize}, measured in bytes.
-
-If the value of @var{stacksize} is less than @code{PTHREAD_STACK_MIN},
-or greater than the system's maximum stack size, or if the value of
-@var{stackaddr} lacks the proper alignment, @code{pthread_attr_setstack}
-will fail and return @code{EINVAL}.
-
-@item guardsize
-Change the minimum size in bytes of the guard area for the thread's
-stack. The default size is a single page. If this value is set, it
-will be rounded up to the nearest page size. If the value is set to 0,
-a guard area will not be created for this thread. The space allocated
-for the guard area is used to catch stack overflow. Therefore, when
-allocating large structures on the stack, a larger guard area may be
-required to catch a stack overflow.
-
-If the caller is managing their own stacks (if the @code{stackaddr}
-attribute has been set), then the @code{guardsize} attribute is ignored.
-
-If the value exceeds the @code{stacksize}, @code{pthread_atrr_setguardsize}
-will fail and return @code{EINVAL}.
-@end table
-
-@node Cancellation
-@section Cancellation
-
-Cancellation is the mechanism by which a thread can terminate the
-execution of another thread. More precisely, a thread can send a
-cancellation request to another thread. Depending on its settings, the
-target thread can then either ignore the request, honor it immediately,
-or defer it till it reaches a cancellation point. When threads are
-first created by @code{pthread_create}, they always defer cancellation
-requests.
-
-When a thread eventually honors a cancellation request, it behaves as if
-@code{pthread_exit(PTHREAD_CANCELED)} was called. All cleanup handlers
-are executed in reverse order, finalization functions for
-thread-specific data are called, and finally the thread stops executing.
-If the canceled thread was joinable, the return value
-@code{PTHREAD_CANCELED} is provided to whichever thread calls
-@var{pthread_join} on it. See @code{pthread_exit} for more information.
-
-Cancellation points are the points where the thread checks for pending
-cancellation requests and performs them. The POSIX threads functions
-@code{pthread_join}, @code{pthread_cond_wait},
-@code{pthread_cond_timedwait}, @code{pthread_testcancel},
-@code{sem_wait}, and @code{sigwait} are cancellation points. In
-addition, these system calls are cancellation points:
-
-@multitable @columnfractions .33 .33 .33
-@item @t{accept} @tab @t{open} @tab @t{sendmsg}
-@item @t{close} @tab @t{pause} @tab @t{sendto}
-@item @t{connect} @tab @t{read} @tab @t{system}
-@item @t{fcntl} @tab @t{recv} @tab @t{tcdrain}
-@item @t{fsync} @tab @t{recvfrom} @tab @t{wait}
-@item @t{lseek} @tab @t{recvmsg} @tab @t{waitpid}
-@item @t{msync} @tab @t{send} @tab @t{write}
-@item @t{nanosleep}
-@end multitable
-
-@noindent
-All library functions that call these functions (such as
-@code{printf}) are also cancellation points.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_setcancelstate (int @var{state}, int *@var{oldstate})
-@code{pthread_setcancelstate} changes the cancellation state for the
-calling thread -- that is, whether cancellation requests are ignored or
-not. The @var{state} argument is the new cancellation state: either
-@code{PTHREAD_CANCEL_ENABLE} to enable cancellation, or
-@code{PTHREAD_CANCEL_DISABLE} to disable cancellation (cancellation
-requests are ignored).
-
-If @var{oldstate} is not @code{NULL}, the previous cancellation state is
-stored in the location pointed to by @var{oldstate}, and can thus be
-restored later by another call to @code{pthread_setcancelstate}.
-
-If the @var{state} argument is not @code{PTHREAD_CANCEL_ENABLE} or
-@code{PTHREAD_CANCEL_DISABLE}, @code{pthread_setcancelstate} fails and
-returns @code{EINVAL}. Otherwise it returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_setcanceltype (int @var{type}, int *@var{oldtype})
-@code{pthread_setcanceltype} changes the type of responses to
-cancellation requests for the calling thread: asynchronous (immediate)
-or deferred. The @var{type} argument is the new cancellation type:
-either @code{PTHREAD_CANCEL_ASYNCHRONOUS} to cancel the calling thread
-as soon as the cancellation request is received, or
-@code{PTHREAD_CANCEL_DEFERRED} to keep the cancellation request pending
-until the next cancellation point. If @var{oldtype} is not @code{NULL},
-the previous cancellation state is stored in the location pointed to by
-@var{oldtype}, and can thus be restored later by another call to
-@code{pthread_setcanceltype}.
-
-If the @var{type} argument is not @code{PTHREAD_CANCEL_DEFERRED} or
-@code{PTHREAD_CANCEL_ASYNCHRONOUS}, @code{pthread_setcanceltype} fails
-and returns @code{EINVAL}. Otherwise it returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun void pthread_testcancel (@var{void})
-@code{pthread_testcancel} does nothing except testing for pending
-cancellation and executing it. Its purpose is to introduce explicit
-checks for cancellation in long sequences of code that do not call
-cancellation point functions otherwise.
-@end deftypefun
-
-@node Cleanup Handlers
-@section Cleanup Handlers
-
-Cleanup handlers are functions that get called when a thread terminates,
-either by calling @code{pthread_exit} or because of
-cancellation. Cleanup handlers are installed and removed following a
-stack-like discipline.
-
-The purpose of cleanup handlers is to free the resources that a thread
-may hold at the time it terminates. In particular, if a thread exits or
-is canceled while it owns a locked mutex, the mutex will remain locked
-forever and prevent other threads from executing normally. The best way
-to avoid this is, just before locking the mutex, to install a cleanup
-handler whose effect is to unlock the mutex. Cleanup handlers can be
-used similarly to free blocks allocated with @code{malloc} or close file
-descriptors on thread termination.
-
-Here is how to lock a mutex @var{mut} in such a way that it will be
-unlocked if the thread is canceled while @var{mut} is locked:
-
-@smallexample
-pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
-pthread_mutex_lock(&mut);
-/* do some work */
-pthread_mutex_unlock(&mut);
-pthread_cleanup_pop(0);
-@end smallexample
-
-Equivalently, the last two lines can be replaced by
-
-@smallexample
-pthread_cleanup_pop(1);
-@end smallexample
-
-Notice that the code above is safe only in deferred cancellation mode
-(see @code{pthread_setcanceltype}). In asynchronous cancellation mode, a
-cancellation can occur between @code{pthread_cleanup_push} and
-@code{pthread_mutex_lock}, or between @code{pthread_mutex_unlock} and
-@code{pthread_cleanup_pop}, resulting in both cases in the thread trying
-to unlock a mutex not locked by the current thread. This is the main
-reason why asynchronous cancellation is difficult to use.
-
-If the code above must also work in asynchronous cancellation mode,
-then it must switch to deferred mode for locking and unlocking the
-mutex:
-
-@smallexample
-pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
-pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
-pthread_mutex_lock(&mut);
-/* do some work */
-pthread_cleanup_pop(1);
-pthread_setcanceltype(oldtype, NULL);
-@end smallexample
-
-The code above can be rewritten in a more compact and efficient way,
-using the non-portable functions @code{pthread_cleanup_push_defer_np}
-and @code{pthread_cleanup_pop_restore_np}:
-
-@smallexample
-pthread_cleanup_push_defer_np(pthread_mutex_unlock, (void *) &mut);
-pthread_mutex_lock(&mut);
-/* do some work */
-pthread_cleanup_pop_restore_np(1);
-@end smallexample
-
-@comment pthread.h
-@comment POSIX
-@deftypefun void pthread_cleanup_push (void (*@var{routine}) (void *), void *@var{arg})
-
-@code{pthread_cleanup_push} installs the @var{routine} function with
-argument @var{arg} as a cleanup handler. From this point on to the
-matching @code{pthread_cleanup_pop}, the function @var{routine} will be
-called with arguments @var{arg} when the thread terminates, either
-through @code{pthread_exit} or by cancellation. If several cleanup
-handlers are active at that point, they are called in LIFO order: the
-most recently installed handler is called first.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun void pthread_cleanup_pop (int @var{execute})
-@code{pthread_cleanup_pop} removes the most recently installed cleanup
-handler. If the @var{execute} argument is not 0, it also executes the
-handler, by calling the @var{routine} function with arguments
-@var{arg}. If the @var{execute} argument is 0, the handler is only
-removed but not executed.
-@end deftypefun
-
-Matching pairs of @code{pthread_cleanup_push} and
-@code{pthread_cleanup_pop} must occur in the same function, at the same
-level of block nesting. Actually, @code{pthread_cleanup_push} and
-@code{pthread_cleanup_pop} are macros, and the expansion of
-@code{pthread_cleanup_push} introduces an open brace @code{@{} with the
-matching closing brace @code{@}} being introduced by the expansion of the
-matching @code{pthread_cleanup_pop}.
-
-@comment pthread.h
-@comment GNU
-@deftypefun void pthread_cleanup_push_defer_np (void (*@var{routine}) (void *), void *@var{arg})
-@code{pthread_cleanup_push_defer_np} is a non-portable extension that
-combines @code{pthread_cleanup_push} and @code{pthread_setcanceltype}.
-It pushes a cleanup handler just as @code{pthread_cleanup_push} does,
-but also saves the current cancellation type and sets it to deferred
-cancellation. This ensures that the cleanup mechanism is effective even
-if the thread was initially in asynchronous cancellation mode.
-@end deftypefun
-
-@comment pthread.h
-@comment GNU
-@deftypefun void pthread_cleanup_pop_restore_np (int @var{execute})
-@code{pthread_cleanup_pop_restore_np} pops a cleanup handler introduced
-by @code{pthread_cleanup_push_defer_np}, and restores the cancellation
-type to its value at the time @code{pthread_cleanup_push_defer_np} was
-called.
-@end deftypefun
-
-@code{pthread_cleanup_push_defer_np} and
-@code{pthread_cleanup_pop_restore_np} must occur in matching pairs, at
-the same level of block nesting.
-
-The sequence
-
-@smallexample
-pthread_cleanup_push_defer_np(routine, arg);
-...
-pthread_cleanup_pop_restore_np(execute);
-@end smallexample
-
-@noindent
-is functionally equivalent to (but more compact and efficient than)
-
-@smallexample
-@{
- int oldtype;
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
- pthread_cleanup_push(routine, arg);
- ...
- pthread_cleanup_pop(execute);
- pthread_setcanceltype(oldtype, NULL);
-@}
-@end smallexample
-
-
-@node Mutexes
-@section Mutexes
-
-A mutex is a MUTual EXclusion device, and is useful for protecting
-shared data structures from concurrent modifications, and implementing
-critical sections and monitors.
-
-A mutex has two possible states: unlocked (not owned by any thread),
-and locked (owned by one thread). A mutex can never be owned by two
-different threads simultaneously. A thread attempting to lock a mutex
-that is already locked by another thread is suspended until the owning
-thread unlocks the mutex first.
-
-None of the mutex functions is a cancellation point, not even
-@code{pthread_mutex_lock}, in spite of the fact that it can suspend a
-thread for arbitrary durations. This way, the status of mutexes at
-cancellation points is predictable, allowing cancellation handlers to
-unlock precisely those mutexes that need to be unlocked before the
-thread stops executing. Consequently, threads using deferred
-cancellation should never hold a mutex for extended periods of time.
-
-It is not safe to call mutex functions from a signal handler. In
-particular, calling @code{pthread_mutex_lock} or
-@code{pthread_mutex_unlock} from a signal handler may deadlock the
-calling thread.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_init (pthread_mutex_t *@var{mutex}, const pthread_mutexattr_t *@var{mutexattr})
-
-@code{pthread_mutex_init} initializes the mutex object pointed to by
-@var{mutex} according to the mutex attributes specified in @var{mutexattr}.
-If @var{mutexattr} is @code{NULL}, default attributes are used instead.
-
-The LinuxThreads implementation supports only one mutex attribute,
-the @var{mutex type}, which is either ``fast'', ``recursive'', or
-``error checking''. The type of a mutex determines whether
-it can be locked again by a thread that already owns it.
-The default type is ``fast''.
-
-Variables of type @code{pthread_mutex_t} can also be initialized
-statically, using the constants @code{PTHREAD_MUTEX_INITIALIZER} (for
-timed mutexes), @code{PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP} (for
-recursive mutexes), @code{PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP}
-(for fast mutexes(, and @code{PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP}
-(for error checking mutexes).
-
-@code{pthread_mutex_init} always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_lock (pthread_mutex_t *mutex))
-@code{pthread_mutex_lock} locks the given mutex. If the mutex is
-currently unlocked, it becomes locked and owned by the calling thread,
-and @code{pthread_mutex_lock} returns immediately. If the mutex is
-already locked by another thread, @code{pthread_mutex_lock} suspends the
-calling thread until the mutex is unlocked.
-
-If the mutex is already locked by the calling thread, the behavior of
-@code{pthread_mutex_lock} depends on the type of the mutex. If the mutex
-is of the ``fast'' type, the calling thread is suspended. It will
-remain suspended forever, because no other thread can unlock the mutex.
-If the mutex is of the ``error checking'' type, @code{pthread_mutex_lock}
-returns immediately with the error code @code{EDEADLK}. If the mutex is
-of the ``recursive'' type, @code{pthread_mutex_lock} succeeds and
-returns immediately, recording the number of times the calling thread
-has locked the mutex. An equal number of @code{pthread_mutex_unlock}
-operations must be performed before the mutex returns to the unlocked
-state.
-@c This doesn't discuss PTHREAD_MUTEX_TIMED_NP mutex attributes. FIXME
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_trylock (pthread_mutex_t *@var{mutex})
-@code{pthread_mutex_trylock} behaves identically to
-@code{pthread_mutex_lock}, except that it does not block the calling
-thread if the mutex is already locked by another thread (or by the
-calling thread in the case of a ``fast'' mutex). Instead,
-@code{pthread_mutex_trylock} returns immediately with the error code
-@code{EBUSY}.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_timedlock (pthread_mutex_t *@var{mutex}, const struct timespec *@var{abstime})
-The @code{pthread_mutex_timedlock} is similar to the
-@code{pthread_mutex_lock} function but instead of blocking for in
-indefinite time if the mutex is locked by another thread, it returns
-when the time specified in @var{abstime} is reached.
-
-This function can only be used on standard (``timed'') and ``error
-checking'' mutexes. It behaves just like @code{pthread_mutex_lock} for
-all other types.
-
-If the mutex is successfully locked, the function returns zero. If the
-time specified in @var{abstime} is reached without the mutex being locked,
-@code{ETIMEDOUT} is returned.
-
-This function was introduced in the POSIX.1d revision of the POSIX standard.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_unlock (pthread_mutex_t *@var{mutex})
-@code{pthread_mutex_unlock} unlocks the given mutex. The mutex is
-assumed to be locked and owned by the calling thread on entrance to
-@code{pthread_mutex_unlock}. If the mutex is of the ``fast'' type,
-@code{pthread_mutex_unlock} always returns it to the unlocked state. If
-it is of the ``recursive'' type, it decrements the locking count of the
-mutex (number of @code{pthread_mutex_lock} operations performed on it by
-the calling thread), and only when this count reaches zero is the mutex
-actually unlocked.
-
-On ``error checking'' mutexes, @code{pthread_mutex_unlock} actually
-checks at run-time that the mutex is locked on entrance, and that it was
-locked by the same thread that is now calling
-@code{pthread_mutex_unlock}. If these conditions are not met,
-@code{pthread_mutex_unlock} returns @code{EPERM}, and the mutex remains
-unchanged. ``Fast'' and ``recursive'' mutexes perform no such checks,
-thus allowing a locked mutex to be unlocked by a thread other than its
-owner. This is non-portable behavior and must not be relied upon.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_destroy (pthread_mutex_t *@var{mutex})
-@code{pthread_mutex_destroy} destroys a mutex object, freeing the
-resources it might hold. The mutex must be unlocked on entrance. In the
-LinuxThreads implementation, no resources are associated with mutex
-objects, thus @code{pthread_mutex_destroy} actually does nothing except
-checking that the mutex is unlocked.
-
-If the mutex is locked by some thread, @code{pthread_mutex_destroy}
-returns @code{EBUSY}. Otherwise it returns 0.
-@end deftypefun
-
-If any of the above functions (except @code{pthread_mutex_init})
-is applied to an uninitialized mutex, they will simply return
-@code{EINVAL} and do nothing.
-
-A shared global variable @var{x} can be protected by a mutex as follows:
-
-@smallexample
-int x;
-pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
-@end smallexample
-
-All accesses and modifications to @var{x} should be bracketed by calls to
-@code{pthread_mutex_lock} and @code{pthread_mutex_unlock} as follows:
-
-@smallexample
-pthread_mutex_lock(&mut);
-/* operate on x */
-pthread_mutex_unlock(&mut);
-@end smallexample
-
-Mutex attributes can be specified at mutex creation time, by passing a
-mutex attribute object as second argument to @code{pthread_mutex_init}.
-Passing @code{NULL} is equivalent to passing a mutex attribute object
-with all attributes set to their default values.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutexattr_init (pthread_mutexattr_t *@var{attr})
-@code{pthread_mutexattr_init} initializes the mutex attribute object
-@var{attr} and fills it with default values for the attributes.
-
-This function always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutexattr_destroy (pthread_mutexattr_t *@var{attr})
-@code{pthread_mutexattr_destroy} destroys a mutex attribute object,
-which must not be reused until it is
-reinitialized. @code{pthread_mutexattr_destroy} does nothing in the
-LinuxThreads implementation.
-
-This function always returns 0.
-@end deftypefun
-
-LinuxThreads supports only one mutex attribute: the mutex type, which is
-either @code{PTHREAD_MUTEX_ADAPTIVE_NP} for ``fast'' mutexes,
-@code{PTHREAD_MUTEX_RECURSIVE_NP} for ``recursive'' mutexes,
-@code{PTHREAD_MUTEX_TIMED_NP} for ``timed'' mutexes, or
-@code{PTHREAD_MUTEX_ERRORCHECK_NP} for ``error checking'' mutexes. As
-the @code{NP} suffix indicates, this is a non-portable extension to the
-POSIX standard and should not be employed in portable programs.
-
-The mutex type determines what happens if a thread attempts to lock a
-mutex it already owns with @code{pthread_mutex_lock}. If the mutex is of
-the ``fast'' type, @code{pthread_mutex_lock} simply suspends the calling
-thread forever. If the mutex is of the ``error checking'' type,
-@code{pthread_mutex_lock} returns immediately with the error code
-@code{EDEADLK}. If the mutex is of the ``recursive'' type, the call to
-@code{pthread_mutex_lock} returns immediately with a success return
-code. The number of times the thread owning the mutex has locked it is
-recorded in the mutex. The owning thread must call
-@code{pthread_mutex_unlock} the same number of times before the mutex
-returns to the unlocked state.
-
-The default mutex type is ``timed'', that is, @code{PTHREAD_MUTEX_TIMED_NP}.
-@c This doesn't describe how a ``timed'' mutex behaves. FIXME
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutexattr_settype (pthread_mutexattr_t *@var{attr}, int @var{type})
-@code{pthread_mutexattr_settype} sets the mutex type attribute in
-@var{attr} to the value specified by @var{type}.
-
-If @var{type} is not @code{PTHREAD_MUTEX_ADAPTIVE_NP},
-@code{PTHREAD_MUTEX_RECURSIVE_NP}, @code{PTHREAD_MUTEX_TIMED_NP}, or
-@code{PTHREAD_MUTEX_ERRORCHECK_NP}, this function will return
-@code{EINVAL} and leave @var{attr} unchanged.
-
-The standard Unix98 identifiers @code{PTHREAD_MUTEX_DEFAULT},
-@code{PTHREAD_MUTEX_NORMAL}, @code{PTHREAD_MUTEX_RECURSIVE},
-and @code{PTHREAD_MUTEX_ERRORCHECK} are also permitted.
-
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutexattr_gettype (const pthread_mutexattr_t *@var{attr}, int *@var{type})
-@code{pthread_mutexattr_gettype} retrieves the current value of the
-mutex type attribute in @var{attr} and stores it in the location pointed
-to by @var{type}.
-
-This function always returns 0.
-@end deftypefun
-
-@node Condition Variables
-@section Condition Variables
-
-A condition (short for ``condition variable'') is a synchronization
-device that allows threads to suspend execution until some predicate on
-shared data is satisfied. The basic operations on conditions are: signal
-the condition (when the predicate becomes true), and wait for the
-condition, suspending the thread execution until another thread signals
-the condition.
-
-A condition variable must always be associated with a mutex, to avoid
-the race condition where a thread prepares to wait on a condition
-variable and another thread signals the condition just before the first
-thread actually waits on it.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_init (pthread_cond_t *@var{cond}, pthread_condattr_t *cond_@var{attr})
-
-@code{pthread_cond_init} initializes the condition variable @var{cond},
-using the condition attributes specified in @var{cond_attr}, or default
-attributes if @var{cond_attr} is @code{NULL}. The LinuxThreads
-implementation supports no attributes for conditions, hence the
-@var{cond_attr} parameter is actually ignored.
-
-Variables of type @code{pthread_cond_t} can also be initialized
-statically, using the constant @code{PTHREAD_COND_INITIALIZER}.
-
-This function always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_signal (pthread_cond_t *@var{cond})
-@code{pthread_cond_signal} restarts one of the threads that are waiting
-on the condition variable @var{cond}. If no threads are waiting on
-@var{cond}, nothing happens. If several threads are waiting on
-@var{cond}, exactly one is restarted, but it is not specified which.
-
-This function always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_broadcast (pthread_cond_t *@var{cond})
-@code{pthread_cond_broadcast} restarts all the threads that are waiting
-on the condition variable @var{cond}. Nothing happens if no threads are
-waiting on @var{cond}.
-
-This function always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_wait (pthread_cond_t *@var{cond}, pthread_mutex_t *@var{mutex})
-@code{pthread_cond_wait} atomically unlocks the @var{mutex} (as per
-@code{pthread_unlock_mutex}) and waits for the condition variable
-@var{cond} to be signaled. The thread execution is suspended and does
-not consume any CPU time until the condition variable is signaled. The
-@var{mutex} must be locked by the calling thread on entrance to
-@code{pthread_cond_wait}. Before returning to the calling thread,
-@code{pthread_cond_wait} re-acquires @var{mutex} (as per
-@code{pthread_lock_mutex}).
-
-Unlocking the mutex and suspending on the condition variable is done
-atomically. Thus, if all threads always acquire the mutex before
-signaling the condition, this guarantees that the condition cannot be
-signaled (and thus ignored) between the time a thread locks the mutex
-and the time it waits on the condition variable.
-
-This function always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_timedwait (pthread_cond_t *@var{cond}, pthread_mutex_t *@var{mutex}, const struct timespec *@var{abstime})
-@code{pthread_cond_timedwait} atomically unlocks @var{mutex} and waits
-on @var{cond}, as @code{pthread_cond_wait} does, but it also bounds the
-duration of the wait. If @var{cond} has not been signaled before time
-@var{abstime}, the mutex @var{mutex} is re-acquired and
-@code{pthread_cond_timedwait} returns the error code @code{ETIMEDOUT}.
-The wait can also be interrupted by a signal; in that case
-@code{pthread_cond_timedwait} returns @code{EINTR}.
-
-The @var{abstime} parameter specifies an absolute time, with the same
-origin as @code{time} and @code{gettimeofday}: an @var{abstime} of 0
-corresponds to 00:00:00 GMT, January 1, 1970.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_destroy (pthread_cond_t *@var{cond})
-@code{pthread_cond_destroy} destroys the condition variable @var{cond},
-freeing the resources it might hold. If any threads are waiting on the
-condition variable, @code{pthread_cond_destroy} leaves @var{cond}
-untouched and returns @code{EBUSY}. Otherwise it returns 0, and
-@var{cond} must not be used again until it is reinitialized.
-
-In the LinuxThreads implementation, no resources are associated with
-condition variables, so @code{pthread_cond_destroy} actually does
-nothing.
-@end deftypefun
-
-@code{pthread_cond_wait} and @code{pthread_cond_timedwait} are
-cancellation points. If a thread is canceled while suspended in one of
-these functions, the thread immediately resumes execution, relocks the
-mutex specified by @var{mutex}, and finally executes the cancellation.
-Consequently, cleanup handlers are assured that @var{mutex} is locked
-when they are called.
-
-It is not safe to call the condition variable functions from a signal
-handler. In particular, calling @code{pthread_cond_signal} or
-@code{pthread_cond_broadcast} from a signal handler may deadlock the
-calling thread.
-
-Consider two shared variables @var{x} and @var{y}, protected by the
-mutex @var{mut}, and a condition variable @var{cond} that is to be
-signaled whenever @var{x} becomes greater than @var{y}.
-
-@smallexample
-int x,y;
-pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
-pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-@end smallexample
-
-Waiting until @var{x} is greater than @var{y} is performed as follows:
-
-@smallexample
-pthread_mutex_lock(&mut);
-while (x <= y) @{
- pthread_cond_wait(&cond, &mut);
-@}
-/* operate on x and y */
-pthread_mutex_unlock(&mut);
-@end smallexample
-
-Modifications on @var{x} and @var{y} that may cause @var{x} to become greater than
-@var{y} should signal the condition if needed:
-
-@smallexample
-pthread_mutex_lock(&mut);
-/* modify x and y */
-if (x > y) pthread_cond_broadcast(&cond);
-pthread_mutex_unlock(&mut);
-@end smallexample
-
-If it can be proved that at most one waiting thread needs to be waken
-up (for instance, if there are only two threads communicating through
-@var{x} and @var{y}), @code{pthread_cond_signal} can be used as a slightly more
-efficient alternative to @code{pthread_cond_broadcast}. In doubt, use
-@code{pthread_cond_broadcast}.
-
-To wait for @var{x} to becomes greater than @var{y} with a timeout of 5
-seconds, do:
-
-@smallexample
-struct timeval now;
-struct timespec timeout;
-int retcode;
-
-pthread_mutex_lock(&mut);
-gettimeofday(&now);
-timeout.tv_sec = now.tv_sec + 5;
-timeout.tv_nsec = now.tv_usec * 1000;
-retcode = 0;
-while (x <= y && retcode != ETIMEDOUT) @{
- retcode = pthread_cond_timedwait(&cond, &mut, &timeout);
-@}
-if (retcode == ETIMEDOUT) @{
- /* timeout occurred */
-@} else @{
- /* operate on x and y */
-@}
-pthread_mutex_unlock(&mut);
-@end smallexample
-
-Condition attributes can be specified at condition creation time, by
-passing a condition attribute object as second argument to
-@code{pthread_cond_init}. Passing @code{NULL} is equivalent to passing
-a condition attribute object with all attributes set to their default
-values.
-
-The LinuxThreads implementation supports no attributes for
-conditions. The functions on condition attributes are included only for
-compliance with the POSIX standard.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_condattr_init (pthread_condattr_t *@var{attr})
-@deftypefunx int pthread_condattr_destroy (pthread_condattr_t *@var{attr})
-@code{pthread_condattr_init} initializes the condition attribute object
-@var{attr} and fills it with default values for the attributes.
-@code{pthread_condattr_destroy} destroys the condition attribute object
-@var{attr}.
-
-Both functions do nothing in the LinuxThreads implementation.
-
-@code{pthread_condattr_init} and @code{pthread_condattr_destroy} always
-return 0.
-@end deftypefun
-
-@node POSIX Semaphores
-@section POSIX Semaphores
-
-@vindex SEM_VALUE_MAX
-Semaphores are counters for resources shared between threads. The
-basic operations on semaphores are: increment the counter atomically,
-and wait until the counter is non-null and decrement it atomically.
-
-Semaphores have a maximum value past which they cannot be incremented.
-The macro @code{SEM_VALUE_MAX} is defined to be this maximum value. In
-the GNU C library, @code{SEM_VALUE_MAX} is equal to @code{INT_MAX}
-(@pxref{Range of Type}), but it may be much smaller on other systems.
-
-The pthreads library implements POSIX 1003.1b semaphores. These should
-not be confused with System V semaphores (@code{ipc}, @code{semctl} and
-@code{semop}).
-@c !!! SysV IPC is not doc'd at all in our manual
-
-All the semaphore functions and macros are defined in @file{semaphore.h}.
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_init (sem_t *@var{sem}, int @var{pshared}, unsigned int @var{value})
-@code{sem_init} initializes the semaphore object pointed to by
-@var{sem}. The count associated with the semaphore is set initially to
-@var{value}. The @var{pshared} argument indicates whether the semaphore
-is local to the current process (@var{pshared} is zero) or is to be
-shared between several processes (@var{pshared} is not zero).
-
-On success @code{sem_init} returns 0. On failure it returns -1 and sets
-@var{errno} to one of the following values:
-
-@table @code
-@item EINVAL
-@var{value} exceeds the maximal counter value @code{SEM_VALUE_MAX}
-
-@item ENOSYS
-@var{pshared} is not zero. LinuxThreads currently does not support
-process-shared semaphores. (This will eventually change.)
-@end table
-@end deftypefun
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_destroy (sem_t * @var{sem})
-@code{sem_destroy} destroys a semaphore object, freeing the resources it
-might hold. If any threads are waiting on the semaphore when
-@code{sem_destroy} is called, it fails and sets @var{errno} to
-@code{EBUSY}.
-
-In the LinuxThreads implementation, no resources are associated with
-semaphore objects, thus @code{sem_destroy} actually does nothing except
-checking that no thread is waiting on the semaphore. This will change
-when process-shared semaphores are implemented.
-@end deftypefun
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_wait (sem_t * @var{sem})
-@code{sem_wait} suspends the calling thread until the semaphore pointed
-to by @var{sem} has non-zero count. It then atomically decreases the
-semaphore count.
-
-@code{sem_wait} is a cancellation point. It always returns 0.
-@end deftypefun
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_trywait (sem_t * @var{sem})
-@code{sem_trywait} is a non-blocking variant of @code{sem_wait}. If the
-semaphore pointed to by @var{sem} has non-zero count, the count is
-atomically decreased and @code{sem_trywait} immediately returns 0. If
-the semaphore count is zero, @code{sem_trywait} immediately returns -1
-and sets errno to @code{EAGAIN}.
-@end deftypefun
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_post (sem_t * @var{sem})
-@code{sem_post} atomically increases the count of the semaphore pointed to
-by @var{sem}. This function never blocks.
-
-@c !!! This para appears not to agree with the code.
-On processors supporting atomic compare-and-swap (Intel 486, Pentium and
-later, Alpha, PowerPC, MIPS II, Motorola 68k, Ultrasparc), the
-@code{sem_post} function is can safely be called from signal handlers.
-This is the only thread synchronization function provided by POSIX
-threads that is async-signal safe. On the Intel 386 and earlier Sparc
-chips, the current LinuxThreads implementation of @code{sem_post} is not
-async-signal safe, because the hardware does not support the required
-atomic operations.
-
-@code{sem_post} always succeeds and returns 0, unless the semaphore
-count would exceed @code{SEM_VALUE_MAX} after being incremented. In
-that case @code{sem_post} returns -1 and sets @var{errno} to
-@code{EINVAL}. The semaphore count is left unchanged.
-@end deftypefun
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_getvalue (sem_t * @var{sem}, int * @var{sval})
-@code{sem_getvalue} stores in the location pointed to by @var{sval} the
-current count of the semaphore @var{sem}. It always returns 0.
-@end deftypefun
-
-@node Thread-Specific Data
-@section Thread-Specific Data
-
-Programs often need global or static variables that have different
-values in different threads. Since threads share one memory space, this
-cannot be achieved with regular variables. Thread-specific data is the
-POSIX threads answer to this need.
-
-Each thread possesses a private memory block, the thread-specific data
-area, or TSD area for short. This area is indexed by TSD keys. The TSD
-area associates values of type @code{void *} to TSD keys. TSD keys are
-common to all threads, but the value associated with a given TSD key can
-be different in each thread.
-
-For concreteness, the TSD areas can be viewed as arrays of @code{void *}
-pointers, TSD keys as integer indices into these arrays, and the value
-of a TSD key as the value of the corresponding array element in the
-calling thread.
-
-When a thread is created, its TSD area initially associates @code{NULL}
-with all keys.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_key_create (pthread_key_t *@var{key}, void (*destr_function) (void *))
-@code{pthread_key_create} allocates a new TSD key. The key is stored in
-the location pointed to by @var{key}. There is a limit of
-@code{PTHREAD_KEYS_MAX} on the number of keys allocated at a given
-time. The value initially associated with the returned key is
-@code{NULL} in all currently executing threads.
-
-The @var{destr_function} argument, if not @code{NULL}, specifies a
-destructor function associated with the key. When a thread terminates
-via @code{pthread_exit} or by cancellation, @var{destr_function} is
-called on the value associated with the key in that thread. The
-@var{destr_function} is not called if a key is deleted with
-@code{pthread_key_delete} or a value is changed with
-@code{pthread_setspecific}. The order in which destructor functions are
-called at thread termination time is unspecified.
-
-Before the destructor function is called, the @code{NULL} value is
-associated with the key in the current thread. A destructor function
-might, however, re-associate non-@code{NULL} values to that key or some
-other key. To deal with this, if after all the destructors have been
-called for all non-@code{NULL} values, there are still some
-non-@code{NULL} values with associated destructors, then the process is
-repeated. The LinuxThreads implementation stops the process after
-@code{PTHREAD_DESTRUCTOR_ITERATIONS} iterations, even if some
-non-@code{NULL} values with associated descriptors remain. Other
-implementations may loop indefinitely.
-
-@code{pthread_key_create} returns 0 unless @code{PTHREAD_KEYS_MAX} keys
-have already been allocated, in which case it fails and returns
-@code{EAGAIN}.
-@end deftypefun
-
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_key_delete (pthread_key_t @var{key})
-@code{pthread_key_delete} deallocates a TSD key. It does not check
-whether non-@code{NULL} values are associated with that key in the
-currently executing threads, nor call the destructor function associated
-with the key.
-
-If there is no such key @var{key}, it returns @code{EINVAL}. Otherwise
-it returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_setspecific (pthread_key_t @var{key}, const void *@var{pointer})
-@code{pthread_setspecific} changes the value associated with @var{key}
-in the calling thread, storing the given @var{pointer} instead.
-
-If there is no such key @var{key}, it returns @code{EINVAL}. Otherwise
-it returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun {void *} pthread_getspecific (pthread_key_t @var{key})
-@code{pthread_getspecific} returns the value currently associated with
-@var{key} in the calling thread.
-
-If there is no such key @var{key}, it returns @code{NULL}.
-@end deftypefun
-
-The following code fragment allocates a thread-specific array of 100
-characters, with automatic reclaimation at thread exit:
-
-@smallexample
-/* Key for the thread-specific buffer */
-static pthread_key_t buffer_key;
-
-/* Once-only initialisation of the key */
-static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;
-
-/* Allocate the thread-specific buffer */
-void buffer_alloc(void)
-@{
- pthread_once(&buffer_key_once, buffer_key_alloc);
- pthread_setspecific(buffer_key, malloc(100));
-@}
-
-/* Return the thread-specific buffer */
-char * get_buffer(void)
-@{
- return (char *) pthread_getspecific(buffer_key);
-@}
-
-/* Allocate the key */
-static void buffer_key_alloc()
-@{
- pthread_key_create(&buffer_key, buffer_destroy);
-@}
-
-/* Free the thread-specific buffer */
-static void buffer_destroy(void * buf)
-@{
- free(buf);
-@}
-@end smallexample
-
-@node Threads and Signal Handling
-@section Threads and Signal Handling
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_sigmask (int @var{how}, const sigset_t *@var{newmask}, sigset_t *@var{oldmask})
-@code{pthread_sigmask} changes the signal mask for the calling thread as
-described by the @var{how} and @var{newmask} arguments. If @var{oldmask}
-is not @code{NULL}, the previous signal mask is stored in the location
-pointed to by @var{oldmask}.
-
-The meaning of the @var{how} and @var{newmask} arguments is the same as
-for @code{sigprocmask}. If @var{how} is @code{SIG_SETMASK}, the signal
-mask is set to @var{newmask}. If @var{how} is @code{SIG_BLOCK}, the
-signals specified to @var{newmask} are added to the current signal mask.
-If @var{how} is @code{SIG_UNBLOCK}, the signals specified to
-@var{newmask} are removed from the current signal mask.
-
-Recall that signal masks are set on a per-thread basis, but signal
-actions and signal handlers, as set with @code{sigaction}, are shared
-between all threads.
-
-The @code{pthread_sigmask} function returns 0 on success, and one of the
-following error codes on error:
-@table @code
-@item EINVAL
-@var{how} is not one of @code{SIG_SETMASK}, @code{SIG_BLOCK}, or @code{SIG_UNBLOCK}
-
-@item EFAULT
-@var{newmask} or @var{oldmask} point to invalid addresses
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_kill (pthread_t @var{thread}, int @var{signo})
-@code{pthread_kill} sends signal number @var{signo} to the thread
-@var{thread}. The signal is delivered and handled as described in
-@ref{Signal Handling}.
-
-@code{pthread_kill} returns 0 on success, one of the following error codes
-on error:
-@table @code
-@item EINVAL
-@var{signo} is not a valid signal number
-
-@item ESRCH
-The thread @var{thread} does not exist (e.g. it has already terminated)
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int sigwait (const sigset_t *@var{set}, int *@var{sig})
-@code{sigwait} suspends the calling thread until one of the signals in
-@var{set} is delivered to the calling thread. It then stores the number
-of the signal received in the location pointed to by @var{sig} and
-returns. The signals in @var{set} must be blocked and not ignored on
-entrance to @code{sigwait}. If the delivered signal has a signal handler
-function attached, that function is @emph{not} called.
-
-@code{sigwait} is a cancellation point. It always returns 0.
-@end deftypefun
-
-For @code{sigwait} to work reliably, the signals being waited for must be
-blocked in all threads, not only in the calling thread, since
-otherwise the POSIX semantics for signal delivery do not guarantee
-that it's the thread doing the @code{sigwait} that will receive the signal.
-The best way to achieve this is block those signals before any threads
-are created, and never unblock them in the program other than by
-calling @code{sigwait}.
-
-Signal handling in LinuxThreads departs significantly from the POSIX
-standard. According to the standard, ``asynchronous'' (external) signals
-are addressed to the whole process (the collection of all threads),
-which then delivers them to one particular thread. The thread that
-actually receives the signal is any thread that does not currently block
-the signal.
-
-In LinuxThreads, each thread is actually a kernel process with its own
-PID, so external signals are always directed to one particular thread.
-If, for instance, another thread is blocked in @code{sigwait} on that
-signal, it will not be restarted.
-
-The LinuxThreads implementation of @code{sigwait} installs dummy signal
-handlers for the signals in @var{set} for the duration of the
-wait. Since signal handlers are shared between all threads, other
-threads must not attach their own signal handlers to these signals, or
-alternatively they should all block these signals (which is recommended
-anyway).
-
-@node Threads and Fork
-@section Threads and Fork
-
-It's not intuitively obvious what should happen when a multi-threaded POSIX
-process calls @code{fork}. Not only are the semantics tricky, but you may
-need to write code that does the right thing at fork time even if that code
-doesn't use the @code{fork} function. Moreover, you need to be aware of
-interaction between @code{fork} and some library features like
-@code{pthread_once} and stdio streams.
-
-When @code{fork} is called by one of the threads of a process, it creates a new
-process which is copy of the calling process. Effectively, in addition to
-copying certain system objects, the function takes a snapshot of the memory
-areas of the parent process, and creates identical areas in the child.
-To make matters more complicated, with threads it's possible for two or more
-threads to concurrently call fork to create two or more child processes.
-
-The child process has a copy of the address space of the parent, but it does
-not inherit any of its threads. Execution of the child process is carried out
-by a new thread which returns from @code{fork} function with a return value of
-zero; it is the only thread in the child process. Because threads are not
-inherited across fork, issues arise. At the time of the call to @code{fork},
-threads in the parent process other than the one calling @code{fork} may have
-been executing critical regions of code. As a result, the child process may
-get a copy of objects that are not in a well-defined state. This potential
-problem affects all components of the program.
-
-Any program component which will continue being used in a child process must
-correctly handle its state during @code{fork}. For this purpose, the POSIX
-interface provides the special function @code{pthread_atfork} for installing
-pointers to handler functions which are called from within @code{fork}.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_atfork (void (*@var{prepare})(void), void (*@var{parent})(void), void (*@var{child})(void))
-
-@code{pthread_atfork} registers handler functions to be called just
-before and just after a new process is created with @code{fork}. The
-@var{prepare} handler will be called from the parent process, just
-before the new process is created. The @var{parent} handler will be
-called from the parent process, just before @code{fork} returns. The
-@var{child} handler will be called from the child process, just before
-@code{fork} returns.
-
-@code{pthread_atfork} returns 0 on success and a non-zero error code on
-error.
-
-One or more of the three handlers @var{prepare}, @var{parent} and
-@var{child} can be given as @code{NULL}, meaning that no handler needs
-to be called at the corresponding point.
-
-@code{pthread_atfork} can be called several times to install several
-sets of handlers. At @code{fork} time, the @var{prepare} handlers are
-called in LIFO order (last added with @code{pthread_atfork}, first
-called before @code{fork}), while the @var{parent} and @var{child}
-handlers are called in FIFO order (first added, first called).
-
-If there is insufficient memory available to register the handlers,
-@code{pthread_atfork} fails and returns @code{ENOMEM}. Otherwise it
-returns 0.
-
-The functions @code{fork} and @code{pthread_atfork} must not be regarded as
-reentrant from the context of the handlers. That is to say, if a
-@code{pthread_atfork} handler invoked from within @code{fork} calls
-@code{pthread_atfork} or @code{fork}, the behavior is undefined.
-
-Registering a triplet of handlers is an atomic operation with respect to fork.
-If new handlers are registered at about the same time as a fork occurs, either
-all three handlers will be called, or none of them will be called.
-
-The handlers are inherited by the child process, and there is no
-way to remove them, short of using @code{exec} to load a new
-pocess image.
-
-@end deftypefun
-
-To understand the purpose of @code{pthread_atfork}, recall that
-@code{fork} duplicates the whole memory space, including mutexes in
-their current locking state, but only the calling thread: other threads
-are not running in the child process. The mutexes are not usable after
-the @code{fork} and must be initialized with @code{pthread_mutex_init}
-in the child process. This is a limitation of the current
-implementation and might or might not be present in future versions.
-
-To avoid this, install handlers with @code{pthread_atfork} as follows: have the
-@var{prepare} handler lock the mutexes (in locking order), and the
-@var{parent} handler unlock the mutexes. The @var{child} handler should reset
-the mutexes using @code{pthread_mutex_init}, as well as any other
-synchronization objects such as condition variables.
-
-Locking the global mutexes before the fork ensures that all other threads are
-locked out of the critical regions of code protected by those mutexes. Thus
-when @code{fork} takes a snapshot of the parent's address space, that snapshot
-will copy valid, stable data. Resetting the synchronization objects in the
-child process will ensure they are properly cleansed of any artifacts from the
-threading subsystem of the parent process. For example, a mutex may inherit
-a wait queue of threads waiting for the lock; this wait queue makes no sense
-in the child process. Initializing the mutex takes care of this.
-
-@node Streams and Fork
-@section Streams and Fork
-
-The GNU standard I/O library has an internal mutex which guards the internal
-linked list of all standard C FILE objects. This mutex is properly taken care
-of during @code{fork} so that the child receives an intact copy of the list.
-This allows the @code{fopen} function, and related stream-creating functions,
-to work correctly in the child process, since these functions need to insert
-into the list.
-
-However, the individual stream locks are not completely taken care of. Thus
-unless the multithreaded application takes special precautions in its use of
-@code{fork}, the child process might not be able to safely use the streams that
-it inherited from the parent. In general, for any given open stream in the
-parent that is to be used by the child process, the application must ensure
-that that stream is not in use by another thread when @code{fork} is called.
-Otherwise an inconsistent copy of the stream object be produced. An easy way to
-ensure this is to use @code{flockfile} to lock the stream prior to calling
-@code{fork} and then unlock it with @code{funlockfile} inside the parent
-process, provided that the parent's threads properly honor these locks.
-Nothing special needs to be done in the child process, since the library
-internally resets all stream locks.
-
-Note that the stream locks are not shared between the parent and child.
-For example, even if you ensure that, say, the stream @code{stdout} is properly
-treated and can be safely used in the child, the stream locks do not provide
-an exclusion mechanism between the parent and child. If both processes write
-to @code{stdout}, strangely interleaved output may result regardless of
-the explicit use of @code{flockfile} or implicit locks.
-
-Also note that these provisions are a GNU extension; other systems might not
-provide any way for streams to be used in the child of a multithreaded process.
-POSIX requires that such a child process confines itself to calling only
-asynchronous safe functions, which excludes much of the library, including
-standard I/O.
-
-@node Miscellaneous Thread Functions
-@section Miscellaneous Thread Functions
-
-@comment pthread.h
-@comment POSIX
-@deftypefun {pthread_t} pthread_self (@var{void})
-@code{pthread_self} returns the thread identifier for the calling thread.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_equal (pthread_t thread1, pthread_t thread2)
-@code{pthread_equal} determines if two thread identifiers refer to the same
-thread.
-
-A non-zero value is returned if @var{thread1} and @var{thread2} refer to
-the same thread. Otherwise, 0 is returned.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_detach (pthread_t @var{th})
-@code{pthread_detach} puts the thread @var{th} in the detached
-state. This guarantees that the memory resources consumed by @var{th}
-will be freed immediately when @var{th} terminates. However, this
-prevents other threads from synchronizing on the termination of @var{th}
-using @code{pthread_join}.
-
-A thread can be created initially in the detached state, using the
-@code{detachstate} attribute to @code{pthread_create}. In contrast,
-@code{pthread_detach} applies to threads created in the joinable state,
-and which need to be put in the detached state later.
-
-After @code{pthread_detach} completes, subsequent attempts to perform
-@code{pthread_join} on @var{th} will fail. If another thread is already
-joining the thread @var{th} at the time @code{pthread_detach} is called,
-@code{pthread_detach} does nothing and leaves @var{th} in the joinable
-state.
-
-On success, 0 is returned. On error, one of the following codes is
-returned:
-@table @code
-@item ESRCH
-No thread could be found corresponding to that specified by @var{th}
-@item EINVAL
-The thread @var{th} is already in the detached state
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment GNU
-@deftypefun void pthread_kill_other_threads_np (@var{void})
-@code{pthread_kill_other_threads_np} is a non-portable LinuxThreads extension.
-It causes all threads in the program to terminate immediately, except
-the calling thread which proceeds normally. It is intended to be
-called just before a thread calls one of the @code{exec} functions,
-e.g. @code{execve}.
-
-Termination of the other threads is not performed through
-@code{pthread_cancel} and completely bypasses the cancellation
-mechanism. Hence, the current settings for cancellation state and
-cancellation type are ignored, and the cleanup handlers are not
-executed in the terminated threads.
-
-According to POSIX 1003.1c, a successful @code{exec*} in one of the
-threads should automatically terminate all other threads in the program.
-This behavior is not yet implemented in LinuxThreads. Calling
-@code{pthread_kill_other_threads_np} before @code{exec*} achieves much
-of the same behavior, except that if @code{exec*} ultimately fails, then
-all other threads are already killed.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_once (pthread_once_t *once_@var{control}, void (*@var{init_routine}) (void))
-
-The purpose of @code{pthread_once} is to ensure that a piece of
-initialization code is executed at most once. The @var{once_control}
-argument points to a static or extern variable statically initialized
-to @code{PTHREAD_ONCE_INIT}.
-
-The first time @code{pthread_once} is called with a given
-@var{once_control} argument, it calls @var{init_routine} with no
-argument and changes the value of the @var{once_control} variable to
-record that initialization has been performed. Subsequent calls to
-@code{pthread_once} with the same @code{once_control} argument do
-nothing.
-
-If a thread is cancelled while executing @var{init_routine}
-the state of the @var{once_control} variable is reset so that
-a future call to @code{pthread_once} will call the routine again.
-
-If the process forks while one or more threads are executing
-@code{pthread_once} initialization routines, the states of their respective
-@var{once_control} variables will appear to be reset in the child process so
-that if the child calls @code{pthread_once}, the routines will be executed.
-
-@code{pthread_once} always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_setschedparam (pthread_t target_@var{thread}, int @var{policy}, const struct sched_param *@var{param})
-
-@code{pthread_setschedparam} sets the scheduling parameters for the
-thread @var{target_thread} as indicated by @var{policy} and
-@var{param}. @var{policy} can be either @code{SCHED_OTHER} (regular,
-non-realtime scheduling), @code{SCHED_RR} (realtime, round-robin) or
-@code{SCHED_FIFO} (realtime, first-in first-out). @var{param} specifies
-the scheduling priority for the two realtime policies. See
-@code{sched_setpolicy} for more information on scheduling policies.
-
-The realtime scheduling policies @code{SCHED_RR} and @code{SCHED_FIFO}
-are available only to processes with superuser privileges.
-
-On success, @code{pthread_setschedparam} returns 0. On error it returns
-one of the following codes:
-@table @code
-@item EINVAL
-@var{policy} is not one of @code{SCHED_OTHER}, @code{SCHED_RR},
-@code{SCHED_FIFO}, or the priority value specified by @var{param} is not
-valid for the specified policy
-
-@item EPERM
-Realtime scheduling was requested but the calling process does not have
-sufficient privileges.
-
-@item ESRCH
-The @var{target_thread} is invalid or has already terminated
-
-@item EFAULT
-@var{param} points outside the process memory space
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_getschedparam (pthread_t target_@var{thread}, int *@var{policy}, struct sched_param *@var{param})
-
-@code{pthread_getschedparam} retrieves the scheduling policy and
-scheduling parameters for the thread @var{target_thread} and stores them
-in the locations pointed to by @var{policy} and @var{param},
-respectively.
-
-@code{pthread_getschedparam} returns 0 on success, or one of the
-following error codes on failure:
-@table @code
-@item ESRCH
-The @var{target_thread} is invalid or has already terminated.
-
-@item EFAULT
-@var{policy} or @var{param} point outside the process memory space.
-
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_setconcurrency (int @var{level})
-@code{pthread_setconcurrency} is unused in LinuxThreads due to the lack
-of a mapping of user threads to kernel threads. It exists for source
-compatibility. It does store the value @var{level} so that it can be
-returned by a subsequent call to @code{pthread_getconcurrency}. It takes
-no other action however.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_getconcurrency ()
-@code{pthread_getconcurrency} is unused in LinuxThreads due to the lack
-of a mapping of user threads to kernel threads. It exists for source
-compatibility. However, it will return the value that was set by the
-last call to @code{pthread_setconcurrency}.
-@end deftypefun