Changes in uspace/srv/loader/elf_load.c [08c9f7d:1ea99cc] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/loader/elf_load.c
r08c9f7d r1ea99cc 102 102 * @return EOK on success or negative error code. 103 103 */ 104 int elf_load_file(char *file_name, size_t so_bias, elf_info_t *info) 104 int elf_load_file(char *file_name, size_t so_bias, eld_flags_t flags, 105 elf_info_t *info) 105 106 { 106 107 elf_ld_t elf; … … 117 118 elf.fd = fd; 118 119 elf.info = info; 120 elf.flags = flags; 119 121 120 122 rc = elf_load(&elf, so_bias); … … 123 125 124 126 return rc; 125 }126 127 /** Run an ELF executable.128 *129 * Transfers control to the entry point of an ELF executable loaded130 * earlier with elf_load_file(). This function does not return.131 *132 * @param info Info structure filled earlier by elf_load_file()133 */134 void elf_run(elf_info_t *info, pcb_t *pcb)135 {136 program_run(info->entry, pcb);137 138 /* not reached */139 127 } 140 128 … … 151 139 pcb->entry = info->entry; 152 140 pcb->dynamic = info->dynamic; 141 pcb->rtld_runtime = NULL; 153 142 } 154 143 … … 303 292 break; 304 293 case PT_INTERP: 305 /* Assume silently interp == "/ rtld.so" */306 elf->info->interp = "/ rtld.so";294 /* Assume silently interp == "/app/dload" */ 295 elf->info->interp = "/app/dload"; 307 296 break; 308 297 case PT_DYNAMIC: 298 /* Record pointer to dynamic section into info structure */ 299 elf->info->dynamic = 300 (void *)((uint8_t *)entry->p_vaddr + elf->bias); 301 DPRINTF("dynamic section found at 0x%x\n", 302 (uintptr_t)elf->info->dynamic); 303 break; 304 case 0x70000000: 305 /* FIXME: MIPS reginfo */ 306 break; 309 307 case PT_SHLIB: 310 308 case PT_NOTE: 311 case PT_LOPROC:312 case PT_HIPROC:309 // case PT_LOPROC: 310 // case PT_HIPROC: 313 311 default: 314 312 DPRINTF("Segment p_type %d unknown.\n", entry->p_type); … … 380 378 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE); 381 379 if (a == (void *)(-1)) { 382 DPRINTF("Memory mapping failed.\n"); 380 DPRINTF("memory mapping failed (0x%x, %d)\n", 381 base+bias, mem_sz); 383 382 return EE_MEMORY; 384 383 } … … 422 421 } 423 422 423 /* 424 * The caller wants to modify the segments first. He will then 425 * need to set the right access mode and ensure SMC coherence. 426 */ 427 if ((elf->flags & ELDF_RW) != 0) return EE_OK; 428 429 // printf("set area flags to %d\n", flags); 424 430 rc = as_area_change_flags(seg_ptr, flags); 425 431 if (rc != 0) { … … 458 464 break; 459 465 case SHT_DYNAMIC: 460 /* Record pointer to dynamic section into info structure */461 elf->info->dynamic =462 (void *)((uint8_t *)entry->sh_addr + elf->bias);463 DPRINTF("Dynamic section found at 0x%x.\n",464 (uintptr_t)elf->info->dynamic);465 466 break; 466 467 default:
Note:
See TracChangeset
for help on using the changeset viewer.