Implemented compressWithFilters().

committer: mfx <mfx> 978180632 +0000
This commit is contained in:
Markus F.X.J. Oberhumer
2000-12-30 12:50:32 +00:00
parent dc22e6f158
commit a9249c6335
2 changed files with 65 additions and 31 deletions
+62 -30
View File
@@ -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
View File
@@ -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
{ {