解析ELF 头 程序头表 节头表

这里是解析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){
   
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值