Changes in uspace/srv/loader/main.c [153c7a29:3e6a98c5] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/loader/main.c
r153c7a29 r3e6a98c5 63 63 #include <vfs/vfs.h> 64 64 65 #ifdef CONFIG_RTLD 66 #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 #endif 72 65 73 #define DPRINTF(...) 66 74 … … 88 96 /** Used to limit number of connections to one. */ 89 97 static bool connected = false; 98 99 #ifdef CONFIG_RTLD 100 /** State structure of the dynamic linker. */ 101 runtime_env_t dload_re; 102 static module_t prog_mod; 103 #endif 90 104 91 105 static void ldr_get_taskid(ipc_callid_t rid, ipc_call_t *request) … … 235 249 } 236 250 async_state_change_finalize(callid, vfs_exch); 237 fd = vfs_fd_wait();251 fd = fd_wait(); 238 252 assert(fd == (int) filc); 239 253 } … … 254 268 int rc; 255 269 256 rc = elf_load (pathname, &prog_info);270 rc = elf_load_file(pathname, 0, 0, &prog_info); 257 271 if (rc != EE_OK) { 258 272 DPRINTF("Failed to load executable '%s'.\n", pathname); … … 261 275 } 262 276 263 elf_ set_pcb(&prog_info, &pcb);277 elf_create_pcb(&prog_info, &pcb); 264 278 265 279 pcb.cwd = cwd; … … 270 284 pcb.filc = filc; 271 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 272 301 async_answer_0(rid, rc); 273 302 return 0; 274 303 } 304 305 #ifdef CONFIG_RTLD 306 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 executable 315 * 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 #endif 275 354 276 355 /** Run the previously loaded program. … … 295 374 async_answer_0(rid, EOK); 296 375 DPRINTF("Jump to entry point at %p\n", pcb.entry); 297 entry_point_jmp(prog_info. finfo.entry, &pcb);376 entry_point_jmp(prog_info.entry, &pcb); 298 377 299 378 /* Not reached */ … … 364 443 int main(int argc, char *argv[]) 365 444 { 366 async_set_fallback_port_handler(ldr_connection, NULL); 445 /* Set a handler of incomming connections. */ 446 async_set_client_connection(ldr_connection); 367 447 368 448 /* Introduce this task to the NS (give it our task ID). */ … … 372 452 return rc; 373 453 374 /* Create port */ 375 port_id_t port; 376 rc = async_create_port(INTERFACE_LOADER, ldr_connection, NULL, &port); 454 /* Register at naming service. */ 455 rc = service_register(SERVICE_LOAD); 377 456 if (rc != EOK) 378 457 return rc; 379 458 380 /* Register at naming service. */381 rc = service_register(SERVICE_LOADER);382 if (rc != EOK)383 return rc;384 385 459 async_manager(); 386 460
Note:
See TracChangeset
for help on using the changeset viewer.