Fix codesign for Mac OS X.
This commit is contained in:
parent
47d5792d97
commit
5977c296bd
@ -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<T>::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<T>::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<T>::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));
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user