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

Introduce Packer::relocateLoader(). This is the first step of finally getting

rid of all Packer::patchXXX() methods.
This commit is contained in:
Markus F.X.J. Oberhumer 2006-11-20 18:10:23 +01:00
parent 141c703ed5
commit a6cb6f57d3
19 changed files with 47 additions and 21 deletions

View File

@ -36,6 +36,7 @@
class ElfLinker : private nocopy
{
friend class Packer;
public:
const N_BELE_RTP::AbstractPolicy *bele;
protected:
@ -86,7 +87,6 @@ public:
virtual int getSection(const char *sname, int *slen=NULL) const;
virtual int getSectionSize(const char *sname) const;
virtual upx_byte *getLoader(int *llen=NULL) const;
virtual void relocate();
virtual void defineSymbol(const char *name, unsigned value);
virtual unsigned getSymbolOffset(const char *) const;
@ -97,6 +97,8 @@ public:
virtual void alignCode(unsigned len) { alignWithByte(len, 0); }
virtual void alignData(unsigned len) { alignWithByte(len, 0); }
protected:
virtual void relocate();
virtual void relocate1(const Relocation *, upx_byte *location,
unsigned value, const char *type);
};

View File

@ -833,7 +833,7 @@ void PackArmPe::pack(OutputFile *fo)
linker->defineSymbol("compressed_length", ph.c_len);
linker->defineSymbol("start_of_compressed", ih.imagebase + s1addr + identsize - identsplit);
defineDecompressorSymbols();
linker->relocate();
relocateLoader();
MemBuffer loader(lsize);
memcpy(loader, getLoader(), lsize);

View File

@ -119,7 +119,7 @@ void PackCom::patchLoader(OutputFile *fo,
linker->defineSymbol("neg_e_len", 0 - e_len);
linker->defineSymbol("NRV2B160", ph.u_len + ph.overlap_overhead);
linker->relocate();
relocateLoader();
loader = getLoader();
// some day we could use the relocation stuff for patchPackHeader too

View File

@ -368,7 +368,7 @@ void PackDjgpp2::pack(OutputFile *fo)
data->size = ALIGN_UP(data->size, 4);
linker->defineSymbol("DJ2MAIN1", coff_hdr.a_entry);
linker->relocate();
relocateLoader();
// prepare loader
MemBuffer loader(lsize);

View File

@ -541,7 +541,7 @@ void PackExe::pack(OutputFile *fo)
oh.ip = device_driver ? getLoaderSection("EXEENTRY") - 2 : 0;
linker->relocate();
relocateLoader();
memcpy(loader, getLoader(), lsize);
patchPackHeader(loader,e_len);

View File

@ -489,7 +489,7 @@ PackLinuxElf32::buildLinuxLoader(
addStubEntrySections(ft);
defineSymbols(ft);
linker->relocate();
relocateLoader();
}
void
@ -537,7 +537,7 @@ PackLinuxElf64::buildLinuxLoader(
addStubEntrySections(ft);
defineSymbols(ft);
linker->relocate();
relocateLoader();
}
void

View File

@ -395,7 +395,7 @@ PackLinuxI386::buildLinuxLoader(
linker->defineSymbol("NMRU", mru - is_pwr2);
}
}
linker->relocate();
relocateLoader();
}
void

View File

@ -132,7 +132,7 @@ PackMachPPC32::buildMachLoader(
addStubEntrySections(ft);
defineSymbols(ft);
linker->relocate();
relocateLoader();
}
void

View File

@ -516,7 +516,7 @@ void PackPs1::pack(OutputFile *fo)
linker->defineSymbol("entry", ih.epc);
linker->defineSymbol("SC",
sa_cnt > (0x10000 << 2) ? sa_cnt >> 5 : sa_cnt >> 2);
linker->relocate();
relocateLoader();
buildPart2 = true;
buildLoader(&ft);
@ -614,7 +614,7 @@ void PackPs1::pack(OutputFile *fo)
- getLoaderSectionStart("cdb.entry.lzma"));
}
linker->relocate();
relocateLoader();
//linker->dumpSymbols();
MemBuffer loader(lsize);
assert(lsize == getLoaderSize());

View File

