ignore another .vmsize==0; fix unfold which needs another page

This commit is contained in:
John Reiser 2012-08-23 14:26:42 -07:00
parent 036d466790
commit f890f6bb09

View File

@ -351,8 +351,7 @@ PackMachBase<T>::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<T>::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) {