45 lines
1.0 KiB
C
45 lines
1.0 KiB
C
|
|
#include "elf.h"
|
||
|
|
|
||
|
|
#include <magenta/config.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
#include <stdlib.h>
|
||
|
|
|
||
|
|
#define LD_NAME "ld64.so"
|
||
|
|
#define LD_IMAGE_BASE_OFFSET 1024
|
||
|
|
|
||
|
|
extern char _DYNAMIC[];
|
||
|
|
extern char _ld_image_base[];
|
||
|
|
extern char _ld_image_limit[];
|
||
|
|
|
||
|
|
struct elf_image *get_self(void)
|
||
|
|
{
|
||
|
|
struct elf_image *self = malloc(sizeof *self);
|
||
|
|
memset(self, 0x0, sizeof *self);
|
||
|
|
|
||
|
|
snprintf(
|
||
|
|
self->e_leaf.l_name,
|
||
|
|
sizeof self->e_leaf.l_name,
|
||
|
|
"%s",
|
||
|
|
LD_NAME);
|
||
|
|
kern_config_get(
|
||
|
|
KERN_CFG_PAGE_SIZE,
|
||
|
|
&self->e_page_size,
|
||
|
|
sizeof self->e_page_size);
|
||
|
|
|
||
|
|
self->e_base = (virt_addr_t)_ld_image_base - LD_IMAGE_BASE_OFFSET;
|
||
|
|
self->e_length = (virt_addr_t)_ld_image_limit - self->e_base;
|
||
|
|
if (self->e_length & (self->e_page_size - 1)) {
|
||
|
|
self->e_length &= ~(self->e_page_size - 1);
|
||
|
|
self->e_length += self->e_page_size;
|
||
|
|
}
|
||
|
|
|
||
|
|
self->e_dynamic.p_type = PT_DYNAMIC;
|
||
|
|
self->e_dynamic.p_align = 8;
|
||
|
|
self->e_dynamic.p_memsz = self->e_dynamic.p_filesz = (size_t)-1;
|
||
|
|
self->e_dynamic.p_vaddr = (virt_addr_t)_DYNAMIC - self->e_base;
|
||
|
|
|
||
|
|
elf_image_parse_dynamic(self);
|
||
|
|
|
||
|
|
return self;
|
||
|
|
}
|