Changes in uspace/srv/loader/main.c [6afc9d7:17341d4] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/loader/main.c
r6afc9d7 r17341d4 63 63 #include <vfs/vfs.h> 64 64 65 #ifdef CONFIG_RTLD66 #include <rtld/rtld.h>67 #include <rtld/dynamic.h>68 #include <rtld/module.h>69 70 static int ldr_load_dyn_linked(elf_info_t *p_info);71 #endif72 73 65 #define DPRINTF(...) 74 66 … … 96 88 /** Used to limit number of connections to one. */ 97 89 static bool connected = false; 98 99 #ifdef CONFIG_RTLD100 /** State structure of the dynamic linker. */101 runtime_env_t dload_re;102 static module_t prog_mod;103 #endif104 90 105 91 static void ldr_get_taskid(ipc_callid_t rid, ipc_call_t *request) … … 268 254 int rc; 269 255 270 rc = elf_load _file(pathname, 0, 0, &prog_info);256 rc = elf_load(pathname, &prog_info); 271 257 if (rc != EE_OK) { 272 258 DPRINTF("Failed to load executable '%s'.\n", pathname); … … 275 261 } 276 262 277 elf_ create_pcb(&prog_info, &pcb);263 elf_set_pcb(&prog_info, &pcb); 278 264 279 265 pcb.cwd = cwd; … … 283 269 284 270 pcb.filc = filc; 285 286 if (prog_info.interp == NULL) { 287 /* Statically linked program */ 288 async_answer_0(rid, EOK); 289 return 0; 290 } 291 292 DPRINTF("Binary is dynamically linked.\n"); 293 #ifdef CONFIG_RTLD 294 DPRINTF(" - pcb address: %p\n", &pcb); 295 DPRINTF( "- prog dynamic: %p\n", prog_info.dynamic); 296 297 rc = ldr_load_dyn_linked(&prog_info); 298 #else 299 rc = ENOTSUP; 300 #endif 271 printf("dynamic=%p rtld_env=%p\n", pcb.dynamic, pcb.rtld_runtime); 272 301 273 async_answer_0(rid, rc); 302 274 return 0; 303 275 } 304 305 #ifdef CONFIG_RTLD306 307 static int ldr_load_dyn_linked(elf_info_t *p_info)308 {309 runtime_env = &dload_re;310 311 DPRINTF("Load dynamically linked program.\n");312 313 /*314 * First we need to process dynamic sections of the executable315 * program and insert it into the module graph.316 */317 318 DPRINTF("Parse program .dynamic section at %p\n", p_info->dynamic);319 dynamic_parse(p_info->dynamic, 0, &prog_mod.dyn);320 prog_mod.bias = 0;321 prog_mod.dyn.soname = "[program]";322 323 /* Initialize list of loaded modules */324 list_initialize(&runtime_env->modules);325 list_append(&prog_mod.modules_link, &runtime_env->modules);326 327 /* Pointer to program module. Used as root of the module graph. */328 runtime_env->program = &prog_mod;329 330 /* Work around non-existent memory space allocation. */331 runtime_env->next_bias = 0x1000000;332 333 /*334 * Now we can continue with loading all other modules.335 */336 337 DPRINTF("Load all program dependencies\n");338 module_load_deps(&prog_mod);339 340 /*341 * Now relocate/link all modules together.342 */343 344 /* Process relocations in all modules */345 DPRINTF("Relocate all modules\n");346 modules_process_relocs(&prog_mod);347 348 /* Pass runtime evironment pointer through PCB. */349 pcb.rtld_runtime = (void *) runtime_env;350 351 return 0;352 }353 #endif354 276 355 277 /** Run the previously loaded program. … … 374 296 async_answer_0(rid, EOK); 375 297 DPRINTF("Jump to entry point at %p\n", pcb.entry); 376 entry_point_jmp(prog_info. entry, &pcb);298 entry_point_jmp(prog_info.finfo.entry, &pcb); 377 299 378 300 /* Not reached */
Note:
See TracChangeset
for help on using the changeset viewer.