ld: implement support for exposing ld functions to loaded executables
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user