bool SgAsmElfSection::reallocate() { bool reallocated = false; SgAsmElfSectionTableEntry *sechdr = get_section_entry(); SgAsmElfSegmentTableEntry *seghdr = get_segment_entry(); /* Change section size if this section was defined in the ELF Section Table */ if (sechdr!=NULL) { rose_addr_t need = calculate_sizes(NULL, NULL, NULL, NULL); if (need < get_size()) { if (is_mapped()) { ROSE_ASSERT(get_mapped_size()==get_size()); set_mapped_size(need); } set_size(need); reallocated = true; } else if (need > get_size()) { get_file()->shift_extend(this, 0, need-get_size(), SgAsmGenericFile::ADDRSP_ALL, SgAsmGenericFile::ELASTIC_HOLE); reallocated = true; } } /* Update entry in the ELF Section Table and/or ELF Segment Table */ if (sechdr) sechdr->update_from_section(this); if (seghdr) seghdr->update_from_section(this); return reallocated; }
/** Attaches a previously unattached ELF Segment (SgAsmElfSection) to the ELF Segment Table (SgAsmElfSegmentTable). This * method complements SgAsmElfSection::init_from_segment_table. This method initializes the segment table from the segment * while init_from_segment_table() initializes the segment from the segment table. * * ELF Segments are represented by SgAsmElfSection objects since ELF Segments and ELF Sections overlap very much in their * features and thus should share an interface. An SgAsmElfSection can appear in the ELF Section Table and/or the ELF Segment * Table and you can determine where it was located by calling get_section_entry() and get_segment_entry(). * * Returns the new segment table entry linked into the AST. */ SgAsmElfSegmentTableEntry * SgAsmElfSegmentTable::add_section(SgAsmElfSection *section) { ROSE_ASSERT(section!=NULL); ROSE_ASSERT(section->get_file()==get_file()); ROSE_ASSERT(section->get_header()==get_header()); ROSE_ASSERT(section->get_segment_entry()==NULL); /* must not be in the segment table yet */ SgAsmElfFileHeader *fhdr = dynamic_cast<SgAsmElfFileHeader*>(get_header()); ROSE_ASSERT(fhdr); /* Assign a slot in the segment table */ int idx = fhdr->get_e_phnum(); fhdr->set_e_phnum(idx+1); /* Create a new segment table entry */ SgAsmElfSegmentTableEntry *shdr = new SgAsmElfSegmentTableEntry; shdr->set_index(idx); shdr->update_from_section(section); section->set_segment_entry(shdr); return shdr; }