65 lines
1.8 KiB
C
65 lines
1.8 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "elf.h"
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
FILE* fp;
|
|
long file_size;
|
|
|
|
fp = fopen("testfile", "rb");
|
|
|
|
fseek(fp, 0, SEEK_END);
|
|
file_size = ftell(fp);
|
|
fseek(fp, 0, SEEK_SET);
|
|
printf("size: %d!!\n", file_size);
|
|
|
|
uint8_t* file = (uint8_t*)malloc(file_size);
|
|
|
|
fread(file, 1, file_size, fp);
|
|
|
|
Elf32_Ehdr *elf_ehdr = (Elf32_Ehdr*)file;
|
|
|
|
int program_header_table_entry_count = elf_ehdr->e_phnum;
|
|
int program_header_table_entry_size = elf_ehdr->e_phentsize;
|
|
|
|
printf("magic: %s, type: %d, entry: 0x%X\n", elf_ehdr->e_ident, elf_ehdr->e_type, elf_ehdr->e_entry);
|
|
printf("PHNUM: %d\n", program_header_table_entry_count);
|
|
printf("PHENTSIZE: %d\n\n", program_header_table_entry_size);
|
|
|
|
for(int i = 0; i < program_header_table_entry_count; i++)
|
|
{
|
|
Elf32_Phdr *elf_phdr = (Elf32_Phdr *)((uint32_t)file + elf_ehdr->e_phoff +
|
|
i * elf_ehdr->e_phentsize);
|
|
|
|
printf("HEADER %d, type: 0x%X, vaddr: 0x%X, paddr: 0x%X, memsz: 0x%X\n", i, elf_phdr->p_type, elf_phdr->p_vaddr, elf_phdr->p_paddr, elf_phdr->p_memsz);
|
|
if(elf_phdr->p_type != PT_LOAD)
|
|
{
|
|
printf("not PT_LOAD, skipping...\n");
|
|
continue;
|
|
}
|
|
int pages_needed = elf_phdr->p_memsz / 0x1000;
|
|
printf("pages needed: %d\n", pages_needed);
|
|
///////////////////////////
|
|
//MAP HERE
|
|
///////////////////////////
|
|
|
|
//memcpy(elf_phdr->p_vaddr, file+elf_phdr->p_offset, elf_phdr->p_filesz);
|
|
|
|
uint32_t file_start = elf_phdr->p_vaddr + elf_phdr->p_filesz;
|
|
uint32_t file_end = elf_phdr->p_vaddr + pages_needed * 0x1000;
|
|
//memset(file_start, 0, file_end - file_start);
|
|
|
|
printf("p_filesz: 0x%X (%d)\n", elf_phdr->p_filesz, elf_phdr->p_filesz);
|
|
|
|
|
|
|
|
printf("================================\n\n\n\n");
|
|
}
|
|
|
|
fclose(fp);
|
|
free(file);
|
|
return 0;
|
|
}
|