コード例 #1
0
ファイル: ElfParser.cpp プロジェクト: jiaoyk/snowman
    void parse() {
        parseElfHeader();
        parseSections();
        parseSymbols();
        parseRelocations();

        foreach (auto &section, sections_) {
            image_->addSection(std::move(section));
        }
コード例 #2
0
ファイル: executable_parser.c プロジェクト: jawline/Dawn
void parseElfFile(e32info* info, fs_node_t* file) {
	unsigned int headerIterator;
	
	info->m_mainHeader = parseElfHeader(file);

	//Allocate the space for the program headers
	info->m_programHeaders = (e32_pheader*) malloc(sizeof(e32_pheader) * info->m_mainHeader.e_phnum);
	info->m_numProgramHeaders = info->m_mainHeader.e_phnum;

	//Load each header
	for (headerIterator = 0; headerIterator < info->m_numProgramHeaders; headerIterator++) {
		info->m_programHeaders[headerIterator] = parseElfProgramHeader(file, info->m_mainHeader, headerIterator);
	}

	//Allocate the space for the section headers
	info->m_sectionHeaders = (e32_sheader*) malloc(sizeof(e32_sheader) * info->m_mainHeader.e_shnum);
	info->m_numSectionHeaders = info->m_mainHeader.e_shnum;

	//Load each section header
	for (headerIterator = 0; headerIterator < info->m_numSectionHeaders; headerIterator++) {
		info->m_sectionHeaders[headerIterator] = parseElfSectionHeader(file, info->m_mainHeader, headerIterator);
	}
}
コード例 #3
0
ファイル: armelfloader.c プロジェクト: enefry/arm-x86
int main(int argc, char *argv[]){
  elfHeader_t elfHeader;
  FILE *elf, *bin;
  uint32_t numBytesRead, i;

  if(argc != 2){
    printf("Please specify exactly one input elf file\n");
    exit(-1);
  }

  if((elf = fopen(argv[1],"rb")) == NULL){
    printf("Could not open %s\n", argv[1]);
    exit(-2);
  }

  //
  // FIXME
  // The file name should match the input file excepting
  // for the extension.
  //
  char *outputFileName = (char *)malloc(strlen(argv[1]) + 4);
  char *ptr;
  if(ptr = strrchr(argv[1], '.')) *ptr = '\0';
  sprintf(outputFileName,"%s.img",argv[1]);
  if((bin = fopen(outputFileName,"wb")) == NULL){
    printf("Could not open file for writing\n");
    exit(-3);
  }

  parseElfHeader(elf,&elfHeader);

  if(elfHeader.e_type != ET_EXEC){
    printf("Invalid ELF: Non-executable image\n");
    exit(-4);
  }

  if(elfHeader.e_machine != EM_ARM){
    printf("Invalid ELF: Not ARM executable\n");
    exit(-5);
  }

  if(elfHeader.e_phoff == 0){
    printf("Invalid ELF: Process image cannot be created\n");
    exit(-6);
  }

  for(i=0; i<elfHeader.e_phnum; i++){
    programHeader_t *programHeader = (programHeader_t *)malloc(sizeof(programHeader_t));
    parseProgramHeader(elf, programHeader);

    uint32_t inst;
    fseek(elf, programHeader->p_paddr, SEEK_SET);
    for(i=0; i<programHeader->p_filesz; i++){
      fread(&inst,1,4,elf);
      fwrite(&inst,1,4,bin);
    }
  }

  fclose(elf);
  fclose(bin);
}