diff --git a/src/p_mach.cpp b/src/p_mach.cpp index 12f47b8f..03c2b5a3 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -477,7 +477,7 @@ void PackMachPPC32::pack4(OutputFile *fo, Filter &ft) // append PackHeader { // offset of p_info in compressed file overlay_offset = sizeof(mhdro) + sizeof(segZERO) - + sizeof(segMHDR) + sizeof(secMHDR) + + sizeof(segXHDR) + sizeof(secXHDR) + sizeof(segTEXT) + sizeof(secTEXT) + sizeof(segLINK) + sizeof(threado) + sizeof(linfo); if (my_filetype==Mach_header::MH_EXECUTE) { @@ -491,16 +491,19 @@ void PackMachPPC32::pack4(OutputFile *fo, Filter &ft) // append PackHeader secTEXT.offset = overlay_offset - sizeof(linfo); secTEXT.addr = segTEXT.vmaddr + secTEXT.offset; secTEXT.size = segTEXT.vmsize - secTEXT.offset; - secMHDR.offset = secTEXT.offset; - secMHDR.size = PAGE_SIZE - secMHDR.offset; + secXHDR.offset = overlay_offset - sizeof(linfo); + if (my_filetype==Mach_header::MH_EXECUTE) { + secXHDR.offset -= sizeof(uuid_cmd) + sizeof(linkitem); + } + secXHDR.addr += secXHDR.offset; unsigned const foff1 = (PAGE_MASK & (~PAGE_MASK + segTEXT.filesize)); segLINK.fileoff = foff1; segLINK.vmaddr = segTEXT.vmaddr + foff1; fo->seek(foff1 - 1, SEEK_SET); fo->write("", 1); fo->seek(sizeof(mhdro), SEEK_SET); fo->rewrite(&segZERO, sizeof(segZERO)); - fo->rewrite(&segMHDR, sizeof(segMHDR)); - fo->rewrite(&secMHDR, sizeof(secMHDR)); + fo->rewrite(&segXHDR, sizeof(segXHDR)); + fo->rewrite(&secXHDR, sizeof(secXHDR)); fo->rewrite(&segTEXT, sizeof(segTEXT)); fo->rewrite(&secTEXT, sizeof(secTEXT)); fo->rewrite(&segLINK, sizeof(segLINK)); @@ -516,7 +519,7 @@ void PackMachI386::pack4(OutputFile *fo, Filter &ft) // append PackHeader { // offset of p_info in compressed file overlay_offset = sizeof(mhdro) + sizeof(segZERO) - + sizeof(segMHDR) + sizeof(secMHDR) + + sizeof(segXHDR) + sizeof(secXHDR) + sizeof(segTEXT) + sizeof(secTEXT) + sizeof(segLINK) + sizeof(threado) + sizeof(linfo); if (my_filetype==Mach_header::MH_EXECUTE) { @@ -530,16 +533,19 @@ void PackMachI386::pack4(OutputFile *fo, Filter &ft) // append PackHeader secTEXT.offset = overlay_offset - sizeof(linfo); secTEXT.addr = segTEXT.vmaddr + secTEXT.offset; secTEXT.size = segTEXT.vmsize - secTEXT.offset; - secMHDR.offset = secTEXT.offset; - secMHDR.size = PAGE_SIZE - secMHDR.offset; + secXHDR.offset = overlay_offset - sizeof(linfo); + if (my_filetype==Mach_header::MH_EXECUTE) { + secXHDR.offset -= sizeof(uuid_cmd) + sizeof(linkitem); + } + secXHDR.addr += secXHDR.offset; unsigned const foff1 = (PAGE_MASK & (~PAGE_MASK + segTEXT.filesize)); segLINK.fileoff = foff1; segLINK.vmaddr = segTEXT.vmaddr + foff1; fo->seek(foff1 - 1, SEEK_SET); fo->write("", 1); fo->seek(sizeof(mhdro), SEEK_SET); fo->rewrite(&segZERO, sizeof(segZERO)); - fo->rewrite(&segMHDR, sizeof(segMHDR)); - fo->rewrite(&secMHDR, sizeof(secMHDR)); + fo->rewrite(&segXHDR, sizeof(segXHDR)); + fo->rewrite(&secXHDR, sizeof(secXHDR)); fo->rewrite(&segTEXT, sizeof(segTEXT)); fo->rewrite(&secTEXT, sizeof(secTEXT)); fo->rewrite(&segLINK, sizeof(segLINK)); @@ -555,7 +561,7 @@ void PackMachAMD64::pack4(OutputFile *fo, Filter &ft) // append PackHeader { // offset of p_info in compressed file overlay_offset = sizeof(mhdro) + sizeof(segZERO) - + sizeof(segMHDR) + sizeof(secMHDR) + + sizeof(segXHDR) + sizeof(secXHDR) + sizeof(segTEXT) + sizeof(secTEXT) + sizeof(segLINK) + sizeof(threado) + sizeof(linfo); if (my_filetype==Mach_header::MH_EXECUTE) { @@ -569,16 +575,19 @@ void PackMachAMD64::pack4(OutputFile *fo, Filter &ft) // append PackHeader secTEXT.offset = overlay_offset - sizeof(linfo); secTEXT.addr = segTEXT.vmaddr + secTEXT.offset; secTEXT.size = segTEXT.vmsize - secTEXT.offset; - secMHDR.offset = secTEXT.offset; - secMHDR.size = PAGE_SIZE - secMHDR.offset; + secXHDR.offset = overlay_offset - sizeof(linfo); + if (my_filetype==Mach_header::MH_EXECUTE) { + secXHDR.offset -= sizeof(uuid_cmd) + sizeof(linkitem); + } + secXHDR.addr += secXHDR.offset; unsigned const foff1 = (PAGE_MASK & (~PAGE_MASK + segTEXT.filesize)); segLINK.fileoff = foff1; segLINK.vmaddr = segTEXT.vmaddr + foff1; fo->seek(foff1 - 1, SEEK_SET); fo->write("", 1); fo->seek(sizeof(mhdro), SEEK_SET); fo->rewrite(&segZERO, sizeof(segZERO)); - fo->rewrite(&segMHDR, sizeof(segMHDR)); - fo->rewrite(&secMHDR, sizeof(secMHDR)); + fo->rewrite(&segXHDR, sizeof(segXHDR)); + fo->rewrite(&secXHDR, sizeof(secXHDR)); fo->rewrite(&segTEXT, sizeof(segTEXT)); fo->rewrite(&secTEXT, sizeof(secTEXT)); fo->rewrite(&segLINK, sizeof(segLINK)); @@ -594,7 +603,7 @@ void PackMachARMEL::pack4(OutputFile *fo, Filter &ft) // append PackHeader { // offset of p_info in compressed file overlay_offset = sizeof(mhdro) + sizeof(segZERO) - + sizeof(segMHDR) + sizeof(secMHDR) + + sizeof(segXHDR) + sizeof(secXHDR) + sizeof(segTEXT) + sizeof(secTEXT) + sizeof(segLINK) + sizeof(threado) + sizeof(linfo); if (my_filetype==Mach_header::MH_EXECUTE) { @@ -608,16 +617,19 @@ void PackMachARMEL::pack4(OutputFile *fo, Filter &ft) // append PackHeader secTEXT.offset = overlay_offset - sizeof(linfo); secTEXT.addr = segTEXT.vmaddr + secTEXT.offset; secTEXT.size = segTEXT.vmsize - secTEXT.offset; - secMHDR.offset = secTEXT.offset; - secMHDR.size = PAGE_SIZE - secMHDR.offset; + secXHDR.offset = overlay_offset - sizeof(linfo); + if (my_filetype==Mach_header::MH_EXECUTE) { + secXHDR.offset -= sizeof(uuid_cmd) + sizeof(linkitem); + } + secXHDR.addr += secXHDR.offset; unsigned const foff1 = (PAGE_MASK & (~PAGE_MASK + segTEXT.filesize)); segLINK.fileoff = foff1; segLINK.vmaddr = segTEXT.vmaddr + foff1; fo->seek(foff1 - 1, SEEK_SET); fo->write("", 1); fo->seek(sizeof(mhdro), SEEK_SET); fo->rewrite(&segZERO, sizeof(segZERO)); - fo->rewrite(&segMHDR, sizeof(segMHDR)); - fo->rewrite(&secMHDR, sizeof(secMHDR)); + fo->rewrite(&segXHDR, sizeof(segXHDR)); + fo->rewrite(&secXHDR, sizeof(secXHDR)); fo->rewrite(&segTEXT, sizeof(segTEXT)); fo->rewrite(&secTEXT, sizeof(secTEXT)); fo->rewrite(&segLINK, sizeof(segLINK)); @@ -1139,9 +1151,9 @@ void PackMachBase::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e unsigned const lc_seg = lc_segment[sizeof(Addr)>>3]; mhdro = mhdri; if (my_filetype==Mach_header::MH_EXECUTE) { - mhdro.ncmds = 5; // __ZERO, __MHDR, __TEXT, __LINKEDIT, THREAD_STATE + mhdro.ncmds = 5; // __ZERO, __XHDR, __TEXT, __LINKEDIT, THREAD_STATE mhdro.sizeofcmds = sizeof(segZERO) - + sizeof(segMHDR) + sizeof(secMHDR) + + sizeof(segXHDR) + sizeof(secXHDR) + sizeof(segTEXT) + sizeof(secTEXT) + sizeof(segLINK) + my_thread_command_size /* + sizeof(uuid_cmd) + sizeof(linkitem) */ ; mhdro.flags = Mach_header::MH_NOUNDEFS; @@ -1183,17 +1195,18 @@ void PackMachBase::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e memcpy(secTEXT.segname, segTEXT.segname, sizeof(secTEXT.segname)); secTEXT.align = 2; // (1<<2) ==> 4 - segMHDR = segTEXT; - segMHDR.vmaddr = PAGE_SIZE; - segMHDR.vmsize = PAGE_SIZE; - segMHDR.filesize = PAGE_SIZE; - strncpy((char *)segMHDR.segname, "__MHDR", sizeof(segMHDR.segname)); + segXHDR = segTEXT; + segXHDR.vmaddr = PAGE_SIZE; + segXHDR.vmsize = PAGE_SIZE; + segXHDR.filesize = PAGE_SIZE; + strncpy((char *)segXHDR.segname, "__XHDR", sizeof(segXHDR.segname)); - memset(&secMHDR, 0, sizeof(secMHDR)); - strncpy((char *)secMHDR.sectname, "__mhdr", sizeof(secMHDR.sectname)); - memcpy(secMHDR.segname, segMHDR.segname, sizeof(secMHDR.segname)); - secMHDR.addr = PAGE_SIZE; - secMHDR.align = 2; // (1<<2) ==> 4 + memset(&secXHDR, 0, sizeof(secXHDR)); + strncpy((char *)secXHDR.sectname, "__xhdr", sizeof(secXHDR.sectname)); + memcpy(secXHDR.segname, segXHDR.segname, sizeof(secXHDR.segname)); + secXHDR.addr = PAGE_SIZE; + secXHDR.size = 0; // empty so far + secXHDR.align = 2; // (1<<2) ==> 4 segLINK = segTEXT; segLINK.cmdsize = sizeof(segLINK); @@ -1204,8 +1217,8 @@ void PackMachBase::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e if (my_filetype==Mach_header::MH_EXECUTE) { fo->write(&segZERO, sizeof(segZERO)); - fo->write(&segMHDR, sizeof(segMHDR)); - fo->write(&secMHDR, sizeof(secMHDR)); + fo->write(&segXHDR, sizeof(segXHDR)); + fo->write(&secXHDR, sizeof(secXHDR)); fo->write(&segTEXT, sizeof(segTEXT)); fo->write(&secTEXT, sizeof(secTEXT)); fo->write(&segLINK, sizeof(segLINK)); diff --git a/src/p_mach.h b/src/p_mach.h index 24a67b50..cbd15707 100644 --- a/src/p_mach.h +++ b/src/p_mach.h @@ -613,8 +613,8 @@ protected: Mach_header mhdro; Mach_segment_command segZERO; - Mach_segment_command segMHDR; - Mach_section_command secMHDR; + Mach_segment_command segXHDR; // location to put eXtra headers + Mach_section_command secXHDR; Mach_segment_command segTEXT; Mach_section_command secTEXT; Mach_segment_command segLINK;