Changeset f215c6ef in mainline
- Timestamp:
- 2025-01-26T21:33:13Z (3 weeks ago)
- Children:
- ea77c2d
- Parents:
- 31ea2a7
- git-author:
- Matěj Volf <git@…> (2025-01-26 21:04:16)
- git-committer:
- Matěj Volf <git@…> (2025-01-26 21:33:13)
- Location:
- uspace/lib/c
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/elf/elf_load.c
r31ea2a7 rf215c6ef 57 57 errno_t elf_load(int file, elf_info_t *info) 58 58 { 59 #ifdef CONFIG_RTLD 60 rtld_t *env; 61 #endif 59 62 errno_t rc = EOK; 63 elf_finfo_t *finfo = &info->finfo; 60 64 61 rc = elf_load_file(file, 0, &info->finfo);65 rc = elf_load_file(file, 0, finfo); 62 66 if (rc != EOK) { 63 67 DPRINTF("Failed to load executable '%s'.\n", file_name); … … 65 69 } 66 70 71 if (info->finfo.dynamic == NULL) { 72 /* Statically linked program */ 73 DPRINTF("Binary is statically linked.\n"); 74 info->env = NULL; 67 75 #ifdef CONFIG_RTLD 68 rtld_t *env; 69 rc = rtld_prog_process(&info->finfo, &env); 76 rc = rtld_init_static(finfo, &env); 77 info->env = env; 78 #endif 79 return EOK; 80 } 81 82 DPRINTF("Binary is dynamically linked.\n"); 83 #ifdef CONFIG_RTLD 84 DPRINTF("- prog dynamic: %p\n", finfo->dynamic); 85 rc = rtld_prog_process(finfo, &env); 70 86 info->env = env; 71 87 #else -
uspace/lib/c/generic/libc.c
r31ea2a7 rf215c6ef 99 99 /* 100 100 * A binary loaded by kernel, not the loader. 101 * Init some rudimentary rtld runtime environment.101 * Noop - code loaded by kernel doesn't need RTLD. 102 102 */ 103 errno_t rtld_init_result = rtld_init_static();104 assert(rtld_init_result == EOK);103 // errno_t rtld_init_result = rtld_init_static(); 104 // assert(rtld_init_result == EOK); 105 105 } else { 106 106 assert(__pcb->rtld_runtime != NULL); -
uspace/lib/c/generic/rtld/module.c
r31ea2a7 rf215c6ef 61 61 * @return EOK on success, ENOMEM if out of memory 62 62 */ 63 errno_t module_create_static_exec( rtld_t *rtld, module_t **rmodule)63 errno_t module_create_static_exec(const void *elf, rtld_t *rtld) 64 64 { 65 65 module_t *module; … … 79 79 80 80 const elf_segment_header_t *tls = 81 elf_get_phdr( __progsymbols.elfstart, PT_TLS);81 elf_get_phdr(elf, PT_TLS); 82 82 83 83 if (tls) { 84 uintptr_t bias = elf_get_bias( __progsymbols.elfstart);84 uintptr_t bias = elf_get_bias(elf); 85 85 module->tdata = (void *) (tls->p_vaddr + bias); 86 86 module->tdata_size = tls->p_filesz; … … 95 95 96 96 list_append(&module->modules_link, &rtld->modules); 97 98 if (rmodule != NULL)99 *rmodule = module;100 97 return EOK; 101 98 } -
uspace/lib/c/generic/rtld/rtld.c
r31ea2a7 rf215c6ef 43 43 44 44 rtld_t *runtime_env; 45 static rtld_t rt_env_static; 46 47 /** Initialize a minimal runtime linker environment for use in executables loaded directly by kernel. */ 48 errno_t rtld_init_static(void) 49 { 45 46 /** Initialize the runtime linker for use in a statically-linked executable. */ 47 errno_t rtld_init_static(elf_finfo_t *finfo, rtld_t **rre) 48 { 49 rtld_t *env; 50 50 errno_t rc; 51 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); 52 env = calloc(1, sizeof(rtld_t)); 53 if (env == NULL) 54 return ENOMEM; 55 56 list_initialize(&env->modules); 57 list_initialize(&env->imodules); 58 env->program = NULL; 59 env->next_id = 1; 60 61 rc = module_create_static_exec(finfo->base, env); 59 62 if (rc != EOK) 60 63 return rc; 61 64 62 modules_process_tls(runtime_env); 63 65 modules_process_tls(env); 66 67 *rre = env; 64 68 return EOK; 65 69 } 66 70 67 /** Initialize and process a n executable, static or dynamic.71 /** Initialize and process a dynamically linked executable. 68 72 * 69 73 * @param p_info Program info … … 75 79 module_t *prog; 76 80 77 DPRINTF("Load program with rtld.\n");81 DPRINTF("Load dynamically linked program.\n"); 78 82 79 83 /* Allocate new RTLD environment to pass to the loaded program */ … … 95 99 */ 96 100 97 if (p_info->dynamic) { 98 DPRINTF("Parse program .dynamic section at %p\n", p_info->dynamic); 99 dynamic_parse(p_info->dynamic, 0, &prog->dyn); 100 } else { 101 DPRINTF("Program is statically linked\n"); 102 } 101 DPRINTF("Parse program .dynamic section at %p\n", p_info->dynamic); 102 dynamic_parse(p_info->dynamic, 0, &prog->dyn); 103 103 prog->bias = 0; 104 104 prog->dyn.soname = "[program]"; … … 128 128 */ 129 129 130 if (p_info->dynamic) { 131 DPRINTF("Load all program dependencies\n"); 132 errno_t rc = module_load_deps(prog, 0); 133 if (rc != EOK) { 134 free(prog); 135 free(env); 136 return rc; 137 } 130 DPRINTF("Load all program dependencies\n"); 131 errno_t rc = module_load_deps(prog, 0); 132 if (rc != EOK) { 133 free(prog); 134 free(env); 135 return rc; 138 136 } 139 137 -
uspace/lib/c/include/rtld/module.h
r31ea2a7 rf215c6ef 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_static_exec(const void *, rtld_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
r31ea2a7 rf215c6ef 45 45 extern rtld_t *runtime_env; 46 46 47 extern errno_t rtld_init_static( void);47 extern errno_t rtld_init_static(elf_finfo_t *, rtld_t **); 48 48 extern errno_t rtld_prog_process(elf_finfo_t *, rtld_t **); 49 49 extern tcb_t *rtld_tls_make(rtld_t *);
Note:
See TracChangeset
for help on using the changeset viewer.