summaryrefslogtreecommitdiffstats
path: root/linker
diff options
context:
space:
mode:
Diffstat (limited to 'linker')
-rw-r--r--linker/README.TXT43
-rw-r--r--linker/linker.c6
2 files changed, 3 insertions, 46 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.
diff --git a/linker/linker.c b/linker/linker.c
index e7d5ab4..e398f82 100644
--- a/linker/linker.c
+++ b/linker/linker.c
@@ -44,7 +44,7 @@
#include <sys/atomics.h>
/* special private C library header - see Android.mk */
-#include <bionic_preinit.h>
+#include <bionic_tls.h>
#include "linker.h"
#include "linker_debug.h"
@@ -1691,7 +1691,6 @@ int main(int argc, char **argv)
#define ANDROID_TLS_SLOTS BIONIC_TLS_SLOTS
static void * __tls_area[ANDROID_TLS_SLOTS];
-static pthread_internal_t __main_thread;
unsigned __linker_init(unsigned **elfdata)
{
@@ -1710,7 +1709,8 @@ unsigned __linker_init(unsigned **elfdata)
gettimeofday(&t0, 0);
#endif
- __libc_preinit(&__main_thread, __tls_area);
+ __set_tls(__tls_area);
+ ((unsigned *)__get_tls())[TLS_SLOT_THREAD_ID] = gettid();
debugger_init();