diff --git a/src/p_djgpp2.cpp b/src/p_djgpp2.cpp index ea33594f..41f19f45 100644 --- a/src/p_djgpp2.cpp +++ b/src/p_djgpp2.cpp @@ -300,10 +300,11 @@ void PackDjgpp2::pack(OutputFile *fo) text->size = lsize; // new size of .text data->size = ph.c_len; // new size of .data - if (bss->size < ph.overlap_overhead) // give it a .bss - bss->size = ph.overlap_overhead; - if (ph.method == M_LZMA && bss->size < 0x4000) - bss->size = 0x4000; + unsigned stack = 1024 + ph.overlap_overhead + + patchDecompressorGetExtraStacksize(); + stack = ALIGN_UP(stack, 16); + if (bss->size < stack) // give it a .bss + bss->size = stack; text->scnptr = sizeof(coff_hdr); data->scnptr = text->scnptr + text->size; diff --git a/src/packer.h b/src/packer.h index d5eecac2..83d6817e 100644 --- a/src/packer.h +++ b/src/packer.h @@ -225,6 +225,7 @@ protected: const int *getDefaultCompressionMethods_le32(int method, int level, int small=-1) const; virtual const char *getDecompressorSections() const; virtual void patchDecompressor(void *, int); + virtual unsigned patchDecompressorGetExtraStacksize(); // filter handling [see packer_f.cpp] virtual bool isValidFilter(int filter_id) const; diff --git a/src/packer_c.cpp b/src/packer_c.cpp index 6521990e..0fc8397e 100644 --- a/src/packer_c.cpp +++ b/src/packer_c.cpp @@ -208,6 +208,20 @@ const char *Packer::getDecompressorSections() const } +unsigned Packer::patchDecompressorGetExtraStacksize() +{ + unsigned stack = 0; + if (ph.method == M_LZMA) + { + const lzma_compress_result_t *res = &ph.compress_result.result_lzma; + // FIXME - this is for i386 only + stack = 8 + 4 + ALIGN_UP(2 * res->num_probs, 4); + stack = ALIGN_UP(stack, 16); + } + return stack; +} + + void Packer::patchDecompressor(void *loader, int lsize) { if (ph.method == M_LZMA) @@ -221,8 +235,7 @@ void Packer::patchDecompressor(void *loader, int lsize) patch_le32(loader, lsize, "UPXd", properties); patch_le32(loader, lsize, "UPXc", ph.c_len - 1); patch_le32(loader, lsize, "UPXb", ph.u_len); - unsigned stack = 8 + 4 + ALIGN_UP(2 * res->num_probs, 4); - stack = ALIGN_UP(stack, 16); + unsigned stack = patchDecompressorGetExtraStacksize(); patch_le32(loader, lsize, "UPXa", 0u - stack); } }