From 2d29a8225055aa264176f9150b28a212badf75da Mon Sep 17 00:00:00 2001 From: John Reiser Date: Mon, 20 Aug 2012 20:02:26 -0700 Subject: [PATCH] PackMachBase::pack1() segTEXT.vmaddr must ignore zero-length segments --- src/p_mach.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/p_mach.cpp b/src/p_mach.cpp index b385c481..ad704fe3 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -1115,8 +1115,12 @@ void PackMachBase::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e segTEXT.cmdsize = sizeof(segTEXT) + sizeof(secTEXT); strncpy((char *)segTEXT.segname, "__TEXT", sizeof(segTEXT.segname)); if (my_filetype==Mach_header::MH_EXECUTE) { + int k; // must ignore zero-length segments, which sort last + for (k=n_segment; --k>=0; ) + if (msegcmd[k].vmsize!=0) + break; segTEXT.vmaddr = PAGE_MASK64 & (~PAGE_MASK64 + - msegcmd[n_segment -1].vmsize + msegcmd[n_segment -1].vmaddr ); + msegcmd[k].vmsize + msegcmd[k].vmaddr ); } if (my_filetype==Mach_header::MH_DYLIB) { segTEXT.vmaddr = 0;