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) |
); |
} |
|
/** @} |
*/ |