这里是解析ELF头程序头表和节头表的实现:并未对所以平台提供全部支持,但是细节相似。
/*
* ParseHeaders.c
*
* Created on: 2014年7月19日
* Author: angel-toms
*/
#include "ElfParser.h"
Elf32_Ehdr* get_elf_header(MemMapping* mem){
Elf32_Ehdr* pHeader = NULL;
pHeader = (Elf32_Ehdr*) calloc(1,GET_SIZE(Elf32_Ehdr));
if(NULL == pHeader){
perror("Error,malloc elf header failed !");
goto bail;
}
memcpy(pHeader,mem->base,GET_SIZE(Elf32_Ehdr));
bail:
return pHeader;
}
void print_elf_header(MemMapping* mem,Elf32_Ehdr* pHeader){
printf("ELF Header:\n");
printf("Magic: ");
int i = 0;
for(; i < EI_NIDENT ; i++){
printf("%.2X ",pHeader->e_ident[i]);
}
printf("\n");
printf("Class: ");
switch(pHeader->e_ident[EI_CLASS]){
case ELFCLASSNONE:
printf("Unknown class\n");
break;
case ELFCLASS32:
printf("32-bit architecture\n");
break;
case ELFCLASS64:
printf("64-bit architecture\n");
break;
default:
printf("\n");
break;
}
printf("Data: ");
switch(pHeader->e_ident[EI_DATA]){
case ELFDATANONE:
printf("Unknown data format\n");
break;
case ELFDATA2LSB:
printf("2's complement little-endian\n");
break;
case ELFDATA2MSB:
printf("2's complement big-endian\n");
break;
default:
printf("\n");
break;
}
printf("Version: ");
switch(pHeader->e_ident[EI_VERSION]){
case EV_NONE:
printf("Unkwon\n");
break;
case EV_CURRENT:
printf("1 (current)\n");
break;
default:
printf("\n");
break;
}
printf("OS/ABI: ");
switch(pHeader->e_ident[EI_OSABI]){
case ELFOSABI_NONE:
printf("UNIX System V\n");
break;
case ELFOSABI_HPUX:
printf("HP-UX operating system\n");
break;
case ELFOSABI_NETBSD:
printf("NetBSD\n");
break;
case ELFOSABI_LINUX:
printf("GNU/Linux");
break;
case ELFOSABI_HURD:
printf("GNU/Hurd\n");
break;
case ELFOSABI_86OPEN:
printf("86Open common IA32 ABI");
break;
case ELFOSABI_SOLARIS:
printf("Solaris\n");
break;
case ELFOSABI_AIX:
printf("AIX\n");
break;
case ELFOSABI_IRIX:
printf("IRIX\n");
break;
case ELFOSABI_FREEBSD:
printf("FreeBSD\n");
break;
case ELFOSABI_TRU64:
printf("TRU64 UNIX\n");
break;
case ELFOSABI_MODESTO:
printf("Novell Modesto\n");
break;
case ELFOSABI_OPENBSD:
printf("OpenBSD\n");
break;
case ELFOSABI_OPENVMS:
printf("Open VMS\n");
break;
case ELFOSABI_NSK:
printf("HP Non-Stop Kernel\n");
break;
case ELFOSABI_AROS:
printf("Amiga Research OS\n");
break;
case ELFOSABI_ARM:
printf("ARM\n");
break;
case ELFOSABI_STANDALONE:
printf("Standalone (embedded) application\n");
break;
default:
printf("\n");
break;
}
printf("ABI Version: ");
switch(pHeader->e_ident[EI_ABIVERSION]){
case 0:
printf("0\n");
break;
default:
printf("\n");
break;
}
printf("Type: ");
switch(pHeader->e_type){
case ET_NONE:
printf("Unknown type\n");
break;
case ET_REL:
printf("Relocatable\n");
break;
case ET_EXEC:
printf("Executable\n");
break;
case ET_DYN:
printf("Shared object\n");
break;
case ET_CORE:
printf("Core file\n");
break;
case ET_LOOS:
printf("First operating system specific\n");
break;
case ET_HIOS:
printf("Last operating system-specific\n");
break;
case ET_LOPROC:
printf("First processor-specific\n");
break;
case ET_HIPROC:
printf("Last processor-specific\n");
break;
default:
break;
}
printf("Machine: ");
switch(pHeader->e_machine){