1
0
mirror of https://github.com/upx/upx synced 2025-09-28 19:06:07 +08:00

Fix segTEXT.vmsize and data for entry to shlib.

https://github.com/upx/upx/issues/57
	modified:   p_mach.cpp
This commit is contained in:
John Reiser 2018-03-19 14:59:20 -07:00
parent 90a1322929
commit fefe7a3452

View File

@ -831,7 +831,7 @@ void PackMachBase<T>::pack4dylib( // append PackHeader
{
if (is_text) {
slide = 0;
segTEXT.filesize = fo->getBytesWritten();
segTEXT.vmsize = segTEXT.filesize = fo->getBytesWritten();
segTEXT.maxprot |= Mach_command::VM_PROT_WRITE;
segcmdtmp = segTEXT;
opos = o_end_txt = segcmdtmp.filesize + segcmdtmp.fileoff;
@ -942,10 +942,12 @@ off_t PackMachBase<T>::pack3(OutputFile *fo, Filter &ft) // append loader
fo->write(&disp, sizeof(disp));
len += sizeof(disp);
disp = len - sz_mach_headers; // backward offset to start of compressed data
fo->write(&disp, sizeof(disp));
len += sizeof(disp);
segTEXT.vmsize = segLINK.vmaddr - segTEXT.vmaddr; // must protect this much
if (my_filetype!=Mach_header::MH_DYLIB) {
disp = len - sz_mach_headers; // backward offset to start of compressed data
fo->write(&disp, sizeof(disp));
len += sizeof(disp);
}
segTEXT.vmsize = segTEXT.filesize;
threado_setPC(entryVMA= len + segTEXT.vmaddr);
return super::pack3(fo, ft);
@ -978,14 +980,10 @@ off_t PackDylibI386::pack3(OutputFile *fo, Filter &ft) // append loader
off_t PackDylibAMD64::pack3(OutputFile *fo, Filter &ft) // append loader
{
TE32 disp;
TE64 disp64;
upx_uint64_t const zero = 0;
off_t len = fo->getBytesWritten();
fo->write(&zero, 7& (0u-len));
len += (7& (0u-len)) + sizeof(disp64) + 4*sizeof(disp);
disp64= len;
fo->write(&disp64, sizeof(disp64)); // __mod_init_func
fo->write(&zero, 3& (0u-len));
len += (3& (0u-len)) + 3*sizeof(disp);
disp = prev_mod_init_func;
fo->write(&disp, sizeof(disp)); // user .init_address