mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
Introduced MemBuffer::getSizeForCompression().
This commit is contained in:
parent
c0ba6e13e4
commit
d8748f4270
|
@ -57,6 +57,7 @@ upx$(exeext): $(upx_OBJECTS) $(upx_DEPENDENCIES)
|
|||
$(strip $(CXX) $(call e,CPPFLAGS) $(call e,CXXFLAGS) -o $@ -c $<)
|
||||
|
||||
ifeq ($(USE_GNUC),1)
|
||||
##compress_lzma$(objext) : EXTRA_CXXFLAGS += -O3 -fomit-frame-pointer
|
||||
compress_lzma$(objext) : EXTRA_CXXFLAGS += -Wno-cast-qual
|
||||
compress_lzma$(objext) : EXTRA_CXXFLAGS += -Wno-non-virtual-dtor
|
||||
compress_lzma$(objext) : EXTRA_CXXFLAGS += -Wno-shadow
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
#include "conf.h"
|
||||
#include "compress.h"
|
||||
#include "mem.h"
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
|
@ -75,12 +76,16 @@ int upx_compress ( const upx_bytep src, upx_uint src_len,
|
|||
upx_compress_result_t result_buffer;
|
||||
|
||||
assert(level > 0);
|
||||
|
||||
// set available bytes in dst
|
||||
if (*dst_len == 0)
|
||||
*dst_len = MemBuffer::getSizeForCompression(src_len);
|
||||
|
||||
if (!result)
|
||||
result = &result_buffer;
|
||||
|
||||
memset(result, 0, sizeof(*result));
|
||||
// assume no info available - fill in worst case results
|
||||
upx_uint *res = result->result_ucl.result;
|
||||
ucl_uint *res = result->result_ucl.result;
|
||||
//res[0] = 1; // min_offset_found - NOT USED
|
||||
res[1] = src_len - 1; // max_offset_found
|
||||
//res[2] = 2; // min_match_found - NOT USED
|
||||
|
|
|
@ -43,8 +43,9 @@ int compress_lzma_dummy = 0;
|
|||
#undef _WIN32
|
||||
#undef _WIN32_WCE
|
||||
#undef COMPRESS_MF_MT
|
||||
#undef _NO_EXCEPTIONS
|
||||
#include "C/Common/MyInitGuid.h"
|
||||
#include "C/7zip/Compress/LZMA/LZMADecoder.h"
|
||||
//#include "C/7zip/Compress/LZMA/LZMADecoder.h"
|
||||
#include "C/7zip/Compress/LZMA/LZMAEncoder.h"
|
||||
|
||||
namespace MyLzma {
|
||||
|
@ -131,14 +132,15 @@ int upx_lzma_compress ( const upx_bytep src, upx_uint src_len,
|
|||
MyLzma::InStreamRam is; is.AddRef();
|
||||
MyLzma::OutStreamRam os; os.AddRef();
|
||||
is.Init(src, src_len);
|
||||
// os.Init(dst, *dst_len);
|
||||
os.Init(dst, src_len);
|
||||
os.Init(dst, *dst_len);
|
||||
|
||||
MyLzma::ProgressInfo progress; progress.AddRef();
|
||||
progress.cb = cb;
|
||||
|
||||
#ifndef _NO_EXCEPTIONS
|
||||
try {
|
||||
#else
|
||||
#error
|
||||
#endif
|
||||
|
||||
NCompress::NLZMA::CEncoder enc;
|
||||
|
@ -159,12 +161,42 @@ int upx_lzma_compress ( const upx_bytep src, upx_uint src_len,
|
|||
pr[0].uintVal = 2;
|
||||
pr[1].uintVal = 0;
|
||||
pr[2].uintVal = 3;
|
||||
pr[3].uintVal = src_len;
|
||||
pr[3].uintVal = 1024 * 1024;
|
||||
pr[4].uintVal = 2;
|
||||
pr[5].uintVal = 64;
|
||||
pr[6].uintVal = 0;
|
||||
|
||||
// FIXME: tune these according to level
|
||||
// FIXME: tune these settings according to level
|
||||
switch (level)
|
||||
{
|
||||
case 1:
|
||||
pr[3].uintVal = 256 * 1024;
|
||||
pr[4].uintVal = 0;
|
||||
break;
|
||||
case 2:
|
||||
break;
|
||||
case 3:
|
||||
break;
|
||||
case 4:
|
||||
break;
|
||||
case 5:
|
||||
break;
|
||||
case 6:
|
||||
break;
|
||||
case 7:
|
||||
break;
|
||||
case 8:
|
||||
break;
|
||||
case 9:
|
||||
pr[3].uintVal = 8 * 1024 * 1024;
|
||||
break;
|
||||
case 10:
|
||||
pr[3].uintVal = src_len;
|
||||
break;
|
||||
default:
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (pr[3].uintVal > src_len)
|
||||
pr[3].uintVal = src_len;
|
||||
|
||||
|
@ -189,6 +221,10 @@ int upx_lzma_compress ( const upx_bytep src, upx_uint src_len,
|
|||
else if (rh == S_OK)
|
||||
r = UPX_E_OK;
|
||||
|
||||
res->pos_bits = pr[0].uintVal;
|
||||
res->lit_pos_bits = pr[1].uintVal;
|
||||
res->lit_context_bits = pr[2].uintVal;
|
||||
res->dict_size = pr[3].uintVal;
|
||||
//res->num_probs = LzmaGetNumProbs(&s.Properties));
|
||||
//res->num_probs = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((Properties)->lc + (Properties)->lp)))
|
||||
res->num_probs = 1846 + (768 << (pr[2].uintVal + pr[1].uintVal));
|
||||
|
|
|
@ -205,11 +205,15 @@ struct upx_callback_t
|
|||
|
||||
struct lzma_compress_config_t
|
||||
{
|
||||
#if 0
|
||||
unsigned pos_bits;
|
||||
unsigned lit_pos_bits;
|
||||
unsigned lit_context_bits;
|
||||
unsigned dict_size;
|
||||
unsigned mf_passes;
|
||||
#else
|
||||
unsigned dummy;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define upx_compress_config_p upx_compress_config_t *
|
||||
|
@ -225,12 +229,13 @@ struct lzma_compress_result_t
|
|||
unsigned pos_bits;
|
||||
unsigned lit_pos_bits;
|
||||
unsigned lit_context_bits;
|
||||
unsigned dict_size;
|
||||
unsigned num_probs;
|
||||
};
|
||||
|
||||
struct ucl_compress_result_t
|
||||
{
|
||||
upx_uint result[16];
|
||||
ucl_uint result[16];
|
||||
};
|
||||
|
||||
struct upx_compress_result_t
|
||||
|
|
21
src/mem.cpp
21
src/mem.cpp
|
@ -101,16 +101,15 @@ void MemBuffer::dealloc()
|
|||
}
|
||||
|
||||
|
||||
void MemBuffer::allocForCompression(unsigned uncompressed_size, unsigned extra)
|
||||
unsigned MemBuffer::getSizeForCompression(unsigned uncompressed_size, unsigned extra)
|
||||
{
|
||||
assert((int)uncompressed_size > 0);
|
||||
assert((int)extra >= 0);
|
||||
unsigned size = uncompressed_size + uncompressed_size/8 + 256 + extra;
|
||||
alloc(size);
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
void MemBuffer::allocForUncompression(unsigned uncompressed_size, unsigned extra)
|
||||
unsigned MemBuffer::getSizeForUncompression(unsigned uncompressed_size, unsigned extra)
|
||||
{
|
||||
assert((int)uncompressed_size > 0);
|
||||
assert((int)extra >= 0);
|
||||
|
@ -120,6 +119,20 @@ void MemBuffer::allocForUncompression(unsigned uncompressed_size, unsigned extra
|
|||
#if (ACC_ARCH_I386)
|
||||
size += 3;
|
||||
#endif
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
void MemBuffer::allocForCompression(unsigned uncompressed_size, unsigned extra)
|
||||
{
|
||||
unsigned size = getSizeForCompression(uncompressed_size, extra);
|
||||
alloc(size);
|
||||
}
|
||||
|
||||
|
||||
void MemBuffer::allocForUncompression(unsigned uncompressed_size, unsigned extra)
|
||||
{
|
||||
unsigned size = getSizeForUncompression(uncompressed_size, extra);
|
||||
alloc(size);
|
||||
}
|
||||
|
||||
|
|
|
@ -41,6 +41,9 @@ public:
|
|||
MemBuffer(unsigned size);
|
||||
~MemBuffer();
|
||||
|
||||
static unsigned getSizeForCompression(unsigned uncompressed_size, unsigned extra=0);
|
||||
static unsigned getSizeForUncompression(unsigned uncompressed_size, unsigned extra=0);
|
||||
|
||||
void alloc(unsigned size);
|
||||
void allocForCompression(unsigned uncompressed_size, unsigned extra=0);
|
||||
void allocForUncompression(unsigned uncompressed_size, unsigned extra=0);
|
||||
|
|
|
@ -313,7 +313,7 @@ PackLinuxElf32x86::buildLinuxLoader(
|
|||
|
||||
unsigned char *const cprLoader = new unsigned char[sizeof(h) + h.sz_unc];
|
||||
if (0 < szfold) {
|
||||
unsigned sz_cpr;
|
||||
unsigned sz_cpr = 0;
|
||||
int r = upx_compress(uncLoader, h.sz_unc, sizeof(h) + cprLoader, &sz_cpr,
|
||||
NULL, ph.method, 10, NULL, NULL );
|
||||
if (r != UPX_E_OK || h.sz_cpr >= h.sz_unc)
|
||||
|
@ -446,6 +446,7 @@ PackLinuxElf32::buildLinuxLoader(
|
|||
|
||||
unsigned char *const cprLoader = new unsigned char[sizeof(h) + sz_unc];
|
||||
if (0 < szfold) {
|
||||
sz_cpr = 0;
|
||||
int r = upx_compress(uncLoader, sz_unc, sizeof(h) + cprLoader, &sz_cpr,
|
||||
NULL, ph.method, 10, NULL, NULL );
|
||||
set_native32(&h.sz_cpr, sz_cpr);
|
||||
|
@ -503,6 +504,7 @@ PackLinuxElf64::buildLinuxLoader(
|
|||
|
||||
unsigned char *const cprLoader = new unsigned char[sizeof(h) + sz_unc];
|
||||
if (0 < szfold) {
|
||||
sz_cpr = 0;
|
||||
int r = upx_compress(uncLoader, sz_unc, sizeof(h) + cprLoader, &sz_cpr,
|
||||
NULL, ph.method, 10, NULL, NULL );
|
||||
set_native32(&h.sz_cpr, sz_cpr);
|
||||
|
|
|
@ -88,7 +88,7 @@ PackMachPPC32::buildMachLoader(
|
|||
|
||||
unsigned char *const cprLoader = new unsigned char[sizeof(h) + h.sz_unc];
|
||||
if (0 < szfold) {
|
||||
unsigned sz_cpr;
|
||||
unsigned sz_cpr = 0;
|
||||
int r = upx_compress(uncLoader, h.sz_unc, sizeof(h) + cprLoader, &sz_cpr,
|
||||
NULL, ph.method, 10, NULL, NULL );
|
||||
h.sz_cpr = sz_cpr;
|
||||
|
|
|
@ -372,7 +372,7 @@ void PackUnix::packExtent(
|
|||
// write block sizes
|
||||
b_info tmp;
|
||||
if (hdr_u_len) {
|
||||
unsigned hdr_c_len;
|
||||
unsigned hdr_c_len = 0;
|
||||
MemBuffer hdr_obuf;
|
||||
hdr_obuf.allocForCompression(hdr_u_len);
|
||||
int r = upx_compress(hdr_ibuf, hdr_u_len, hdr_obuf, &hdr_c_len, 0,
|
||||
|
|
Loading…
Reference in New Issue
Block a user