Changes in uspace/lib/c/generic/rtld/module.c [c576800:32254d6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/rtld/module.c
rc576800 r32254d6 55 55 #include "../private/libc.h" 56 56 57 /** Create module for static executable. 58 * 57 /** Create the "entrypoint" module, of the program executable 58 * 59 * @param p_info Program ELF file info 59 60 * @param rtld Run-time dynamic linker 60 61 * @param rmodule Place to store pointer to new module or @c NULL 61 62 * @return EOK on success, ENOMEM if out of memory 62 63 */ 63 errno_t module_create_ static_exec(rtld_t *rtld, module_t **rmodule)64 errno_t module_create_entrypoint(elf_finfo_t *p_info, rtld_t *rtld, module_t **rmodule) 64 65 { 65 66 module_t *module; 67 bool is_dynamic = p_info->dynamic != NULL; 68 DPRINTF("module_create_entrypoint\n"); 66 69 67 70 module = calloc(1, sizeof(module_t)); 68 if (module == NULL) { 69 DPRINTF("malloc failed\n"); 71 if (module == NULL) 70 72 return ENOMEM; 71 } 72 73 74 uintptr_t bias = elf_get_bias(p_info->base); 75 76 /* 77 * First we need to process dynamic sections of the executable 78 * program and insert it into the module graph. 79 */ 80 if (is_dynamic) { 81 DPRINTF("Parse program .dynamic section at %p\n", p_info->dynamic); 82 dynamic_parse(p_info->dynamic, bias, &module->dyn); 83 } else { 84 DPRINTF("Executable is not dynamically linked\n"); 85 } 86 87 module->bias = bias; 73 88 module->id = rtld_get_next_id(rtld); 74 89 module->dyn.soname = "[program]"; … … 76 91 module->rtld = rtld; 77 92 module->exec = true; 78 module->local = true; 79 80 const elf_segment_header_t *tls = 81 elf_get_phdr(__progsymbols.elfstart, PT_TLS); 82 83 if (tls) { 84 uintptr_t bias = elf_get_bias(__progsymbols.elfstart); 85 module->tdata = (void *) (tls->p_vaddr + bias); 86 module->tdata_size = tls->p_filesz; 87 module->tbss_size = tls->p_memsz - tls->p_filesz; 88 module->tls_align = tls->p_align; 89 } else { 90 module->tdata = NULL; 91 module->tdata_size = 0; 92 module->tbss_size = 0; 93 module->tls_align = 1; 94 } 93 module->local = !is_dynamic; 94 95 module->tdata = p_info->tls.tdata; 96 module->tdata_size = p_info->tls.tdata_size; 97 module->tbss_size = p_info->tls.tbss_size; 98 module->tls_align = p_info->tls.tls_align; 99 100 DPRINTF("prog tdata at %p size %zu, tbss size %zu\n", 101 module->tdata, module->tdata_size, module->tbss_size); 95 102 96 103 list_append(&module->modules_link, &rtld->modules); … … 398 405 * be correct, "zero" offset (i.e. the total size) must be aligned 399 406 * to the strictest alignment present. 400 * Note that the padding is actually in front of the TLS data,401 * not after it.402 407 */ 403 408 rtld->tls_size = ALIGN_UP(rtld->tls_size, rtld->tls_align); 404 409 405 /* Space for the TCB. */ 410 /* 411 * Space for the TCB. 412 * Later, the TLS zero offset is equal to the pointer to tcb_t, so 413 * adding the sizeof(tcb_t) block AFTER we calculated the alignment 414 * of the remainder above is correct. 415 */ 406 416 rtld->tls_size += sizeof(tcb_t); 407 417 #endif
Note:
See TracChangeset
for help on using the changeset viewer.