⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 read_elf.cpp

📁 RISC processor ARM-7 emulator
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* 		case EM_960 : printf("Intel 80960"); break; */
/* 		case EM_PPC : printf("PowerPC"); break; */

/* 		case EM_V800 : printf("NEC V800 series"); break; */
/* 		case EM_FR20 : printf("Fujitsu FR20"); break; */
/* 		case EM_RH32 : printf("TRW RH32"); break; */
/* 		case EM_MMA : printf("Fujitsu MMA"); break; */
/* 		case EM_ARM : printf("ARM"); break; */
/* 		case EM_FAKE_ALPHA : printf("Digital Alpha"); break; */
/* 		case EM_SH : printf("Hitachi SH"); break; */
/* 		case EM_SPARCV9 : printf("SPARC v9 64-bit"); break; */
/* 		case EM_TRICORE : printf("Siemens Tricore"); break; */
/* 		case EM_ARC : printf("Argonaut RISC Core"); break; */
/* 		case EM_H8_300 : printf("Hitachi H8/300"); break; */
/* 		case EM_H8_300H : printf("Hitachi H8/300H"); break; */
/* 		case EM_H8S : printf("Hitachi H8S"); break; */
/* 		case EM_H8_500 : printf("Hitachi H8/500"); break; */
/* 		case EM_IA_64 : printf("Intel Merced"); break; */
/* 		case EM_MIPS_X : printf("Stanford MIPS-X"); break; */
/* 		case EM_COLDFIRE : printf("Motorola Coldfire"); break; */
/* 		case EM_68HC12 : printf("Motorola M68HC12"); break; */
/* 		default: printf("?"); */
/* 	} */
	
	printf("\nNumber of program headers : %u", hdr->e_phnum);
	
	printf("\nNumber of section headers : %u", hdr->e_shnum);
	
	printf("\n");
}

void DumpProgramHeader(Elf32_Phdr *phdr)
{
	printf("--- Program Header ---");
	printf("\nSegment type : ");
	switch(phdr->p_type)
	{	
		case PT_NULL: printf("Program header table entry unused"); break;
		case PT_LOAD: printf("Loadable program segment"); break;
		case PT_DYNAMIC: printf("Dynamic linking information"); break;
		case PT_INTERP: printf("Program interpreter"); break;
		case PT_NOTE: printf("Auxiliary information"); break;
		case PT_SHLIB: printf("Reserved"); break;
		case PT_PHDR: printf("Entry for header table itself"); break;
/* 		case PT_LOOS: printf("Start of OS-specific"); break; */
/* 		case PT_HIOS: printf("End of OS-specific"); break; */
		case PT_LOPROC: printf("Start of processor-specific"); break;
		case PT_HIPROC: printf("End of processor-specific"); break;
	}
	
	printf("\nFile offset : 0x%lx", (unsigned long) phdr->p_offset);
	printf("\nVirtual Address : 0x%lx", (unsigned long) phdr->p_vaddr);
	printf("\nPhysical Address : 0x%lx", (unsigned long) phdr->p_paddr);
	printf("\nFile size : %lu", (unsigned long) phdr->p_filesz);
	printf("\nMemory size : %lu", (unsigned long) phdr->p_memsz);
	printf("\nSegment flags (rwx) : ");
	printf(phdr->p_flags & PF_R ? "r" : "-");
	printf(phdr->p_flags & PF_W ? "w" : "-");
	printf(phdr->p_flags & PF_X ? "x" : "-");
	printf(phdr->p_flags & PF_MASKPROC ? " and some Processor-specific flags" : "");

	printf("\nMemory/File alignment : %u", phdr->p_align);

	printf("\n");
}



void DumpSectionHeader(Elf32_Shdr *shdr, char *string_table)
{
	printf("--- Section header ---");
	printf("\nSection name : %s", string_table + shdr->sh_name);
	printf("\nSection type : ");
	
	switch(shdr->sh_type)
	{
		case SHT_NULL: printf("Section header table entry unused"); break;
		case SHT_PROGBITS: printf("Program data"); break;
		case SHT_SYMTAB: printf("Symbol table"); break;
		case SHT_STRTAB: printf("String table"); break;
		case SHT_RELA: printf("Relocation entries with addends"); break;
		case SHT_HASH: printf("Symbol hash table"); break;
		case SHT_DYNAMIC: printf("Dynamic linking information"); break;
		case SHT_NOTE: printf("Notes"); break;
		case SHT_NOBITS: printf("Program space with no data (bss)"); break;
		case SHT_REL: printf("Relocation entries, no addends"); break;
		case SHT_SHLIB: printf("Reserved"); break;
		case SHT_DYNSYM: printf("Dynamic linker symbol table"); break;
		case SHT_NUM: printf("Number of defined types. "); break;
/* 		case SHT_LOOS: printf("Start OS-specific"); break; */
		case SHT_LOSUNW: printf("Sun-specific low bound. "); break;
		case SHT_SUNW_syminfo: printf("sun ?"); break;
/* 		case SHT_GNU_verdef: printf("Version definition section."); break; */
/* 		case SHT_GNU_verneed: printf("Version needs section."); break; */
/* 		case SHT_GNU_versym: printf("Version symbol table."); break; */
		default : printf("?");
	}
	
	printf("\nSection flags : ");
	
	if(shdr->sh_flags & SHF_WRITE) printf("\n - Writable");
	if(shdr->sh_flags & SHF_ALLOC) printf("\n - Occupies memory during execution");
	if(shdr->sh_flags & SHF_EXECINSTR) printf("\n - Executable");
	if(shdr->sh_flags & SHF_MASKPROC) printf("\n - Processor-specific");
	
	printf("\nFile offset : 0x%x", shdr->sh_offset);
	printf("\nVirtual Address : 0x%x", shdr->sh_addr);

	printf("\n");
}