@ -89,7 +89,7 @@ void PackSys::patchLoader(OutputFile *fo,
linker->defineSymbol("NRV2B160", ph.u_len + ph.overlap_overhead + 1);
linker->defineSymbol("original_strategy", get_le16(ibuf + 6));
linker->relocate();
relocateLoader();
loader = getLoader();
patchPackHeader(loader,e_len);

View File

@ -269,7 +269,7 @@ void PackTmt::pack(OutputFile *fo)
// e_len,d_len,copy_len,copy_to,ph.overlap_overhead,jmp_pos,ph.u_len,ph.c_len);
linker->defineSymbol("TMTCUTPO", ph.u_len + ph.overlap_overhead);
linker->relocate();
relocateLoader();
MemBuffer loader(lsize);
memcpy(loader,getLoader(),lsize);

View File

@ -657,7 +657,7 @@ void PackTos::pack(OutputFile *fo)
linker->defineSymbol("copy_to_stack_len", symbols.copy_to_stack_len);
linker->defineSymbol("clear_dirty_stack_len", symbols.clear_dirty_stack_len);
linker->relocate();
relocateLoader();
//
// write

View File

@ -318,7 +318,7 @@ void PackVmlinuxI386::pack(OutputFile *fo)
linker->defineSymbol("filter_length", ph.u_len); // redefine
}
defineDecompressorSymbols();
linker->relocate();
relocateLoader();
MemBuffer loader(lsize);
memcpy(loader, getLoader(), lsize);

View File

@ -325,7 +325,7 @@ void PackVmlinuzI386::pack(OutputFile *fo)
linker->defineSymbol("src_for_decompressor", zimage_offset + lsize);
linker->defineSymbol("original_entry", physical_start);
linker->defineSymbol("stack_offset", stack_offset_during_uncompression);
linker->relocate();
relocateLoader();
MemBuffer loader(lsize);
memcpy(loader, getLoader(), lsize);
@ -448,7 +448,7 @@ void PackBvmlinuzI386::pack(OutputFile *fo)
defineDecompressorSymbols();
linker->defineSymbol("original_entry", physical_start);
linker->defineSymbol("stack_offset", stack_offset_during_uncompression);
linker->relocate();
relocateLoader();
MemBuffer loader(lsize);
memcpy(loader, getLoader(), lsize);

View File

@ -915,7 +915,7 @@ void PackW32Pe::pack(OutputFile *fo)
linker->defineSymbol("start_of_compressed", esi0 + ih.imagebase);
linker->defineSymbol(isdll ? "PEISDLL1" : "PEMAIN01", upxsection);
linker->relocate();
relocateLoader();
const unsigned lsize = getLoaderSize();
MemBuffer loader(lsize);

View File

@ -555,7 +555,7 @@ void PackWcle::pack(OutputFile *fo)
linker->defineSymbol("copy_dest", ((ic + d_len + 3) &~ 3) - 4);
linker->defineSymbol("copy_source", e_len + jpos * 4 - 4);
linker->relocate();
relocateLoader();
MemBuffer loader(lsize);
memcpy(loader, getLoader(), lsize);

View File

@ -642,11 +642,15 @@ void Packer::updatePackHeader()
}
// FIXME: remove patchPackHeader() and fold into relocateLoader();
// then make linker->relocate() private (friend Packer)
int Packer::patchPackHeader(void *b, int blen)
{
const int size = ph.getPackHeaderSize();
assert(isValidFilter(ph.filter));
const int size = ph.getPackHeaderSize();
if (linker->findSection("UPX1HEAD", false))
assert(size == linker->getSectionSize("UPX1HEAD"));
int boff = find_le32(b, blen, UPX_MAGIC_LE32);
checkPatch(b, blen, boff, size);
@ -1089,6 +1093,26 @@ int Packer::getLoaderSectionStart(const char *name, int *slen) const
}
void Packer::relocateLoader()
{
linker->relocate();
#if 0
// "relocate" packheader
if (linker->findSection("UPX1HEAD", false))
{
int lsize = -1;
int loff = getLoaderSectionStart("UPX1HEAD", &lsize);
assert(lsize == ph.getPackHeaderSize());
unsigned char *p = getLoader() + loff;
assert(get_le32(p) == UPX_MAGIC_LE32);
//patchPackHeader(p, lsize);
ph.putPackHeader(p);
}
#endif
}
/*************************************************************************
// Try compression with several methods and filters, choose the best
/ or first working one. Needs buildLoader().

View File

@ -207,6 +207,7 @@ protected:
// loader core
virtual void buildLoader(const Filter *ft) = 0;
virtual Linker* newLinker() const = 0;
virtual void relocateLoader();
// loader util for linker
virtual upx_byte *getLoader() const;
virtual int getLoaderSize() const;

View File

@ -55,7 +55,6 @@
#include "p_ps1.h"
#include "p_mach.h"
#include "p_armpe.h"
#include "linker.h"
/*************************************************************************