PE: Remove empty non-compressed section
This commit is contained in:
committed by
Markus F.X.J. Oberhumer
parent
222471744f
commit
7f1f29b0d8
+14
-7
@@ -2459,7 +2459,9 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh,
|
|||||||
getLoaderSection("UPX1HEAD",(int*)&ic);
|
getLoaderSection("UPX1HEAD",(int*)&ic);
|
||||||
identsize += ic;
|
identsize += ic;
|
||||||
|
|
||||||
const unsigned oobjs = last_section_rsrc_only ? 4 : 3;
|
const bool has_oxrelocs = !opt->win32_pe.strip_relocs && (use_stub_relocs || tlsiv.ivnum || loadconfiv.ivnum);
|
||||||
|
const bool has_ncsection = has_oxrelocs || soimpdlls || soexport || soresources;
|
||||||
|
const unsigned oobjs = last_section_rsrc_only ? 4 : has_ncsection ? 3 : 2;
|
||||||
////pe_section_t osection[oobjs];
|
////pe_section_t osection[oobjs];
|
||||||
pe_section_t osection[4];
|
pe_section_t osection[4];
|
||||||
// section 0 : bss
|
// section 0 : bss
|
||||||
@@ -2528,7 +2530,7 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh,
|
|||||||
ODSIZE(PEDIR_LOADCONF) = soloadconf;
|
ODSIZE(PEDIR_LOADCONF) = soloadconf;
|
||||||
ic += soloadconf;
|
ic += soloadconf;
|
||||||
|
|
||||||
const bool rel_at_sections_start = oobjs == 4;
|
const bool rel_at_sections_start = last_section_rsrc_only;
|
||||||
|
|
||||||
ic = ncsection;
|
ic = ncsection;
|
||||||
if (!last_section_rsrc_only)
|
if (!last_section_rsrc_only)
|
||||||
@@ -2570,6 +2572,8 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh,
|
|||||||
|
|
||||||
const unsigned ncsize = soxrelocs + soimpdlls + soexport
|
const unsigned ncsize = soxrelocs + soimpdlls + soexport
|
||||||
+ (!last_section_rsrc_only ? soresources : 0);
|
+ (!last_section_rsrc_only ? soresources : 0);
|
||||||
|
assert((soxrelocs == 0) == !has_oxrelocs);
|
||||||
|
assert((ncsize == 0) == !has_ncsection);
|
||||||
|
|
||||||
// this one is tricky: it seems windoze touches 4 bytes after
|
// this one is tricky: it seems windoze touches 4 bytes after
|
||||||
// the end of the relocation data - so we have to increase
|
// the end of the relocation data - so we have to increase
|
||||||
@@ -2598,7 +2602,7 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh,
|
|||||||
osection[2].size = (ncsize + fam1) &~ fam1;
|
osection[2].size = (ncsize + fam1) &~ fam1;
|
||||||
|
|
||||||
osection[0].vsize = osection[1].vaddr - osection[0].vaddr;
|
osection[0].vsize = osection[1].vaddr - osection[0].vaddr;
|
||||||
if (oobjs == 3)
|
if (!last_section_rsrc_only)
|
||||||
{
|
{
|
||||||
osection[1].vsize = (osection[1].size + oam1) &~ oam1;
|
osection[1].vsize = (osection[1].size + oam1) &~ oam1;
|
||||||
osection[2].vsize = (osection[2].size + ncsize_virt_increase + oam1) &~ oam1;
|
osection[2].vsize = (osection[2].size + ncsize_virt_increase + oam1) &~ oam1;
|
||||||
@@ -2619,7 +2623,7 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh,
|
|||||||
osection[1].flags = (unsigned) (PEFL_DATA|PEFL_EXEC|PEFL_WRITE|PEFL_READ);
|
osection[1].flags = (unsigned) (PEFL_DATA|PEFL_EXEC|PEFL_WRITE|PEFL_READ);
|
||||||
osection[2].flags = (unsigned) (PEFL_DATA|PEFL_WRITE|PEFL_READ);
|
osection[2].flags = (unsigned) (PEFL_DATA|PEFL_WRITE|PEFL_READ);
|
||||||
|
|
||||||
if (oobjs == 4)
|
if (last_section_rsrc_only)
|
||||||
{
|
{
|
||||||
strcpy(osection[3].name, ".rsrc");
|
strcpy(osection[3].name, ".rsrc");
|
||||||
osection[3].vaddr = res_start;
|
osection[3].vaddr = res_start;
|
||||||
@@ -2663,7 +2667,7 @@ void PeFile::pack0(OutputFile *fo, ht &ih, ht &oh,
|
|||||||
// some alignment
|
// some alignment
|
||||||
if (identsplit == identsize)
|
if (identsplit == identsize)
|
||||||
{
|
{
|
||||||
unsigned n = osection[oobjs == 3 ? 0 : 1].rawdataptr - fo->getBytesWritten() - identsize;
|
unsigned n = osection[!last_section_rsrc_only ? 0 : 1].rawdataptr - fo->getBytesWritten() - identsize;
|
||||||
assert(n <= oh.filealign);
|
assert(n <= oh.filealign);
|
||||||
fo->write(ibuf, n);
|
fo->write(ibuf, n);
|
||||||
}
|
}
|
||||||
@@ -2991,7 +2995,7 @@ void PeFile::unpack0(OutputFile *fo, const ht &ih, ht &oh,
|
|||||||
skip += take;
|
skip += take;
|
||||||
unsigned objs = oh.objects;
|
unsigned objs = oh.objects;
|
||||||
|
|
||||||
if ((int) objs <= 0 || isection[2].size == 0)
|
if ((int) objs <= 0 || (iobjs > 2 && isection[2].size == 0))
|
||||||
throwCantUnpack("unexpected value in the PE header");
|
throwCantUnpack("unexpected value in the PE header");
|
||||||
Array(pe_section_t, osection, objs);
|
Array(pe_section_t, osection, objs);
|
||||||
take = sizeof(pe_section_t) * objs;
|
take = sizeof(pe_section_t) * objs;
|
||||||
@@ -3001,11 +3005,14 @@ void PeFile::unpack0(OutputFile *fo, const ht &ih, ht &oh,
|
|||||||
skip += take;
|
skip += take;
|
||||||
rvamin = osection[0].vaddr;
|
rvamin = osection[0].vaddr;
|
||||||
|
|
||||||
|
if (iobjs > 2)
|
||||||
|
{
|
||||||
// read the noncompressed section
|
// read the noncompressed section
|
||||||
ibuf.dealloc();
|
ibuf.dealloc();
|
||||||
ibuf.alloc(isection[2].size);
|
ibuf.alloc(isection[2].size);
|
||||||
fi->seek(isection[2].rawdataptr,SEEK_SET);
|
fi->seek(isection[2].rawdataptr,SEEK_SET);
|
||||||
fi->readx(ibuf,isection[2].size);
|
fi->readx(ibuf,isection[2].size);
|
||||||
|
}
|
||||||
|
|
||||||
// unfilter
|
// unfilter
|
||||||
if (ph.filter)
|
if (ph.filter)
|
||||||
@@ -3030,7 +3037,7 @@ void PeFile::unpack0(OutputFile *fo, const ht &ih, ht &oh,
|
|||||||
rebuildTls();
|
rebuildTls();
|
||||||
rebuildExports();
|
rebuildExports();
|
||||||
|
|
||||||
if (iobjs == 4)
|
if (iobjs > 3)
|
||||||
{
|
{
|
||||||
// read the resource section if present
|
// read the resource section if present
|
||||||
ibuf.dealloc();
|
ibuf.dealloc();
|
||||||
|
|||||||
Reference in New Issue
Block a user