Elf32_Shdr *GetTextSection(Elf32_Ehdr *hdr, Elf32_Shdr *shdr_table, char
*string_table)
{
	Elf32_Shdr *shdr = shdr_table;
	int i;
	
	for(i = 0; i < hdr->e_shnum; i++)
	{
		if(shdr[i].sh_type == SHT_PROGBITS &&
		   (shdr[i].sh_flags & SHF_ALLOC) != 0 &&
		   (shdr[i].sh_flags & SHF_EXECINSTR) != 0 &&
		   strcmp(GetSymbolName(shdr[i].sh_name, string_table), ".text") == 0)
		{
			return &shdr[i];
		}
	}
	return NULL;
}

Elf32_Shdr *GetDataSection(Elf32_Ehdr *hdr, Elf32_Shdr *shdr_table, char *string_table)
{
	Elf32_Shdr *shdr = shdr_table;
	int i;
	
	for(i = 0; i < hdr->e_shnum; i++)
	{
		if(shdr[i].sh_type == SHT_PROGBITS &&
		   (shdr[i].sh_flags & SHF_ALLOC) != 0 &&
		   (shdr[i].sh_flags & SHF_WRITE) != 0 &&
		   strcmp(GetSymbolName(shdr[i].sh_name, string_table), ".data") == 0)
		{
			return &shdr[i];
		}
	}
	return NULL;
}

Elf32_Shdr *GetBSSSection(Elf32_Ehdr *hdr, Elf32_Shdr *shdr_table, char *string_table)
{
	Elf32_Shdr *shdr = shdr_table;
	int i;
	
	for(i = 0; i < hdr->e_shnum; i++)
	{
		if(shdr[i].sh_type == SHT_NOBITS &&
		   (shdr[i].sh_flags & SHF_ALLOC) != 0 &&
		   (shdr[i].sh_flags & SHF_WRITE) != 0 &&
		   strcmp(GetSymbolName(shdr[i].sh_name, string_table), ".bss") == 0)
		{
			return &shdr[i];
		}
	}
	return NULL;
}

Elf32_Word GetSectionSize(Elf32_Shdr *shdr)
{
	return shdr->sh_size;
}

Elf32_Addr GetSectionAddr(Elf32_Shdr *shdr)
{
	return shdr->sh_addr;
}

Elf32_Word GetSectionType(Elf32_Shdr *shdr)
{
    return shdr->sh_type;
}

Elf32_Word GetSectionFlags(Elf32_Shdr *shdr)
{
	return shdr->sh_flags;
}


int LoadSection(Elf32_Shdr *shdr, void *buffer, FILE *f)
{
	if(fseek(f, shdr->sh_offset, SEEK_SET) != 0) return -1;
	if(fread(buffer, shdr->sh_size, 1, f) != 1) return -1;
	return 0;
}

char *GetSymbolName(Elf32_Half index, char *string_table)
{
	return string_table + index;
}

Elf32_Shdr *GetSymbolTableSection(Elf32_Ehdr *hdr, Elf32_Shdr *shdr_table, char *string_table)
{
	Elf32_Shdr *shdr = shdr_table;
	int i;
	
	for(i = 0; i < hdr->e_shnum; i++)
	{
		if(shdr[i].sh_type == SHT_SYMTAB &&
		   strcmp(GetSymbolName(shdr[i].sh_name, string_table), ".symtab") == 0)
		{
			return &shdr[i];
		}
	}
	return NULL;
}

Elf32_Shdr *GetSymbolStringTableSection(Elf32_Ehdr *hdr, Elf32_Shdr *shdr_table, char *string_table)
{
	Elf32_Shdr *shdr = shdr_table;
	int i;
	
	for(i = 0; i < hdr->e_shnum; i++)
	{
		if(shdr[i].sh_type == SHT_STRTAB &&
		   strcmp(GetSymbolName(shdr[i].sh_name, string_table), ".strtab") == 0)
		{
			return &shdr[i];
		}
	}
	return NULL;
}

Elf32_Sym *LoadSymbolTable(Elf32_Ehdr *hdr, Elf32_Shdr *shdr_table, char *string_table, FILE *f)
{
/*	Elf32_Shdr *shdr = GetSymbolTableSection(hdr, shdr_table, string_table);*/
	Elf32_Word size = GetSectionSize(shdr_table);
	
	Elf32_Sym *symbol_table = (Elf32_Sym *) malloc(size);
	
	return LoadSection(shdr_table, symbol_table, f) ? NULL : symbol_table;
}

Elf32_Sym *GetSymbol(Elf32_Sym *symbol_table, Elf32_Shdr *shdr_symbol_table, char *name, char
*string_table)
{
	unsigned int i;
	
	for(i = 0; i < shdr_symbol_table->sh_size / shdr_symbol_table->sh_entsize; i++)
	{
		if(strcmp(name, GetSymbolName(symbol_table[i].st_name, string_table)) == 0)
		{
			return &symbol_table[i];
		}
	}
	return NULL;
}

Elf32_Addr GetSymbolAddr(Elf32_Sym *symbol, Elf32_Shdr *shdr_table)
{
	switch(symbol->st_shndx)
	{
		case SHN_ABS:
			return symbol->st_value;
	}
	return shdr_table[symbol->st_shndx].sh_addr + symbol->st_value;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -