summaryrefslogtreecommitdiffstats
path: root/linker/README.TXT
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2009-06-03 19:32:37 +0200
committerDavid 'Digit' Turner <digit@google.com>2009-06-03 19:32:37 +0200
commit3a654b1e04d4275ae315cfe1b196998acf10052c (patch)
tree79ce08ac573c6c5bd7d7a65f7fdc24237c00452a /linker/README.TXT
parent03eabfe65e1e2c36f4d26c78a730fa19a3bdada3 (diff)
downloadbionic-3a654b1e04d4275ae315cfe1b196998acf10052c.zip
bionic-3a654b1e04d4275ae315cfe1b196998acf10052c.tar.gz
bionic-3a654b1e04d4275ae315cfe1b196998acf10052c.tar.bz2
Revert "Fix the C library initialization to avoid calling static C++ constructors twice."
This reverts commit 03eabfe65e1e2c36f4d26c78a730fa19a3bdada3.
Diffstat (limited to 'linker/README.TXT')
-rw-r--r--linker/README.TXT43
1 files changed, 0 insertions, 43 deletions
diff --git a/linker/README.TXT b/linker/README.TXT
index 0be9be4..4fff14e 100644
--- a/linker/README.TXT
+++ b/linker/README.TXT
@@ -112,46 +112,3 @@ On x86, the lists of constructors and destructors are placed in special
sections named ".ctors" and ".dtors", and the DT_INIT / DT_FINI functions
are in charge of calling them explicitely.
-
-C Library Usage Restrictions:
------------------------------
-
-The dynamic linker executable (/system/bin/linker) is built using the
-static version of the C library (libc.a), in order to use various functions
-and system calls provided by it.
-
-However, it will normally, at runtime, map the shared library version
-of the C library (/system/lib/libc.so) as well in the process' address
-space. This means that:
-
-- any global variable defined by the C library will appear twice in
- the process address space, at different addresses.
-
-- some functions will be duplicated too, though those that refer to
- global variables will refer to distinct addresses.
-
-This can lead to subtle conflicts, typically for process-specific data that
-is managed through the kernel. A good example is the handling of the
-end of the data segment, which is normally done through the 'sbrk' or
-'brk' system call by the malloc implementation.
-
-If two similar, but distinct, malloc implementations run at the same time,
-and if each one thinks it exclusively manages some process settings, hideous
-corruption or crashes may occur.
-
-For this very reason, THE DYNAMIC LINKER CANNOT USE malloc()/free() !
-That's why it is linked to a special version of the C library that will
-abort when any of these functions (or calloc()/realloc()) is called.
-
-Moreover, it cannot use any C library feature that could use these
-indirectly. Experience as shown that this meant:
-
-- avoiding any FILE* - related stdio function (fopen, fread, fprintf, etc...)
-- avoiding snprintf() with any floating-point formatter ("%f", "%g")
-
-There are probably other cases that haven't been discovered yet, so the
-code needs to be very frugal in its use of the C library.
-
-This also explains why the linker's tracing macros are all disabled by
-default. Enabling them sometimes creates problems, depending on the process
-being loaded, so they should be considered an experimental feature for now.