diff --git a/src/linker.h b/src/linker.h index 2d3ae6c4..73554210 100644 --- a/src/linker.h +++ b/src/linker.h @@ -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); }; diff --git a/src/p_armpe.cpp b/src/p_armpe.cpp index 6f67b086..013e61c8 100644 --- a/src/p_armpe.cpp +++ b/src/p_armpe.cpp @@ -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); diff --git a/src/p_com.cpp b/src/p_com.cpp index 2b8fc6f0..a931971f 100644 --- a/src/p_com.cpp +++ b/src/p_com.cpp @@ -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 diff --git a/src/p_djgpp2.cpp b/src/p_djgpp2.cpp index 08a410bd..7c00f244 100644 --- a/src/p_djgpp2.cpp +++ b/src/p_djgpp2.cpp @@ -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); diff --git a/src/p_exe.cpp b/src/p_exe.cpp index 9d712ff5..27c1ba5e 100644 --- a/src/p_exe.cpp +++ b/src/p_exe.cpp @@ -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); diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index 7f8206eb..ebb7412e 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -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 diff --git a/src/p_lx_exc.cpp b/src/p_lx_exc.cpp index a6a86565..3e321b52 100644 --- a/src/p_lx_exc.cpp +++ b/src/p_lx_exc.cpp @@ -395,7 +395,7 @@ PackLinuxI386::buildLinuxLoader( linker->defineSymbol("NMRU", mru - is_pwr2); } } - linker->relocate(); + relocateLoader(); } void diff --git a/src/p_mach.cpp b/src/p_mach.cpp index cefd9ade..0e35123a 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -132,7 +132,7 @@ PackMachPPC32::buildMachLoader( addStubEntrySections(ft); defineSymbols(ft); - linker->relocate(); + relocateLoader(); } void diff --git a/src/p_ps1.cpp b/src/p_ps1.cpp index 1b385eac..7b2b5216 100644 --- a/src/p_ps1.cpp +++ b/src/p_ps1.cpp @@ -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()); diff --git a/src/p_sys.cpp b/src/p_sys.cpp index b65f8e94..99d73709 100644 --- a/src/p_sys.cpp +++ b/src/p_sys.cpp @@ -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); diff --git a/src/p_tmt.cpp b/src/p_tmt.cpp index 53bc5de0..430d32c9 100644 --- a/src/p_tmt.cpp +++ b/src/p_tmt.cpp @@ -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); diff --git a/src/p_tos.cpp b/src/p_tos.cpp index 66010091..652dcd34 100644 --- a/src/p_tos.cpp +++ b/src/p_tos.cpp @@ -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 diff --git a/src/p_vmlinx.cpp b/src/p_vmlinx.cpp index 528dd8dc..1c889812 100644 --- a/src/p_vmlinx.cpp +++ b/src/p_vmlinx.cpp @@ -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); diff --git a/src/p_vmlinz.cpp b/src/p_vmlinz.cpp index e2e18a38..1d679dfe 100644 --- a/src/p_vmlinz.cpp +++ b/src/p_vmlinz.cpp @@ -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); diff --git a/src/p_w32pe.cpp b/src/p_w32pe.cpp index 37022f2e..26cd2fd2 100644 --- a/src/p_w32pe.cpp +++ b/src/p_w32pe.cpp @@ -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); diff --git a/src/p_wcle.cpp b/src/p_wcle.cpp index 365cf71d..79735af0 100644 --- a/src/p_wcle.cpp +++ b/src/p_wcle.cpp @@ -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); diff --git a/src/packer.cpp b/src/packer.cpp index f9ffd70b..cb8d1ca1 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -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(). diff --git a/src/packer.h b/src/packer.h index fa0c404d..672a1f7a 100644 --- a/src/packer.h +++ b/src/packer.h @@ -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; diff --git a/src/packmast.cpp b/src/packmast.cpp index 213d8ceb..aa5d7674 100644 --- a/src/packmast.cpp +++ b/src/packmast.cpp @@ -55,7 +55,6 @@ #include "p_ps1.h" #include "p_mach.h" #include "p_armpe.h" -#include "linker.h" /*************************************************************************