* Makefile.in (SYSTEM_H): Define.
[official-gcc.git] / boehm-gc / README.linux
blobe35e712ef95fbffc25f918a59261576d8287435c
1 See README.alpha for Linux on DEC AXP info.
3 This file applies mostly to Linux/Intel IA32.  Ports to Linux on an M68K
4 and PowerPC are also integrated.  They should behave similarly, except that
5 the PowerPC port lacks incremental GC support, and it is unknown to what
6 extent the Linux threads code is functional.
8 Incremental GC is supported on Intel IA32 and M68K.
10 Dynamic libraries are supported on an ELF system.  A static executable
11 should be linked with the gcc option "-Wl,-defsym,_DYNAMIC=0".
13 The collector appears to work with Linux threads.  We have seen
14 intermittent hangs in sem_wait.  So far we have been unable to reproduce
15 these unless the process was being debugged or traced.  Thus it's
16 possible that the only real issue is that the debugger loses
17 signals on rare occasions.
19 The garbage collector uses SIGPWR and SIGXCPU if it is used with
20 Linux threads.  These should not be touched by the client program.
22 To use threads, you need to abide by the following requirements:
24 1) You need to use LinuxThreads (which are included in libc6).
26    The collector relies on some implementation details of the LinuxThreads
27    package.  It is unlikely that this code will work on other
28    pthread implementations (in particular it will *not* work with
29    MIT pthreads).
31 2) You must compile the collector with -DLINUX_THREADS and -D_REENTRANT
32    specified in the Makefile.
34 3a) Every file that makes thread calls should define LINUX_THREADS and 
35    _REENTRANT and then include gc.h.  Gc.h redefines some of the
36    pthread primitives as macros which also provide the collector with
37    information it requires.
39 3b) A new alternative to (3a) is to build the collector with
40    -DUSE_LD_WRAP, and to link the final program with
42    (for ld) --wrap read --wrap dlopen --wrap pthread_create \
43             --wrap pthread_join --wrap pthread_sigmask
45    (for gcc) -Wl,--wrap -Wl,read -Wl,--wrap -Wl,dlopen -Wl,--wrap \
46              -Wl,pthread_create -Wl,--wrap -Wl,pthread_join -Wl,--wrap \
47              -Wl,pthread_sigmask
49    In any case, _REENTRANT should be defined during compilation.
51 4) Dlopen() disables collection during its execution.  (It can't run
52    concurrently with the collector, since the collector looks at its
53    data structures.  It can't acquire the allocator lock, since arbitrary
54    user startup code may run as part of dlopen().)  Under unusual
55    conditions, this may cause unexpected heap growth.
57 5) The combination of LINUX_THREADS, REDIRECT_MALLOC, and incremental
58    collection fails in seemingly random places.  This hasn't been tracked
59    down yet, but is perhaps not completely astonishing.  The thread package
60    uses malloc, and thus can presumably get SIGSEGVs while inside the
61    package.  There is no real guarantee that signals are handled properly
62    at that point.
64 6) Thread local storage may not be viewed as part of the root set by the
65    collector.  This probably depends on the linuxthreads version.  For the
66    time being, any collectable memory referenced by thread local storage should
67    also be referenced from elsewhere, or be allocated as uncollectable.
68    (This is really a bug that should be fixed somehow.)