Changeset acb14ce in mainline for uspace/lib/c/generic/rtld/rtld.c
- Timestamp:
- 2025-02-02T22:06:07Z (5 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/rtld.c
rbdcf71e racb14ce 44 44 rtld_t *runtime_env; 45 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 errno_t rc; 51 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); 62 if (rc != EOK) 63 return rc; 64 65 modules_process_tls(env); 66 67 *rre = env; 68 return EOK; 69 } 70 71 /** Initialize and process a dynamically linked executable. 46 /** Initialize and process an executable. 72 47 * 73 48 * @param p_info Program info … … 77 52 { 78 53 rtld_t *env; 79 module_t *prog; 80 81 DPRINTF("Load dynamically linked program.\n"); 54 bool is_dynamic = p_info->dynamic != NULL; 55 DPRINTF("rtld_prog_process\n"); 82 56 83 57 /* Allocate new RTLD environment to pass to the loaded program */ … … 86 60 return ENOMEM; 87 61 88 env->next_id = 1;89 90 prog = calloc(1, sizeof(module_t));91 if (prog == NULL) {92 free(env);93 return ENOMEM;94 }95 96 /*97 * First we need to process dynamic sections of the executable98 * program and insert it into the module graph.99 */100 101 DPRINTF("Parse program .dynamic section at %p\n", p_info->dynamic);102 dynamic_parse(p_info->dynamic, 0, &prog->dyn);103 prog->bias = 0;104 prog->dyn.soname = "[program]";105 prog->rtld = env;106 prog->id = rtld_get_next_id(env);107 prog->exec = true;108 prog->local = false;109 110 prog->tdata = p_info->tls.tdata;111 prog->tdata_size = p_info->tls.tdata_size;112 prog->tbss_size = p_info->tls.tbss_size;113 prog->tls_align = p_info->tls.tls_align;114 115 DPRINTF("prog tdata at %p size %zu, tbss size %zu\n",116 prog->tdata, prog->tdata_size, prog->tbss_size);117 118 /* Initialize list of loaded modules */119 62 list_initialize(&env->modules); 120 63 list_initialize(&env->imodules); 121 list_append(&prog->modules_link, &env->modules); 122 123 /* Pointer to program module. Used as root of the module graph. */ 124 env->program = prog; 125 126 /* 127 * Now we can continue with loading all other modules. 128 */ 129 130 DPRINTF("Load all program dependencies\n"); 131 errno_t rc = module_load_deps(prog, 0); 64 env->next_id = 1; 65 66 module_t *module; 67 errno_t rc = module_create_entrypoint(p_info, env, &module); 132 68 if (rc != EOK) { 133 free(prog);134 69 free(env); 135 70 return rc; 136 71 } 137 72 73 /* Pointer to program module. Used as root of the module graph. */ 74 env->program = module; 75 76 /* 77 * Now we can continue with loading all other modules. 78 */ 79 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 } 88 } 89 138 90 /* Compute static TLS size */ 139 91 modules_process_tls(env); … … 143 95 */ 144 96 145 /* Process relocations in all modules */ 146 DPRINTF("Relocate all modules\n"); 147 modules_process_relocs(env, prog); 148 149 *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; 150 105 return EOK; 151 106 }
Note:
See TracChangeset
for help on using the changeset viewer.