Changes in uspace/srv/loader/main.c [3e6a98c5:153c7a29] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/loader/main.c
r3e6a98c5 r153c7a29 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) … … 249 235 } 250 236 async_state_change_finalize(callid, vfs_exch); 251 fd = fd_wait();237 fd = vfs_fd_wait(); 252 238 assert(fd == (int) filc); 253 239 } … … 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; … … 284 270 pcb.filc = filc; 285 271 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_RTLD294 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 #else299 rc = ENOTSUP;300 #endif301 272 async_answer_0(rid, rc); 302 273 return 0; 303 274 } 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 275 355 276 /** Run the previously loaded program. … … 374 295 async_answer_0(rid, EOK); 375 296 DPRINTF("Jump to entry point at %p\n", pcb.entry); 376 entry_point_jmp(prog_info. entry, &pcb);297 entry_point_jmp(prog_info.finfo.entry, &pcb); 377 298 378 299 /* Not reached */ … … 443 364 int main(int argc, char *argv[]) 444 365 { 445 /* Set a handler of incomming connections. */ 446 async_set_client_connection(ldr_connection); 366 async_set_fallback_port_handler(ldr_connection, NULL); 447 367 448 368 /* Introduce this task to the NS (give it our task ID). */ … … 452 372 return rc; 453 373 454 /* Register at naming service. */ 455 rc = service_register(SERVICE_LOAD); 374 /* Create port */ 375 port_id_t port; 376 rc = async_create_port(INTERFACE_LOADER, ldr_connection, NULL, &port); 456 377 if (rc != EOK) 457 378 return rc; 458 379 380 /* Register at naming service. */ 381 rc = service_register(SERVICE_LOADER); 382 if (rc != EOK) 383 return rc; 384 459 385 async_manager(); 460 386
Note:
See TracChangeset
for help on using the changeset viewer.