From f890f6bb096613703c6d58640c3497c3ea64f837 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Thu, 23 Aug 2012 14:26:42 -0700 Subject: [PATCH] ignore another .vmsize==0; fix unfold which needs another page --- src/p_mach.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/p_mach.cpp b/src/p_mach.cpp index 4479d4d1..d33c8f52 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -351,8 +351,7 @@ PackMachBase::buildMachLoader( int const GAP = 128; // must match stub/l_mac_ppc.S int const NO_LAP = 64; // must match stub/src/*darwin*.S - segTEXT.vmsize += h.sz_unc - h.sz_cpr + GAP + NO_LAP; - secTEXT.size += h.sz_unc - h.sz_cpr + GAP + NO_LAP; + segTEXT.vmsize = h.sz_unc - h.sz_cpr + GAP + NO_LAP; addStubEntrySections(ft); @@ -486,7 +485,9 @@ void PackMachPPC32::pack4(OutputFile *fo, Filter &ft) // append PackHeader } super::pack4(fo, ft); - segTEXT.vmsize = segTEXT.filesize = fo->getBytesWritten(); + unsigned const t = fo->getBytesWritten(); + segTEXT.filesize = t; + segTEXT.vmsize += t; // utilize GAP + NO_LAP + sz_unc - sz_cpr secTEXT.offset = overlay_offset - sizeof(linfo); secTEXT.addr = segTEXT.vmaddr + secTEXT.offset; secTEXT.size = segTEXT.vmsize - secTEXT.offset; @@ -523,7 +524,9 @@ void PackMachI386::pack4(OutputFile *fo, Filter &ft) // append PackHeader } super::pack4(fo, ft); - segTEXT.vmsize = segTEXT.filesize = fo->getBytesWritten(); + unsigned const t = fo->getBytesWritten(); + segTEXT.filesize = t; + segTEXT.vmsize += t; // utilize GAP + NO_LAP + sz_unc - sz_cpr secTEXT.offset = overlay_offset - sizeof(linfo); secTEXT.addr = segTEXT.vmaddr + secTEXT.offset; secTEXT.size = segTEXT.vmsize - secTEXT.offset; @@ -560,7 +563,9 @@ void PackMachAMD64::pack4(OutputFile *fo, Filter &ft) // append PackHeader } super::pack4(fo, ft); - segTEXT.vmsize = segTEXT.filesize = fo->getBytesWritten(); + unsigned const t = fo->getBytesWritten(); + segTEXT.filesize = t; + segTEXT.vmsize += t; // utilize GAP + NO_LAP + sz_unc - sz_cpr secTEXT.offset = overlay_offset - sizeof(linfo); secTEXT.addr = segTEXT.vmaddr + secTEXT.offset; secTEXT.size = segTEXT.vmsize - secTEXT.offset; @@ -597,7 +602,9 @@ void PackMachARMEL::pack4(OutputFile *fo, Filter &ft) // append PackHeader } super::pack4(fo, ft); - segTEXT.vmsize = segTEXT.filesize = fo->getBytesWritten(); + unsigned const t = fo->getBytesWritten(); + segTEXT.filesize = t; + segTEXT.vmsize += t; // utilize GAP + NO_LAP + sz_unc - sz_cpr secTEXT.offset = overlay_offset - sizeof(linfo); secTEXT.addr = segTEXT.vmaddr + secTEXT.offset; secTEXT.size = segTEXT.vmsize - secTEXT.offset; @@ -1375,7 +1382,9 @@ bool PackMachBase::canPack() if (~PAGE_MASK & (msegcmd[j].fileoff | msegcmd[j].vmaddr)) { return false; } - if (0 < j && msegcmd[j-1].vmsize!=0) { + if (msegcmd[j].vmsize==0) + break; // was sorted last + if (0 < j) { unsigned const sz = PAGE_MASK & (~PAGE_MASK + msegcmd[j-1].filesize); if ((sz + msegcmd[j-1].fileoff)!=msegcmd[j].fileoff) {