From d5d94ba8bc6e00d5cf99f8b68672ca1c5011443b Mon Sep 17 00:00:00 2001 From: Maksim Panchenko Date: Thu, 24 Jul 2025 11:47:27 -0700 Subject: [PATCH] [BOLT] More refactoring of PHDR handling. NFC (#148932) Replace ad-hoc adjustment of the program header count with info from the new segment list. --- bolt/lib/Rewrite/RewriteInstance.cpp | 32 +++++++++++----------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp index 96045a916232..f1b94e4a821a 100644 --- a/bolt/lib/Rewrite/RewriteInstance.cpp +++ b/bolt/lib/Rewrite/RewriteInstance.cpp @@ -4260,32 +4260,26 @@ void RewriteInstance::patchELFPHDRTable() { const ELFFile &Obj = ELF64LEFile->getELFFile(); raw_fd_ostream &OS = Out->os(); - // Write/re-write program headers. Phnum = Obj.getHeader().e_phnum; - if (PHDRTableOffset) { - // Writing new pheader table and adding one new entry for R+X segment. - Phnum += 1; - if (NewWritableSegmentSize) { - // Adding one more entry for R+W segment. - Phnum += 1; - } - } else { - assert(!PHDRTableAddress && "unexpected address for program header table"); - PHDRTableOffset = Obj.getHeader().e_phoff; - if (NewWritableSegmentSize) { - BC->errs() << "BOLT-ERROR: unable to add writable segment\n"; - exit(1); - } - } - - if (opts::Instrument) - Phnum += 2; if (BC->NewSegments.empty()) { BC->outs() << "BOLT-INFO: not adding new segments\n"; return; } + if (opts::UseGnuStack) { + assert(!PHDRTableAddress && "unexpected address for program header table"); + if (BC->NewSegments.size() > 1) { + BC->errs() << "BOLT-ERROR: unable to add writable segment\n"; + exit(1); + } + } else { + Phnum += BC->NewSegments.size(); + } + + if (!PHDRTableOffset) + PHDRTableOffset = Obj.getHeader().e_phoff; + const uint64_t SavedPos = OS.tell(); OS.seek(PHDRTableOffset);