path: root/src/ldso
diff options
authorRich Felker <>2012-10-04 16:35:46 -0400
committerRich Felker <>2012-10-04 16:35:46 -0400
commit8431d7972fd9be0fdcaff8516316d748e81724bb (patch)
tree53800c9deeaf26a9fedc5f9f574d9694315b510c /src/ldso
parentadefe830dd376be386df5650a09c313c483adf1a (diff)
TLS (GNU/C11 thread-local storage) support for static-linked programs
the design for TLS in dynamic-linked programs is mostly complete too, but I have not yet implemented it. cost is nonzero but still low for programs which do not use TLS and/or do not use threads (a few hundred bytes of new code, plus dependency on memcpy). i believe it can be made smaller at some point by merging __init_tls and __init_security into __libc_start_main and avoiding duplicate auxv-parsing code. at the same time, I've also slightly changed the logic pthread_create uses to allocate guard pages to ensure that guard pages are not counted towards commit charge.
Diffstat (limited to 'src/ldso')
1 files changed, 10 insertions, 0 deletions
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c
index 960e0898..1447e205 100644
--- a/src/ldso/dynlink.c
+++ b/src/ldso/dynlink.c
@@ -17,6 +17,9 @@
#include <pthread.h>
#include <ctype.h>
#include <dlfcn.h>
+#include "pthread_impl.h"
+#include "libc.h"
+#undef libc
static int errflag;
static char errbuf[128];
@@ -788,6 +791,8 @@ void *__dynlink(int argc, char **argv)
debug.state = 0;
+ /* Stand-in until real TLS support is added to dynamic linker */
+ __libc.tls_size = sizeof(struct pthread) + 4*sizeof(size_t);
if (ssp_used) __init_ssp(auxv);
@@ -802,6 +807,11 @@ void *__dynlink(int argc, char **argv)
return (void *)aux[AT_ENTRY];
+void *__copy_tls(unsigned char *mem, size_t cnt)
+ return mem;
void *dlopen(const char *file, int mode)
struct dso *volatile p, *orig_tail = tail, *next;