Changes in uspace/lib/c/generic/rtld/module.c [32254d6:c576800] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/rtld/module.c
r32254d6 rc576800 55 55 #include "../private/libc.h" 56 56 57 /** Create the "entrypoint" module, of the program executable 58 * 59 * @param p_info Program ELF file info 57 /** Create module for static executable. 58 * 60 59 * @param rtld Run-time dynamic linker 61 60 * @param rmodule Place to store pointer to new module or @c NULL 62 61 * @return EOK on success, ENOMEM if out of memory 63 62 */ 64 errno_t module_create_ entrypoint(elf_finfo_t *p_info,rtld_t *rtld, module_t **rmodule)63 errno_t module_create_static_exec(rtld_t *rtld, module_t **rmodule) 65 64 { 66 65 module_t *module; 67 bool is_dynamic = p_info->dynamic != NULL;68 DPRINTF("module_create_entrypoint\n");69 66 70 67 module = calloc(1, sizeof(module_t)); 71 if (module == NULL) 68 if (module == NULL) { 69 DPRINTF("malloc failed\n"); 72 70 return ENOMEM; 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; 71 } 72 88 73 module->id = rtld_get_next_id(rtld); 89 74 module->dyn.soname = "[program]"; … … 91 76 module->rtld = rtld; 92 77 module->exec = true; 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); 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 } 102 95 103 96 list_append(&module->modules_link, &rtld->modules); … … 405 398 * be correct, "zero" offset (i.e. the total size) must be aligned 406 399 * to the strictest alignment present. 400 * Note that the padding is actually in front of the TLS data, 401 * not after it. 407 402 */ 408 403 rtld->tls_size = ALIGN_UP(rtld->tls_size, rtld->tls_align); 409 404 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 */ 405 /* Space for the TCB. */ 416 406 rtld->tls_size += sizeof(tcb_t); 417 407 #endif
Note:
See TracChangeset
for help on using the changeset viewer.