/branches/dynload/uspace/srv/loader/include/elf_load.h |
---|
42,6 → 42,11 |
#include "elf.h" |
typedef enum { |
/** Leave all segments in RW access mode. */ |
ELDF_RW = 1 |
} eld_flags_t; |
/** |
* Some data extracted from the headers are stored here |
*/ |
66,6 → 71,9 |
/** Difference between run-time addresses and link-time addresses */ |
uintptr_t bias; |
/** Flags passed to the ELF loader. */ |
eld_flags_t flags; |
/** A copy of the ELF file header */ |
elf_header_t *header; |
73,7 → 81,8 |
elf_info_t *info; |
} elf_ld_t; |
int elf_load_file(char *file_name, size_t so_bias, elf_info_t *info); |
int elf_load_file(char *file_name, size_t so_bias, eld_flags_t flags, |
elf_info_t *info); |
void elf_run(elf_info_t *info, pcb_t *pcb); |
void elf_create_pcb(elf_info_t *info, pcb_t *pcb); |
/branches/dynload/uspace/srv/loader/main.c |
---|
231,7 → 231,7 |
// printf("Load program '%s'\n", pathname); |
rc = elf_load_file(pathname, 0, &prog_info); |
rc = elf_load_file(pathname, 0, 0, &prog_info); |
if (rc < 0) { |
printf("failed to load program\n"); |
ipc_answer_0(rid, EINVAL); |
254,7 → 254,7 |
} |
printf("Load dynamic linker '%s'\n", prog_info.interp); |
rc = elf_load_file(prog_info.interp, RTLD_BIAS, &interp_info); |
rc = elf_load_file(prog_info.interp, RTLD_BIAS, 0, &interp_info); |
if (rc < 0) { |
printf("failed to load dynamic linker\n"); |
ipc_answer_0(rid, EINVAL); |
/branches/dynload/uspace/srv/loader/elf_load.c |
---|
99,7 → 99,8 |
* |
* @return EOK on success or negative error code. |
*/ |
int elf_load_file(char *file_name, size_t so_bias, elf_info_t *info) |
int elf_load_file(char *file_name, size_t so_bias, eld_flags_t flags, |
elf_info_t *info) |
{ |
elf_ld_t elf; |
116,6 → 117,7 |
elf.fd = fd; |
elf.info = info; |
elf.flags = flags; |
rc = elf_load(&elf, so_bias); |
307,8 → 309,8 |
return load_segment(elf, entry); |
break; |
case PT_INTERP: |
/* Assume silently interp == "/lib/rtld.so" */ |
elf->info->interp = "/lib/rtld.so"; |
/* Assume silently interp == "/lib/rtld" */ |
elf->info->interp = "/lib/rtld"; |
break; |
case PT_DYNAMIC: |
case PT_SHLIB: |
425,7 → 427,13 |
dp += now; |
} |
// printf("set area flags to %d\n", flags); |
/* |
* The caller wants to modify the segments first. He will then |
* need to set the right access mode and ensure SMC coherence. |
*/ |
if ((elf->flags & ELDF_RW) != 0) return EE_OK; |
printf("set area flags to %d\n", flags); |
rc = as_area_change_flags((uint8_t *)entry->p_vaddr + bias, flags); |
if (rc != 0) { |
printf("failed to set memory area flags\n"); |