#include "elf.h" #include #include #include #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; }