Files
rosetta/sys/ld/self.c
T

45 lines
1.0 KiB
C
Raw Normal View History

#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;
}