/** Initializes this ELF Symbol Section by parsing a file. */ SgAsmElfSymbolSection * SgAsmElfSymbolSection::parse() { SgAsmElfSection::parse(); SgAsmElfFileHeader *fhdr = get_elf_header(); ROSE_ASSERT(fhdr!=NULL); SgAsmElfSectionTableEntry *shdr = get_section_entry(); ROSE_ASSERT(shdr!=NULL); SgAsmElfStringSection *strsec = dynamic_cast<SgAsmElfStringSection*>(get_linked_section()); ROSE_ASSERT(strsec!=NULL); size_t entry_size, struct_size, extra_size, nentries; calculate_sizes(&entry_size, &struct_size, &extra_size, &nentries); ROSE_ASSERT(entry_size==shdr->get_sh_entsize()); /* Parse each entry */ for (size_t i=0; i<nentries; i++) { SgAsmElfSymbol *entry=0; if (4==fhdr->get_word_size()) { entry = new SgAsmElfSymbol(this); /*adds symbol to this symbol table*/ SgAsmElfSymbol::Elf32SymbolEntry_disk disk; read_content_local(i*entry_size, &disk, struct_size); entry->parse(fhdr->get_sex(), &disk); } else if (8==fhdr->get_word_size()) { entry = new SgAsmElfSymbol(this); /*adds symbol to this symbol table*/ SgAsmElfSymbol::Elf64SymbolEntry_disk disk; read_content_local(i*entry_size, &disk, struct_size); entry->parse(fhdr->get_sex(), &disk); } else { throw FormatError("unsupported ELF word size"); } if (extra_size>0) entry->get_extra() = read_content_local_ucl(i*entry_size+struct_size, extra_size); } return this; }