void parse() { parseElfHeader(); parseSections(); parseSymbols(); parseRelocations(); foreach (auto §ion, sections_) { image_->addSection(std::move(section)); }
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); } }
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); }