Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3551 → Rev 3552

/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");