Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3399 → Rev 3400

/branches/dynload/uspace/lib/rtld/rtld.c
37,19 → 37,20
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <loader/pcb.h>
 
#include <rtld.h>
#include <dynamic.h>
#include <pcb.h>
#include <elf_load.h>
#include <module.h>
#include <arch.h>
#include <rtld_arch.h>
 
runtime_env_t runtime_env;
 
void program_run(void *entry, pcb_t *pcb);
 
void _rtld_main(void)
{
pcb_t *pcb;
static module_t prog;
module_t *rtld;
 
66,9 → 67,8
printf("Parse rtld .dynamic section at 0x%x\n", runtime_env.rtld_dynamic);
dynamic_parse(runtime_env.rtld_dynamic, rtld->bias, &rtld->dyn);
 
pcb = __pcb_get();
printf("Parse program .dynamic section at 0x%x\n", pcb->dynamic);
dynamic_parse(pcb->dynamic, 0, &prog.dyn);
printf("Parse program .dynamic section at 0x%x\n", __pcb->dynamic);
dynamic_parse(__pcb->dynamic, 0, &prog.dyn);
prog.bias = 0;
prog.dyn.soname = "[program]";
 
98,9 → 98,29
/*
* Finally, run the main program.
*/
printf("Run program.. (at 0x%x)\n", (uintptr_t)pcb->entry);
pcb->entry();
printf("Run program.. (at 0x%x)\n", (uintptr_t)__pcb->entry);
//__pcb->entry();
program_run(__pcb->entry, __pcb);
}
 
/** Fake main to satisfy dependency from libc */
int main(int argc, char *argv[])
{
return 0;
}
 
typedef void (*ep2)(void *);
 
void program_run(void *entry, pcb_t *pcb)
{
asm (
// "xorl %%ebx, %%ebx\n"
// "movl 0(%%ebx), %%ecx\n"
"mov %%eax, %%ebx\n"
"jmp *%0\n"
:: "m" (entry), "a" (pcb)
);
}
 
/** @}
*/