void ElfSegment::writeData(ByteArray& output) { if (sections.size() == 0) { output.alignSize(header.p_align); if (header.p_offset == header.p_paddr) header.p_paddr = output.size(); header.p_offset = output.size(); return; } // align segment to alignment of first section int align = std::max<int>(sections[0]->getAlignment(),16); output.alignSize(align); header.p_offset = output.size(); for (int i = 0; i < (int)sections.size(); i++) { sections[i]->setOffsetBase(header.p_offset); } if (paddrSection) { header.p_paddr = paddrSection->getOffset(); } output.append(data); }
// only called for segmentless sections void ElfSection::writeData(ByteArray& output) { if (header.sh_type == SHT_NULL) return; // nobits sections still get a provisional file address if (header.sh_type == SHT_NOBITS) { header.sh_offset = output.size(); } if (header.sh_addralign != -1) output.alignSize(header.sh_addralign); header.sh_offset = output.size(); output.append(data); }