Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2958 → Rev 2959

/branches/dynload/uspace/app/iloader/main.c
38,8 → 38,10
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <as.h>
 
#include "elf.h"
#include "pcb.h"
 
unsigned int elf_load(int fd, elf_header_t *header);
 
76,9 → 78,26
/* not reached */
}
 
void elf_create_pcb(elf_header_t *header)
{
pcb_t *pcb;
void *a;
 
pcb = (pcb_t *)PCB_ADDRESS;
 
a = as_area_create(pcb, sizeof(pcb_t), AS_AREA_READ | AS_AREA_WRITE);
if (a == (void *)(-1)) {
printf("elf_create_pcb: memory mapping failed\n");
return EE_MEMORY;
}
 
pcb->entry = (entry_point_t)header->e_entry;
}
 
int main(int argc, char *argv[])
{
elf_header_t header;
elf_header_t prog_header;
elf_header_t interp_header;
char *file_name;
int rc;
 
85,18 → 104,29
printf("This is loader\n");
getchar();
 
file_name = "/test";
rc = elf_load_file(file_name, &header);
printf("open and read '%s'...\n", file_name);
printf("Load program\n");
 
rc = elf_load_file("/tetris", &prog_header);
if (rc < 0) {
printf("failed to load program\n");
return 1;
}
 
printf("run program\n");
elf_run(&header);
printf("Create PCB\n");
elf_create_pcb(&prog_header);
 
printf("Load dynamic linker\n");
file_name = "/rtld.so";
printf("open and read '%s'...\n", file_name);
rc = elf_load_file(file_name, &interp_header);
if (rc < 0) {
printf("failed to load dynamic linker\n");
return 1;
}
 
printf("run dynamic linker\n");
elf_run(&interp_header);
 
/* not reached */
return 0;
}