Changeset 32254d6 in mainline
- Timestamp:
- 2025-02-13T10:16:55Z (6 days ago)
- Branches:
- master
- Children:
- f455de0
- Parents:
- a7a16a2f
- git-author:
- Matěj Volf <git@…> (2025-02-13 10:16:55)
- git-committer:
- GitHub <noreply@…> (2025-02-13 10:16:55)
- Location:
- uspace
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/dltest/dltest.c
ra7a16a2f r32254d6 944 944 return 1; 945 945 946 #ifndef STATIC_EXE 946 #ifndef STATIC_EXE // FIXME: this define is not set anywhere 947 947 948 948 if (!test_dlfcn_dl_get_private_fib_var()) -
uspace/lib/c/generic/elf/elf_load.c
ra7a16a2f r32254d6 60 60 rtld_t *env; 61 61 #endif 62 errno_t rc; 62 errno_t rc = EOK; 63 elf_finfo_t *finfo = &info->finfo; 63 64 64 rc = elf_load_file(file, 0, &info->finfo);65 rc = elf_load_file(file, 0, finfo); 65 66 if (rc != EOK) { 66 DPRINTF("Failed to load executable '%s'.\n", file_name);67 DPRINTF("Failed to load executable.\n"); 67 68 return rc; 68 69 } 69 70 71 #ifdef CONFIG_RTLD 72 DPRINTF("- prog dynamic: %p\n", finfo->dynamic); 73 rc = rtld_prog_process(finfo, &env); 74 if (rc != EOK) { 75 DPRINTF("Failed to process executable.\n"); 76 return rc; 77 } 78 info->env = env; 79 return EOK; 80 #else 70 81 if (info->finfo.dynamic == NULL) { 71 /* Statically linked program */72 DPRINTF("Binary is statically linked.\n");73 82 info->env = NULL; 74 83 return EOK; 75 84 } 76 85 77 DPRINTF("Binary is dynamically linked.\n"); 78 #ifdef CONFIG_RTLD 79 DPRINTF("- prog dynamic: %p\n", info->finfo.dynamic); 80 81 rc = rtld_prog_process(&info->finfo, &env); 82 info->env = env; 83 #else 84 rc = ENOTSUP; 86 DPRINTF("Error: trying to run a dynamically-linked executable with CONFIG_RTLD disabled.\n"); 87 return ENOTSUP; 85 88 #endif 86 return rc;87 89 } 88 90 -
uspace/lib/c/generic/libc.c
ra7a16a2f r32254d6 96 96 97 97 #ifdef CONFIG_RTLD 98 if (__pcb != NULL && __pcb->rtld_runtime != NULL) { 98 if (__pcb == NULL) { 99 /* 100 * A binary loaded by kernel, not the loader. 101 * Noop - code loaded by kernel doesn't need RTLD. 102 */ 103 } else { 104 assert(__pcb->rtld_runtime != NULL); 99 105 runtime_env = (rtld_t *) __pcb->rtld_runtime; 100 } else {101 if (rtld_init_static() != EOK)102 abort();103 106 } 104 107 #endif -
uspace/lib/c/generic/rtld/module.c
ra7a16a2f 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); -
uspace/lib/c/generic/rtld/rtld.c
ra7a16a2f r32254d6 43 43 44 44 rtld_t *runtime_env; 45 static rtld_t rt_env_static; 46 47 /** Initialize the runtime linker for use in a statically-linked executable. */ 48 errno_t rtld_init_static(void) 49 { 50 errno_t rc; 51 52 runtime_env = &rt_env_static; 53 list_initialize(&runtime_env->modules); 54 list_initialize(&runtime_env->imodules); 55 runtime_env->program = NULL; 56 runtime_env->next_id = 1; 57 58 rc = module_create_static_exec(runtime_env, NULL); 59 if (rc != EOK) 60 return rc; 61 62 modules_process_tls(runtime_env); 63 64 return EOK; 65 } 66 67 /** Initialize and process a dynamically linked executable. 45 46 /** Initialize and process an executable. 68 47 * 69 48 * @param p_info Program info … … 73 52 { 74 53 rtld_t *env; 75 module_t *prog; 76 77 DPRINTF("Load dynamically linked program.\n"); 54 bool is_dynamic = p_info->dynamic != NULL; 55 DPRINTF("rtld_prog_process\n"); 78 56 79 57 /* Allocate new RTLD environment to pass to the loaded program */ … … 82 60 return ENOMEM; 83 61 84 env->next_id = 1;85 86 prog = calloc(1, sizeof(module_t));87 if (prog == NULL) {88 free(env);89 return ENOMEM;90 }91 92 /*93 * First we need to process dynamic sections of the executable94 * program and insert it into the module graph.95 */96 97 DPRINTF("Parse program .dynamic section at %p\n", p_info->dynamic);98 dynamic_parse(p_info->dynamic, 0, &prog->dyn);99 prog->bias = 0;100 prog->dyn.soname = "[program]";101 prog->rtld = env;102 prog->id = rtld_get_next_id(env);103 prog->exec = true;104 prog->local = false;105 106 prog->tdata = p_info->tls.tdata;107 prog->tdata_size = p_info->tls.tdata_size;108 prog->tbss_size = p_info->tls.tbss_size;109 prog->tls_align = p_info->tls.tls_align;110 111 DPRINTF("prog tdata at %p size %zu, tbss size %zu\n",112 prog->tdata, prog->tdata_size, prog->tbss_size);113 114 /* Initialize list of loaded modules */115 62 list_initialize(&env->modules); 116 63 list_initialize(&env->imodules); 117 list_append(&prog->modules_link, &env->modules); 64 env->next_id = 1; 65 66 module_t *module; 67 errno_t rc = module_create_entrypoint(p_info, env, &module); 68 if (rc != EOK) { 69 free(env); 70 return rc; 71 } 118 72 119 73 /* Pointer to program module. Used as root of the module graph. */ 120 env->program = prog;74 env->program = module; 121 75 122 76 /* … … 124 78 */ 125 79 126 DPRINTF("Load all program dependencies\n"); 127 errno_t rc = module_load_deps(prog, 0); 128 if (rc != EOK) { 129 return rc; 80 if (is_dynamic) { 81 DPRINTF("Load all program dependencies\n"); 82 rc = module_load_deps(module, 0); 83 if (rc != EOK) { 84 free(module); 85 free(env); 86 return rc; 87 } 130 88 } 131 89 … … 137 95 */ 138 96 139 /* Process relocations in all modules */ 140 DPRINTF("Relocate all modules\n"); 141 modules_process_relocs(env, prog); 142 143 *rre = env; 97 if (is_dynamic) { 98 /* Process relocations in all modules */ 99 DPRINTF("Relocate all modules\n"); 100 modules_process_relocs(env, module); 101 } 102 103 if (rre != NULL) 104 *rre = env; 144 105 return EOK; 145 106 } -
uspace/lib/c/generic/thread/tls.c
ra7a16a2f r32254d6 74 74 } 75 75 76 /** Get address of static TLS block */76 /** Get address of static TLS block - only when RTLD is not initialized */ 77 77 void *tls_get(void) 78 78 { -
uspace/lib/c/include/rtld/module.h
ra7a16a2f r32254d6 41 41 #include <types/rtld/rtld.h> 42 42 43 extern errno_t module_create_ static_exec(rtld_t *, module_t **);43 extern errno_t module_create_entrypoint(elf_finfo_t *, rtld_t *, module_t **); 44 44 extern void module_process_relocs(module_t *); 45 45 extern module_t *module_find(rtld_t *, const char *); -
uspace/lib/c/include/rtld/rtld.h
ra7a16a2f r32254d6 45 45 extern rtld_t *runtime_env; 46 46 47 extern errno_t rtld_init_static(void);48 47 extern errno_t rtld_prog_process(elf_finfo_t *, rtld_t **); 49 48 extern tcb_t *rtld_tls_make(rtld_t *); -
uspace/srv/loader/main.c
ra7a16a2f r32254d6 300 300 301 301 #ifdef CONFIG_RTLD 302 if (prog_info.env) { 303 pcb.tcb = rtld_tls_make(prog_info.env); 304 } else { 305 pcb.tcb = tls_make(prog_info.finfo.base); 306 } 302 assert(prog_info.env != NULL); 303 pcb.tcb = rtld_tls_make(prog_info.env); 307 304 #else 308 305 pcb.tcb = tls_make(prog_info.finfo.base);
Note:
See TracChangeset
for help on using the changeset viewer.