Implemented compressWithFilters().
committer: mfx <mfx> 978180632 +0000
This commit is contained in:
+62
-30
@@ -65,6 +65,32 @@ const int *PackTmt::getFilters() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int PackTmt::buildLoader(const Filter *ft)
|
||||||
|
{
|
||||||
|
// prepare loader
|
||||||
|
initLoader(nrv_loader,sizeof(nrv_loader));
|
||||||
|
addLoader("IDENTSTR""TMTMAIN1",
|
||||||
|
ft->id ? "TMTCALT1" : "",
|
||||||
|
"TMTMAIN2""UPX1HEAD""TMTCUTPO""+0XXXXXX",
|
||||||
|
getDecompressor(),
|
||||||
|
"TMTMAIN5",
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (ft->id)
|
||||||
|
{
|
||||||
|
assert(ft->calls > 0);
|
||||||
|
addLoader("TMTCALT2",NULL);
|
||||||
|
addFilter32(ft->id);
|
||||||
|
}
|
||||||
|
addLoader("TMTRELOC""RELOC320",
|
||||||
|
big_relocs ? "REL32BIG" : "",
|
||||||
|
"RELOC32J""TMTJUMP1",
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
return getLoaderSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// util
|
// util
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -142,6 +168,8 @@ bool PackTmt::canPack()
|
|||||||
|
|
||||||
void PackTmt::pack(OutputFile *fo)
|
void PackTmt::pack(OutputFile *fo)
|
||||||
{
|
{
|
||||||
|
big_relocs = 0;
|
||||||
|
|
||||||
Packer::handleStub(fi,fo,adam_offset);
|
Packer::handleStub(fi,fo,adam_offset);
|
||||||
|
|
||||||
const unsigned usize = ih.imagesize;
|
const unsigned usize = ih.imagesize;
|
||||||
@@ -166,18 +194,13 @@ void PackTmt::pack(OutputFile *fo)
|
|||||||
checkOverlay(overlay);
|
checkOverlay(overlay);
|
||||||
|
|
||||||
unsigned relocsize = 0;
|
unsigned relocsize = 0;
|
||||||
int big;
|
|
||||||
//if (rsize)
|
//if (rsize)
|
||||||
{
|
{
|
||||||
for (unsigned ic=4; ic<=rsize; ic+=4)
|
for (unsigned ic=4; ic<=rsize; ic+=4)
|
||||||
set_le32(wrkmem+ic,get_le32(wrkmem+ic)-4);
|
set_le32(wrkmem+ic,get_le32(wrkmem+ic)-4);
|
||||||
relocsize = optimizeReloc32(wrkmem+4,rsize/4,wrkmem,ibuf,1,&big)-wrkmem;
|
relocsize = optimizeReloc32(wrkmem+4,rsize/4,wrkmem,ibuf,1,&big_relocs)- wrkmem;
|
||||||
}
|
}
|
||||||
|
|
||||||
// filter
|
|
||||||
Filter ft(opt->level);
|
|
||||||
tryFilters(&ft, ibuf, usize);
|
|
||||||
|
|
||||||
wrkmem[relocsize++] = 0;
|
wrkmem[relocsize++] = 0;
|
||||||
set_le32(wrkmem+relocsize,ih.entry); // save original entry point
|
set_le32(wrkmem+relocsize,ih.entry); // save original entry point
|
||||||
relocsize += 4;
|
relocsize += 4;
|
||||||
@@ -185,38 +208,47 @@ void PackTmt::pack(OutputFile *fo)
|
|||||||
relocsize += 4;
|
relocsize += 4;
|
||||||
memcpy(ibuf+usize,wrkmem,relocsize);
|
memcpy(ibuf+usize,wrkmem,relocsize);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// filter
|
||||||
|
Filter ft(opt->level);
|
||||||
|
tryFilters(&ft, ibuf, usize);
|
||||||
|
buildLoader(&ft);
|
||||||
|
|
||||||
ph.filter = ft.id;
|
ph.filter = ft.id;
|
||||||
ph.filter_cto = ft.cto;
|
ph.filter_cto = ft.cto;
|
||||||
ph.u_len = usize+relocsize;
|
ph.u_len = usize + relocsize;
|
||||||
if (!compress(ibuf,obuf))
|
if (!compress(ibuf,obuf))
|
||||||
throwNotCompressible();
|
throwNotCompressible();
|
||||||
// make sure the decompressor will be paragraph aligned
|
|
||||||
const unsigned overlapoh = ((findOverlapOverhead(obuf,512)+0x20)
|
unsigned overlapoh = findOverlapOverhead(obuf,512);
|
||||||
&~ 0xf) - (ph.u_len & 0xf);
|
|
||||||
|
|
||||||
// verify filter
|
// verify filter
|
||||||
ft.verifyUnfilter();
|
ft.verifyUnfilter();
|
||||||
|
#else
|
||||||
|
// new version using compressWithFilters()
|
||||||
|
|
||||||
// prepare loader
|
// prepare packheader
|
||||||
initLoader(nrv_loader,sizeof(nrv_loader));
|
ph.u_len = usize + relocsize;
|
||||||
addLoader("IDENTSTR""TMTMAIN1",
|
ph.filter = 0;
|
||||||
ft.id ? "TMTCALT1" : "",
|
// prepare filter
|
||||||
"TMTMAIN2""UPX1HEAD""TMTCUTPO""+0XXXXXX",
|
Filter ft(opt->level);
|
||||||
getDecompressor(),
|
ft.buf_len = usize;
|
||||||
"TMTMAIN5",
|
// prepare other settings
|
||||||
NULL
|
const unsigned overlap_range = 512;
|
||||||
);
|
unsigned overlapoh;
|
||||||
if (ft.id)
|
|
||||||
{
|
int strategy = -1; // try the first working filter
|
||||||
assert(ft.calls > 0);
|
if (opt->filter >= 0 && isValidFilter(opt->filter))
|
||||||
addLoader("TMTCALT2",NULL);
|
// try opt->filter or 0 if that fails
|
||||||
addFilter32(ft.id);
|
strategy = -2;
|
||||||
}
|
else if (opt->all_filters)
|
||||||
addLoader("TMTRELOC""RELOC320",
|
// choose best from all available filters
|
||||||
big ? "REL32BIG" : "",
|
strategy = 0;
|
||||||
"RELOC32J""TMTJUMP1",
|
compressWithFilters(&ft, &overlapoh, overlap_range, strategy);
|
||||||
NULL
|
#endif
|
||||||
);
|
|
||||||
|
// make sure the decompressor will be paragraph aligned
|
||||||
|
overlapoh = ((overlapoh + 0x20) &~ 0xf) - (ph.u_len & 0xf);
|
||||||
|
|
||||||
const unsigned lsize = getLoaderSize();
|
const unsigned lsize = getLoaderSize();
|
||||||
MemBuffer loader(lsize);
|
MemBuffer loader(lsize);
|
||||||
|
|||||||
+3
-1
@@ -52,9 +52,11 @@ public:
|
|||||||
virtual int canUnpack();
|
virtual int canUnpack();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool readFileHeader();
|
virtual int buildLoader(const Filter *ft);
|
||||||
|
virtual bool readFileHeader();
|
||||||
|
|
||||||
unsigned adam_offset;
|
unsigned adam_offset;
|
||||||
|
int big_relocs;
|
||||||
|
|
||||||
struct tmt_header_t
|
struct tmt_header_t
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user