Changeset acb14ce in mainline for uspace/lib/c/generic/rtld/module.c
- Timestamp:
- 2025-02-02T22:06:07Z (3 weeks ago)
- Children:
- c095552
- Parents:
- bdcf71e
- git-author:
- Matěj Volf <git@…> (2025-02-02 21:59:42)
- git-committer:
- Matěj Volf <git@…> (2025-02-02 22:06:07)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/rtld/module.c
rbdcf71e racb14ce 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(const void *elf, rtld_t *rtld)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(elf, PT_TLS); 82 83 if (tls) { 84 uintptr_t bias = elf_get_bias(elf); 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); 104 105 if (rmodule != NULL) 106 *rmodule = module; 97 107 return EOK; 98 108 }
Note:
See TracChangeset
for help on using the changeset viewer.