diff options
Diffstat (limited to 'elf')
-rw-r--r-- | elf/dl-load.c | 30 | ||||
-rw-r--r-- | elf/dl-support.c | 10 |
2 files changed, 40 insertions, 0 deletions
diff --git a/elf/dl-load.c b/elf/dl-load.c index cf64ebcc1e..a4e2421b6c 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -938,6 +938,30 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, #endif } break; + +#ifdef USE_TLS + case PT_TLS: + l->l_tls_blocksize = ph->p_memsz; + l->l_tls_initimage_size = ph->p_filesz; + /* Since we don't know the load address yet only store the + offset. We will adjust it later. */ + l->l_tls_initimage = (void *) ph->p_offset; + + /* This is the first element of the initialization image list. + It is created as a circular list so that we can easily + append to it. */ + if (GL(dl_initimage_list) == NULL) + GL(dl_initimage_list) = l->l_tls_nextimage = l; + else + { + l->l_tls_nextimage = GL(dl_initimage_list); + GL(dl_initimage_list) = l; + } + + /* Assign the next available module ID. */ + l->l_tls_modid = ++GL(dl_tls_module_cnt); + break; +#endif } /* Now process the load commands and map segments into memory. */ @@ -1007,6 +1031,12 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, l->l_map_start = c->mapstart + l->l_addr; l->l_map_end = l->l_map_start + maplength; +#ifdef USE_TLS + /* Adjust the address of the TLS initialization image. */ + if (l->l_tls_initimage != NULL) + l->l_tls_initimage = (char *) l->l_tls_initimage + l->l_addr; +#endif + while (c < &loadcmds[nloadcmds]) { if (c->mapend > c->mapstart diff --git a/elf/dl-support.c b/elf/dl-support.c index 9a9436e498..10446dc68a 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -137,6 +137,16 @@ int _dl_correct_cache_id = _DL_CACHE_DEFAULT_ID; At this time it is not anymore a problem to modify the tables. */ __libc_lock_define_initialized_recursive (, _dl_load_lock) +#ifdef USE_TLS +/* Beginning of the list of link maps for objects which contain + thread-local storage sections. This will be traversed to + initialize new TLS blocks. */ +struct link_map *_dl_initimage_list; + +/* Count the number of modules which define TLS data. */ +size_t _dl_tls_module_cnt; +#endif + #ifdef HAVE_AUX_VECTOR int _dl_clktck; |