0001
0002
0003
0004
0005
0006
0007 #include <stdarg.h>
0008 #include <stddef.h>
0009 #include "elf.h"
0010 #include "page.h"
0011 #include "string.h"
0012 #include "stdio.h"
0013
0014 int parse_elf64(void *hdr, struct elf_info *info)
0015 {
0016 Elf64_Ehdr *elf64 = hdr;
0017 Elf64_Phdr *elf64ph;
0018 unsigned int i;
0019
0020 if (!(elf64->e_ident[EI_MAG0] == ELFMAG0 &&
0021 elf64->e_ident[EI_MAG1] == ELFMAG1 &&
0022 elf64->e_ident[EI_MAG2] == ELFMAG2 &&
0023 elf64->e_ident[EI_MAG3] == ELFMAG3 &&
0024 elf64->e_ident[EI_CLASS] == ELFCLASS64 &&
0025 #ifdef __LITTLE_ENDIAN__
0026 elf64->e_ident[EI_DATA] == ELFDATA2LSB &&
0027 #else
0028 elf64->e_ident[EI_DATA] == ELFDATA2MSB &&
0029 #endif
0030 (elf64->e_type == ET_EXEC ||
0031 elf64->e_type == ET_DYN) &&
0032 elf64->e_machine == EM_PPC64))
0033 return 0;
0034
0035 elf64ph = (Elf64_Phdr *)((unsigned long)elf64 +
0036 (unsigned long)elf64->e_phoff);
0037 for (i = 0; i < (unsigned int)elf64->e_phnum; i++, elf64ph++)
0038 if (elf64ph->p_type == PT_LOAD)
0039 break;
0040 if (i >= (unsigned int)elf64->e_phnum)
0041 return 0;
0042
0043 info->loadsize = (unsigned long)elf64ph->p_filesz;
0044 info->memsize = (unsigned long)elf64ph->p_memsz;
0045 info->elfoffset = (unsigned long)elf64ph->p_offset;
0046
0047 return 1;
0048 }
0049
0050 int parse_elf32(void *hdr, struct elf_info *info)
0051 {
0052 Elf32_Ehdr *elf32 = hdr;
0053 Elf32_Phdr *elf32ph;
0054 unsigned int i;
0055
0056 if (!(elf32->e_ident[EI_MAG0] == ELFMAG0 &&
0057 elf32->e_ident[EI_MAG1] == ELFMAG1 &&
0058 elf32->e_ident[EI_MAG2] == ELFMAG2 &&
0059 elf32->e_ident[EI_MAG3] == ELFMAG3 &&
0060 elf32->e_ident[EI_CLASS] == ELFCLASS32 &&
0061 elf32->e_ident[EI_DATA] == ELFDATA2MSB &&
0062 (elf32->e_type == ET_EXEC ||
0063 elf32->e_type == ET_DYN) &&
0064 elf32->e_machine == EM_PPC))
0065 return 0;
0066
0067 elf32ph = (Elf32_Phdr *) ((unsigned long)elf32 + elf32->e_phoff);
0068 for (i = 0; i < elf32->e_phnum; i++, elf32ph++)
0069 if (elf32ph->p_type == PT_LOAD)
0070 break;
0071 if (i >= elf32->e_phnum)
0072 return 0;
0073
0074 info->loadsize = elf32ph->p_filesz;
0075 info->memsize = elf32ph->p_memsz;
0076 info->elfoffset = elf32ph->p_offset;
0077 return 1;
0078 }