/branches/dynload/uspace/lib/libc/include/loader/pcb.h |
---|
47,25 → 47,25 |
* arguments, environment variables etc. |
*/ |
typedef struct { |
/** Program entry point. */ |
/** Program entry point */ |
entry_point_t entry; |
/** Number of command-line arguments. */ |
/** Number of command-line arguments */ |
int argc; |
/** Command-line arguments. */ |
/** Command-line arguments */ |
char **argv; |
/* |
* ELF-specific data. |
* ELF-specific data |
*/ |
/** Pointer to ELF dynamic section of the program. */ |
/** Pointer to ELF dynamic section of the program */ |
void *dynamic; |
/** Pointer to dynamic section of the runtime linker */ |
void *rtld_dynamic; |
/** Runtime-linker load bias */ |
uintptr_t rtld_bias; |
} pcb_t; |
/** |
* A pointer to the program control block. Having received the PCB pointer, |
* the C library startup code stores it here for later use. |
*/ |
extern pcb_t *__pcb; |
#endif |
/branches/dynload/uspace/lib/rtld/rtld.c |
---|
52,14 → 52,21 |
static void rtld_main(void) |
{ |
static module_t prog; |
// module_t *rtld; |
DPRINTF("Hello, world! (from rtld)\n"); |
/* |
* First we need to process dynamic sections of the executable |
* program and insert it into the module graph. |
* First we need to process dynamic sections of the two modules |
* that have been already loaded, that is, of ourselves and of |
* the executable program. |
*/ |
/* rtld_dynamic and rtld->bias were filled out by the bootstrap code */ |
// rtld = &runtime_env.rtld; |
// DPRINTF("Parse rtld .dynamic section at 0x%x\n", runtime_env.rtld_dynamic); |
// dynamic_parse(runtime_env.rtld_dynamic, rtld->bias, &rtld->dyn); |
DPRINTF("Parse program .dynamic section at 0x%x\n", __pcb->dynamic); |
dynamic_parse(__pcb->dynamic, 0, &prog.dyn); |
prog.bias = 0; |
69,7 → 76,7 |
list_initialize(&runtime_env.modules_head); |
list_append(&prog.modules_link, &runtime_env.modules_head); |
/* Pointer to program module. Used as root of the module graph. */ |
/* Pointer to program module. Used as root of the dependency graph */ |
runtime_env.program = &prog; |
/* |
98,6 → 105,7 |
program_run(__pcb->entry, __pcb); |
} |
/** Fake main to satisfy dependency from libc */ |
int main(int argc, char *argv[]) |
{ |
rtld_main(); |
/branches/dynload/uspace/srv/loader/main.c |
---|
59,6 → 59,12 |
#include <elf.h> |
#include <elf_load.h> |
/** |
* Bias used for loading the dynamic linker. This will be soon replaced |
* by automatic placement. |
*/ |
#define RTLD_BIAS 0x80000 |
/** Pathname of the file that will be loaded */ |
static char *pathname = NULL; |
223,13 → 229,16 |
{ |
int rc; |
// printf("Load program '%s'\n", pathname); |
rc = elf_load_file(pathname, 0, 0, &prog_info); |
if (rc < 0) { |
printf("Failed to load executable '%s'.\n", pathname); |
printf("failed to load program\n"); |
ipc_answer_0(rid, EINVAL); |
return 1; |
} |
// printf("Create PCB\n"); |
elf_create_pcb(&prog_info, &pcb); |
pcb.argc = argc; |
237,20 → 246,29 |
if (prog_info.interp == NULL) { |
/* Statically linked program */ |
// printf("Run statically linked program\n"); |
// printf("entry point: 0x%lx\n", prog_info.entry); |
is_dyn_linked = false; |
ipc_answer_0(rid, EOK); |
return 0; |
} |
printf("Load ELF interpreter '%s'\n", prog_info.interp); |
rc = elf_load_file(prog_info.interp, 0, 0, &interp_info); |
printf("Load dynamic linker '%s'\n", prog_info.interp); |
rc = elf_load_file(prog_info.interp, RTLD_BIAS, 0, &interp_info); |
if (rc < 0) { |
printf("Failed to load interpreter '%s.'\n", prog_info.interp); |
printf("failed to load dynamic linker\n"); |
ipc_answer_0(rid, EINVAL); |
return 1; |
} |
printf("Run interpreter.\n"); |
/* |
* Provide dynamic linker with some useful data |
*/ |
pcb.rtld_dynamic = interp_info.dynamic; |
pcb.rtld_bias = RTLD_BIAS; |
printf("run dynamic linker\n"); |
printf("rtld_dynamic = 0x%lx\n", pcb.rtld_dynamic); |
printf("entry point: 0x%lx\n", interp_info.entry); |
printf("pcb address: 0x%lx\n", &pcb); |