mirror of
https://github.com/upx/upx
synced 2025-10-26 23:36:41 +08:00
total_in, total_out move to PackUnix
modified: p_lx_elf.cpp modified: p_lx_elf.h modified: p_lx_interp.cpp modified: p_mach.cpp modified: p_unix.cpp modified: p_unix.h
This commit is contained in:
committed by
Markus F.X.J. Oberhumer
parent
6be3e747ca
commit
fb844a8ed1
@@ -402,14 +402,14 @@ off_t PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
|
||||
set_te32(&elfout.phdr[C_TEXT].p_filesz, v_hole);
|
||||
set_te32(&elfout.phdr[C_TEXT].p_memsz, v_hole);
|
||||
// Then compressed gaps (including debuginfo.)
|
||||
unsigned total_in = 0, total_out = 0;
|
||||
total_in = 0; total_out = 0;
|
||||
for (unsigned k = 0; k < e_phnum; ++k) {
|
||||
Extent x;
|
||||
x.size = find_LOAD_gap(phdri, k, e_phnum);
|
||||
if (x.size) {
|
||||
x.offset = get_te32(&phdri[k].p_offset) +
|
||||
get_te32(&phdri[k].p_filesz);
|
||||
packExtent(x, total_in, total_out, nullptr, fo);
|
||||
packExtent(x, nullptr, fo);
|
||||
}
|
||||
}
|
||||
// write block end marker (uncompressed size 0)
|
||||
@@ -526,14 +526,14 @@ off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
|
||||
set_te64(&elfout.phdr[C_TEXT].p_filesz, v_hole);
|
||||
set_te64(&elfout.phdr[C_TEXT].p_memsz, v_hole);
|
||||
// Then compressed gaps (including debuginfo.)
|
||||
unsigned total_in = 0, total_out = 0;
|
||||
total_in = 0; total_out = 0;
|
||||
for (unsigned k = 0; k < e_phnum; ++k) {
|
||||
Extent x;
|
||||
x.size = find_LOAD_gap(phdri, k, e_phnum);
|
||||
if (x.size) {
|
||||
x.offset = get_te64(&phdri[k].p_offset) +
|
||||
get_te64(&phdri[k].p_filesz);
|
||||
packExtent(x, total_in, total_out, nullptr, fo);
|
||||
packExtent(x, nullptr, fo);
|
||||
}
|
||||
}
|
||||
// write block end marker (uncompressed size 0)
|
||||
@@ -4045,8 +4045,8 @@ int PackLinuxElf32::pack2(OutputFile *fo, Filter &ft)
|
||||
// compress extents
|
||||
unsigned hdr_u_len = (is_shlib ? xct_off : (sizeof(Elf32_Ehdr) + sz_phdrs));
|
||||
|
||||
unsigned total_in = (is_shlib ? 0 : xct_off);
|
||||
unsigned total_out = (is_shlib ? sz_elf_hdrs : xct_off);
|
||||
total_in = (is_shlib ? 0 : xct_off);
|
||||
total_out = (is_shlib ? sz_elf_hdrs : xct_off);
|
||||
|
||||
uip->ui_pass = 0;
|
||||
ft.addvalue = 0;
|
||||
@@ -4089,7 +4089,7 @@ int PackLinuxElf32::pack2(OutputFile *fo, Filter &ft)
|
||||
// throw NotCompressible for small .data Extents, which PowerPC
|
||||
// sometimes marks as PF_X anyway. So filter only first segment.
|
||||
if (k == nk_f || !is_shlib) {
|
||||
packExtent(x, total_in, total_out,
|
||||
packExtent(x,
|
||||
(k==nk_f ? &ft : nullptr ), fo, hdr_u_len);
|
||||
}
|
||||
else {
|
||||
@@ -4176,8 +4176,8 @@ int PackLinuxElf64::pack2(OutputFile *fo, Filter &ft)
|
||||
// compress extents
|
||||
unsigned hdr_u_len = (is_shlib ? xct_off : (sizeof(Elf64_Ehdr) + sz_phdrs));
|
||||
|
||||
unsigned total_in = (is_shlib ? 0 : xct_off);
|
||||
unsigned total_out = (is_shlib ? sz_elf_hdrs : xct_off);
|
||||
total_in = (is_shlib ? 0 : xct_off);
|
||||
total_out = (is_shlib ? sz_elf_hdrs : xct_off);
|
||||
|
||||
uip->ui_pass = 0;
|
||||
ft.addvalue = 0;
|
||||
@@ -4220,7 +4220,7 @@ int PackLinuxElf64::pack2(OutputFile *fo, Filter &ft)
|
||||
// throw NotCompressible for small .data Extents, which PowerPC
|
||||
// sometimes marks as PF_X anyway. So filter only first segment.
|
||||
if (k == nk_f || !is_shlib) {
|
||||
packExtent(x, total_in, total_out,
|
||||
packExtent(x,
|
||||
(k==nk_f ? &ft : nullptr ), fo, hdr_u_len);
|
||||
}
|
||||
else {
|
||||
@@ -4573,8 +4573,8 @@ void PackLinuxElf64::unpack(OutputFile *fo)
|
||||
throwCantUnpack("bad e_phoff");
|
||||
}
|
||||
unsigned const c_phnum = get_te16(&ehdri.e_phnum);
|
||||
upx_uint64_t old_data_off = 0;
|
||||
upx_uint64_t old_data_len = 0;
|
||||
old_data_off = 0;
|
||||
old_data_len = 0;
|
||||
upx_uint64_t old_dtinit = 0;
|
||||
unsigned is_asl = 0; // is Android Shared Library
|
||||
|
||||
@@ -4633,8 +4633,8 @@ void PackLinuxElf64::unpack(OutputFile *fo)
|
||||
fi->seek(- (off_t) (szb_info + ph.c_len), SEEK_CUR);
|
||||
|
||||
unsigned const u_phnum = get_te16(&ehdr->e_phnum);
|
||||
unsigned total_in = 0;
|
||||
unsigned total_out = 0;
|
||||
total_in = 0;
|
||||
total_out = 0;
|
||||
unsigned c_adler = upx_adler32(nullptr, 0);
|
||||
unsigned u_adler = upx_adler32(nullptr, 0);
|
||||
#define MAX_ELF_HDR 1024
|
||||
@@ -4650,7 +4650,7 @@ void PackLinuxElf64::unpack(OutputFile *fo)
|
||||
if (is_shlib) {
|
||||
// Unpack and output the Ehdr and Phdrs for real.
|
||||
// This depends on position within input file fi.
|
||||
unpackExtent(ph.u_len, fo, total_in, total_out,
|
||||
unpackExtent(ph.u_len, fo,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
|
||||
// The first PT_LOAD. Part is not compressed (for benefit of rtld.)
|
||||
@@ -4730,7 +4730,7 @@ void PackLinuxElf64::unpack(OutputFile *fo)
|
||||
break;
|
||||
}
|
||||
}
|
||||
unpackExtent(ph.u_len, fo, total_in, total_out,
|
||||
unpackExtent(ph.u_len, fo,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
}
|
||||
else { // main executable
|
||||
@@ -4744,12 +4744,12 @@ void PackLinuxElf64::unpack(OutputFile *fo)
|
||||
if (fo)
|
||||
fo->seek(offset, SEEK_SET);
|
||||
if (Elf64_Phdr::PF_X & get_te32(&phdr->p_flags)) {
|
||||
unpackExtent(filesz, fo, total_in, total_out,
|
||||
unpackExtent(filesz, fo,
|
||||
c_adler, u_adler, first_PF_X, szb_info);
|
||||
first_PF_X = false;
|
||||
}
|
||||
else {
|
||||
unpackExtent(filesz, fo, total_in, total_out,
|
||||
unpackExtent(filesz, fo,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
}
|
||||
}
|
||||
@@ -4798,7 +4798,7 @@ void PackLinuxElf64::unpack(OutputFile *fo)
|
||||
get_te64(&phdr[j].p_filesz);
|
||||
if (fo)
|
||||
fo->seek(where, SEEK_SET);
|
||||
unpackExtent(size, fo, total_in, total_out,
|
||||
unpackExtent(size, fo,
|
||||
c_adler, u_adler, false, szb_info,
|
||||
(phdr[j].p_offset != hi_offset));
|
||||
}
|
||||
@@ -5666,8 +5666,8 @@ void PackLinuxElf32::unpack(OutputFile *fo)
|
||||
throwCantUnpack("bad e_phoff");
|
||||
}
|
||||
unsigned const c_phnum = get_te16(&ehdri.e_phnum);
|
||||
unsigned old_data_off = 0;
|
||||
unsigned old_data_len = 0;
|
||||
old_data_off = 0;
|
||||
old_data_len = 0;
|
||||
unsigned old_dtinit = 0;
|
||||
unsigned is_asl = 0; // is Android Shared Library
|
||||
|
||||
@@ -5727,8 +5727,8 @@ void PackLinuxElf32::unpack(OutputFile *fo)
|
||||
fi->seek(- (off_t) (szb_info + ph.c_len), SEEK_CUR);
|
||||
|
||||
unsigned const u_phnum = get_te16(&ehdr->e_phnum);
|
||||
unsigned total_in = 0;
|
||||
unsigned total_out = 0;
|
||||
total_in = 0;
|
||||
total_out = 0;
|
||||
unsigned c_adler = upx_adler32(nullptr, 0);
|
||||
unsigned u_adler = upx_adler32(nullptr, 0);
|
||||
#define MAX_ELF_HDR 512
|
||||
@@ -5744,7 +5744,7 @@ void PackLinuxElf32::unpack(OutputFile *fo)
|
||||
if (is_shlib) {
|
||||
// Unpack and output the Ehdr and Phdrs for real.
|
||||
// This depends on position within input file fi.
|
||||
unpackExtent(ph.u_len, fo, total_in, total_out,
|
||||
unpackExtent(ph.u_len, fo,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
|
||||
// The first PT_LOAD. Part is not compressed (for benefit of rtld.)
|
||||
@@ -5824,7 +5824,7 @@ void PackLinuxElf32::unpack(OutputFile *fo)
|
||||
break;
|
||||
}
|
||||
}
|
||||
unpackExtent(ph.u_len, fo, total_in, total_out,
|
||||
unpackExtent(ph.u_len, fo,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
}
|
||||
else { // main executable
|
||||
@@ -5838,12 +5838,12 @@ void PackLinuxElf32::unpack(OutputFile *fo)
|
||||
if (fo)
|
||||
fo->seek(offset, SEEK_SET);
|
||||
if (Elf32_Phdr::PF_X & get_te32(&phdr->p_flags)) {
|
||||
unpackExtent(filesz, fo, total_in, total_out,
|
||||
unpackExtent(filesz, fo,
|
||||
c_adler, u_adler, first_PF_X, szb_info);
|
||||
first_PF_X = false;
|
||||
}
|
||||
else {
|
||||
unpackExtent(filesz, fo, total_in, total_out,
|
||||
unpackExtent(filesz, fo,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
}
|
||||
}
|
||||
@@ -5892,7 +5892,7 @@ void PackLinuxElf32::unpack(OutputFile *fo)
|
||||
get_te32(&phdr[j].p_filesz);
|
||||
if (fo)
|
||||
fo->seek(where, SEEK_SET);
|
||||
unpackExtent(size, fo, total_in, total_out,
|
||||
unpackExtent(size, fo,
|
||||
c_adler, u_adler, false, szb_info,
|
||||
(phdr[j].p_offset != hi_offset));
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ protected:
|
||||
virtual void defineSymbols(Filter const *);
|
||||
virtual void addStubEntrySections(Filter const *);
|
||||
virtual void unpack(OutputFile *fo);
|
||||
unsigned old_data_off, old_data_len; // un_shlib
|
||||
|
||||
virtual upx_uint64_t elf_unsigned_dynamic(unsigned) const = 0;
|
||||
static unsigned elf_hash(char const *) /*const*/;
|
||||
@@ -268,6 +269,22 @@ protected:
|
||||
virtual off_t pack3(OutputFile *, Filter &); // append loader
|
||||
virtual void pack4(OutputFile *, Filter &); // append pack header
|
||||
virtual void unpack(OutputFile *fo);
|
||||
virtual void un_shlib_1(
|
||||
OutputFile *const fo,
|
||||
unsigned &c_adler,
|
||||
unsigned &u_adler,
|
||||
Elf64_Ehdr const *ehdr,
|
||||
Elf64_Phdr const *const dynhdr,
|
||||
unsigned const orig_file_size,
|
||||
unsigned const szb_info
|
||||
);
|
||||
virtual void un_DT_INIT(
|
||||
Elf64_Phdr const *phdr,
|
||||
unsigned u_phnum,
|
||||
unsigned old_dtinit,
|
||||
OutputFile *fo,
|
||||
unsigned is_asl
|
||||
);
|
||||
virtual void unRela64(upx_uint64_t dt_rela, Elf64_Rela *rela0, unsigned relasz,
|
||||
MemBuffer &membuf, upx_uint64_t const load_off, upx_uint64_t const old_dtinit,
|
||||
OutputFile *fo);
|
||||
|
||||
@@ -234,8 +234,8 @@ void PackLinuxElf32x86interp::unpack(OutputFile *fo)
|
||||
fi->readx(ibuf, ph.c_len);
|
||||
decompress(ibuf, (upx_byte *)ehdr, false);
|
||||
|
||||
unsigned total_in = 0;
|
||||
unsigned total_out = 0;
|
||||
total_in = 0;
|
||||
total_out = 0;
|
||||
unsigned c_adler = upx_adler32(nullptr, 0);
|
||||
unsigned u_adler = upx_adler32(nullptr, 0);
|
||||
off_t ptload0hi=0, ptload1lo=0, ptload1sz=0;
|
||||
@@ -255,12 +255,12 @@ void PackLinuxElf32x86interp::unpack(OutputFile *fo)
|
||||
if (fo)
|
||||
fo->seek(phdr->p_offset, SEEK_SET);
|
||||
if (Elf32_Phdr::PF_X & phdr->p_flags) {
|
||||
unpackExtent(phdr->p_filesz, fo, total_in, total_out,
|
||||
unpackExtent(phdr->p_filesz, fo,
|
||||
c_adler, u_adler, first_PF_X, szb_info);
|
||||
first_PF_X = false;
|
||||
}
|
||||
else {
|
||||
unpackExtent(phdr->p_filesz, fo, total_in, total_out,
|
||||
unpackExtent(phdr->p_filesz, fo,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
}
|
||||
}
|
||||
@@ -269,13 +269,13 @@ void PackLinuxElf32x86interp::unpack(OutputFile *fo)
|
||||
if (0!=ptload1sz && ptload0hi < ptload1lo) { // alignment hole?
|
||||
if (fo)
|
||||
fo->seek(ptload0hi, SEEK_SET);
|
||||
unpackExtent(ptload1lo - ptload0hi, fo, total_in, total_out,
|
||||
unpackExtent(ptload1lo - ptload0hi, fo,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
}
|
||||
if (total_out != orig_file_size) { // non-PT_LOAD stuff
|
||||
if (fo)
|
||||
fo->seek(0, SEEK_END);
|
||||
unpackExtent(orig_file_size - total_out, fo, total_in, total_out,
|
||||
unpackExtent(orig_file_size - total_out, fo,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
}
|
||||
|
||||
|
||||
@@ -1055,8 +1055,8 @@ int PackMachBase<T>::pack2(OutputFile *fo, Filter &ft) // append compressed bo
|
||||
}
|
||||
|
||||
// compress extents
|
||||
unsigned total_in = 0;
|
||||
unsigned total_out = 0;
|
||||
total_in = 0;
|
||||
total_out = 0;
|
||||
|
||||
unsigned hdr_u_len = mhdri.sizeofcmds + sizeof(mhdri);
|
||||
|
||||
@@ -1098,7 +1098,7 @@ int PackMachBase<T>::pack2(OutputFile *fo, Filter &ft) // append compressed bo
|
||||
}
|
||||
ptr = (Mach_segment_command const *)(ptr->cmdsize + (char const *)ptr);
|
||||
}
|
||||
packExtent(x, total_in, total_out,
|
||||
packExtent(x,
|
||||
(do_filter ? &ft : nullptr), fo, hdr_u_len, b_extra );
|
||||
if (do_filter) {
|
||||
exe_filesize_max = 0;
|
||||
@@ -1114,7 +1114,7 @@ int PackMachBase<T>::pack2(OutputFile *fo, Filter &ft) // append compressed bo
|
||||
x.size = find_SEGMENT_gap(k, fi->st_size());
|
||||
if (x.size) {
|
||||
x.offset = msegcmd[k].fileoff +msegcmd[k].filesize;
|
||||
packExtent(x, total_in, total_out, nullptr, fo);
|
||||
packExtent(x, nullptr, fo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1454,8 +1454,8 @@ void PackMachBase<T>::unpack(OutputFile *fo)
|
||||
n_segment += (lc_seg==msegcmd[j].cmd);
|
||||
}
|
||||
|
||||
unsigned total_in = 0;
|
||||
unsigned total_out = 0;
|
||||
total_in = 0;
|
||||
total_out = 0;
|
||||
unsigned c_adler = upx_adler32(nullptr, 0);
|
||||
unsigned u_adler = upx_adler32(nullptr, 0);
|
||||
|
||||
@@ -1467,7 +1467,7 @@ void PackMachBase<T>::unpack(OutputFile *fo)
|
||||
}
|
||||
if (fo)
|
||||
fo->seek(msegcmd[k].fileoff, SEEK_SET);
|
||||
unpackExtent(msegcmd[k].filesize, fo, total_in, total_out,
|
||||
unpackExtent(msegcmd[k].filesize, fo,
|
||||
c_adler, u_adler, false, sizeof(bhdr));
|
||||
if (my_filetype==Mach_header::MH_DYLIB) {
|
||||
break; // only the first lc_seg when MH_DYLIB
|
||||
@@ -1515,7 +1515,7 @@ void PackMachBase<T>::unpack(OutputFile *fo)
|
||||
unsigned const where = msegcmd[j].fileoff +msegcmd[j].filesize;
|
||||
if (fo)
|
||||
fo->seek(where, SEEK_SET);
|
||||
unpackExtent(size, fo, total_in, total_out,
|
||||
unpackExtent(size, fo,
|
||||
c_adler, u_adler, false, sizeof(bhdr));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,8 +137,8 @@ int PackUnix::getStrategy(Filter &/*ft*/)
|
||||
int PackUnix::pack2(OutputFile *fo, Filter &ft)
|
||||
{
|
||||
// compress blocks
|
||||
unsigned total_in = 0;
|
||||
unsigned total_out = 0;
|
||||
total_in = 0;
|
||||
total_out = 0;
|
||||
|
||||
// FIXME: ui_total_passes is not correct with multiple blocks...
|
||||
// ui_total_passes = (file_size + blocksize - 1) / blocksize;
|
||||
@@ -318,8 +318,6 @@ void PackUnix::pack(OutputFile *fo)
|
||||
|
||||
void PackUnix::packExtent(
|
||||
const Extent &x,
|
||||
unsigned &total_in,
|
||||
unsigned &total_out,
|
||||
Filter *ft,
|
||||
OutputFile *fo,
|
||||
unsigned hdr_u_len,
|
||||
@@ -450,7 +448,6 @@ void PackUnix::packExtent(
|
||||
}
|
||||
|
||||
void PackUnix::unpackExtent(unsigned wanted, OutputFile *fo,
|
||||
unsigned &total_in, unsigned &total_out,
|
||||
unsigned &c_adler, unsigned &u_adler,
|
||||
bool first_PF_X, unsigned szb_info, bool is_rewrite
|
||||
)
|
||||
@@ -602,8 +599,8 @@ void PackUnix::unpack(OutputFile *fo)
|
||||
ibuf.alloc(blocksize + OVERHEAD);
|
||||
|
||||
// decompress blocks
|
||||
unsigned total_in = 0;
|
||||
unsigned total_out = 0;
|
||||
total_in = 0;
|
||||
total_out = 0;
|
||||
memset(&bhdr, 0, sizeof(bhdr));
|
||||
for (;;)
|
||||
{
|
||||
|
||||
@@ -73,12 +73,12 @@ protected:
|
||||
off_t size;
|
||||
};
|
||||
virtual void packExtent(const Extent &x,
|
||||
unsigned &total_in, unsigned &total_out, Filter *, OutputFile *,
|
||||
Filter *, OutputFile *,
|
||||
unsigned hdr_len = 0, unsigned b_extra = 0);
|
||||
virtual void unpackExtent(unsigned wanted, OutputFile *fo,
|
||||
unsigned &total_in, unsigned &total_out,
|
||||
unsigned &c_adler, unsigned &u_adler,
|
||||
bool first_PF_X, unsigned szb_info, bool is_rewrite = false);
|
||||
unsigned total_in, total_out; // unpack
|
||||
|
||||
int exetype;
|
||||
unsigned blocksize;
|
||||
|
||||
Reference in New Issue
Block a user