GP-5532: Fixed an issue in the Mach-O loader that prevented

uninitialized segments from being mapped into memory (Closes #7949)
This commit is contained in:
Ryan Kurtz 2025-03-26 12:42:51 -04:00
parent 1a80aff30a
commit 9f12dbebf1

View file

@ -226,14 +226,19 @@ public class MachoProgramBuilder {
for (SegmentCommand segment : segments) { for (SegmentCommand segment : segments) {
monitor.increment(); monitor.increment();
if (segment.getFileSize() > 0 && segment.getVMsize() > 0 && if (segment.getSegmentName().equals(SegmentNames.SEG_PAGEZERO)) {
(allowZeroAddr || segment.getVMaddress() != 0)) { continue;
if (createMemoryBlock(segment.getSegmentName(), }
space.getAddress(segment.getVMaddress()), segment.getFileOffset(),
segment.getFileSize(), segment.getSegmentName(), source, segment.isRead(), if (segment.getVMsize() > 0 && (allowZeroAddr || segment.getVMaddress() != 0)) {
segment.isWrite(), segment.isExecute(), false, false) == null) { if (segment.getFileSize() > 0) {
log.appendMsg(String.format("Failed to create block: %s 0x%x 0x%x", if (createMemoryBlock(segment.getSegmentName(),
segment.getSegmentName(), segment.getVMaddress(), segment.getVMsize())); space.getAddress(segment.getVMaddress()), segment.getFileOffset(),
segment.getFileSize(), segment.getSegmentName(), source, segment.isRead(),
segment.isWrite(), segment.isExecute(), false, false) == null) {
log.appendMsg(String.format("Failed to create block: %s 0x%x 0x%x",
segment.getSegmentName(), segment.getVMaddress(), segment.getVMsize()));
}
} }
if (segment.getVMsize() > segment.getFileSize()) { if (segment.getVMsize() > segment.getFileSize()) {
// Pad the remaining address range with uninitialized data // Pad the remaining address range with uninitialized data
@ -274,7 +279,8 @@ public class MachoProgramBuilder {
AddressSpace sectionSpace = overlaySections.contains(section) AddressSpace sectionSpace = overlaySections.contains(section)
? segmentOverlayMap.get(section.getSegmentName()) ? segmentOverlayMap.get(section.getSegmentName())
: space; : space;
if (section.getSize() > 0 && section.getOffset() > 0 && if (section.getSize() > 0 &&
(section.getOffset() > 0 || section.getType() == SectionTypes.S_ZEROFILL) &&
(allowZeroAddr || section.getAddress() != 0)) { (allowZeroAddr || section.getAddress() != 0)) {
if (createMemoryBlock(section.getSectionName(), if (createMemoryBlock(section.getSectionName(),
sectionSpace.getAddress(section.getAddress()), section.getOffset(), sectionSpace.getAddress(section.getAddress()), section.getOffset(),