Changes in uspace/lib/c/generic/rtld/rtld.c [32254d6:b83c5e4] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/rtld/rtld.c
r32254d6 rb83c5e4 43 43 44 44 rtld_t *runtime_env; 45 46 /** Initialize and process an executable. 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. 47 68 * 48 69 * @param p_info Program info … … 52 73 { 53 74 rtld_t *env; 54 bool is_dynamic = p_info->dynamic != NULL; 55 DPRINTF("rtld_prog_process\n"); 75 module_t *prog; 76 77 DPRINTF("Load dynamically linked program.\n"); 56 78 57 79 /* Allocate new RTLD environment to pass to the loaded program */ … … 60 82 return ENOMEM; 61 83 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 executable 94 * 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 */ 62 115 list_initialize(&env->modules); 63 116 list_initialize(&env->imodules); 64 env->next_id = 1; 65 66 module_t *module; 67 errno_t rc = module_create_entrypoint(p_info, env, &module); 117 list_append(&prog->modules_link, &env->modules); 118 119 /* Pointer to program module. Used as root of the module graph. */ 120 env->program = prog; 121 122 /* 123 * Now we can continue with loading all other modules. 124 */ 125 126 DPRINTF("Load all program dependencies\n"); 127 errno_t rc = module_load_deps(prog, 0); 68 128 if (rc != EOK) { 69 free(env);70 129 return rc; 71 }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 130 } 89 131 … … 95 137 */ 96 138 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; 139 /* Process relocations in all modules */ 140 DPRINTF("Relocate all modules\n"); 141 modules_process_relocs(env, prog); 142 143 *rre = env; 105 144 return EOK; 106 145 }
Note:
See TracChangeset
for help on using the changeset viewer.