diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-10-04 16:35:46 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-10-04 16:35:46 -0400 |
commit | 8431d7972fd9be0fdcaff8516316d748e81724bb (patch) | |
tree | 53800c9deeaf26a9fedc5f9f574d9694315b510c /src/ldso | |
parent | adefe830dd376be386df5650a09c313c483adf1a (diff) | |
download | musl-8431d7972fd9be0fdcaff8516316d748e81724bb.tar.gz musl-8431d7972fd9be0fdcaff8516316d748e81724bb.tar.bz2 musl-8431d7972fd9be0fdcaff8516316d748e81724bb.tar.xz musl-8431d7972fd9be0fdcaff8516316d748e81724bb.zip |
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')
-rw-r--r-- | src/ldso/dynlink.c | 10 |
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; _dl_debug_state(); + /* 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); do_init_fini(tail); @@ -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; |