Changeset 4f205248 in mainline for uspace/lib/c/generic/rtld/module.c
- Timestamp:
- 2018-04-23T18:50:40Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a2eb85d
- Parents:
- 8d58fca
- git-author:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-04-23 17:47:09)
- git-committer:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-04-23 18:50:40)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/rtld/module.c
r8d58fca r4f205248 35 35 */ 36 36 37 #include <align.h> 37 38 #include <adt/list.h> 38 39 #include <elf/elf_load.h> … … 42 43 #include <stdlib.h> 43 44 #include <str.h> 45 #include <macros.h> 44 46 45 47 #include <rtld/rtld.h> … … 72 74 const elf_segment_header_t *tls = 73 75 elf_get_phdr(__executable_start, PT_TLS); 74 uintptr_t bias = elf_get_bias(__executable_start); 75 76 module->tdata = (void *) (tls->p_vaddr + bias); 77 module->tdata_size = tls->p_filesz; 78 module->tbss_size = tls->p_memsz - tls->p_filesz; 79 module->tls_align = tls->p_align; 76 77 if (tls) { 78 uintptr_t bias = elf_get_bias(__executable_start); 79 module->tdata = (void *) (tls->p_vaddr + bias); 80 module->tdata_size = tls->p_filesz; 81 module->tbss_size = tls->p_memsz - tls->p_filesz; 82 module->tls_align = tls->p_align; 83 } else { 84 module->tdata = NULL; 85 module->tdata_size = 0; 86 module->tbss_size = 0; 87 module->tls_align = 1; 88 } 80 89 81 90 list_append(&module->modules_link, &rtld->modules); … … 324 333 { 325 334 #ifdef CONFIG_TLS_VARIANT_1 326 list_foreach(rtld->modules, modules_link, module_t, m) { 327 m->ioffs = rtld->tls_size; 328 list_append(&m->imodules_link, &rtmd->imodules); 335 rtld->tls_size = sizeof(tcb_t); 336 rtld->tls_align = _Alignof(tcb_t); 337 338 list_foreach(rtld->modules, modules_link, module_t, m) { 339 list_append(&m->imodules_link, &rtld->imodules); 340 rtld->tls_align = max(rtld->tls_align, m->tls_align); 341 342 rtld->tls_size = ALIGN_UP(rtld->tls_size, m->tls_align); 343 m->tpoff = rtld->tls_size; 329 344 rtld->tls_size += m->tdata_size + m->tbss_size; 330 345 } 331 #else /* CONFIG_TLS_VARIANT_2 */ 332 size_t offs; 333 334 list_foreach(rtld->modules, modules_link, module_t, m) { 346 347 #else 348 rtld->tls_size = 0; 349 rtld->tls_align = _Alignof(tcb_t); 350 351 list_foreach(rtld->modules, modules_link, module_t, m) { 352 list_append(&m->imodules_link, &rtld->imodules); 353 rtld->tls_align = max(rtld->tls_align, m->tls_align); 354 355 /* We are allocating spans "backwards", here, 356 * as described in U. Drepper's paper. 357 */ 335 358 rtld->tls_size += m->tdata_size + m->tbss_size; 336 } 337 338 offs = 0; 339 list_foreach(rtld->modules, modules_link, module_t, m) { 340 offs += m->tdata_size + m->tbss_size; 341 m->ioffs = rtld->tls_size - offs; 342 list_append(&m->imodules_link, &rtld->imodules); 343 } 359 rtld->tls_size = ALIGN_UP(rtld->tls_size, m->tls_align); 360 m->tpoff = -(ptrdiff_t) rtld->tls_size; 361 } 362 363 /* We are in negative offsets. In order for the alignments to 364 * be correct, "zero" offset (i.e. the total size) must be aligned 365 * to the strictest alignment present. 366 */ 367 rtld->tls_size = ALIGN_UP(rtld->tls_size, rtld->tls_align); 368 369 /* Space for the TCB. */ 370 rtld->tls_size += sizeof(tcb_t); 344 371 #endif 345 372 }
Note:
See TracChangeset
for help on using the changeset viewer.