Compiler nit: ptr->ENUM is not always considered a constant
modified: p_lx_elf.cpp
This commit is contained in:
+40
-40
@@ -398,7 +398,7 @@ off_t PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
|
|||||||
unsigned const ioff = get_te32(&phdr->p_offset);
|
unsigned const ioff = get_te32(&phdr->p_offset);
|
||||||
unsigned align= get_te32(&phdr->p_align);
|
unsigned align= get_te32(&phdr->p_align);
|
||||||
unsigned const type = get_te32(&phdr->p_type);
|
unsigned const type = get_te32(&phdr->p_type);
|
||||||
if (phdr->PT_INTERP==type) {
|
if (Elf32_Phdr::PT_INTERP==type) {
|
||||||
// Rotate to highest position, so it can be lopped
|
// Rotate to highest position, so it can be lopped
|
||||||
// by decrementing e_phnum.
|
// by decrementing e_phnum.
|
||||||
memcpy((unsigned char *)ibuf, phdr, sizeof(*phdr));
|
memcpy((unsigned char *)ibuf, phdr, sizeof(*phdr));
|
||||||
@@ -408,7 +408,7 @@ off_t PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
|
|||||||
set_te16(&ehdri.e_phnum, --e_phnum);
|
set_te16(&ehdri.e_phnum, --e_phnum);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (phdr->PT_LOAD32==type) {
|
if (PT_LOAD32==type) {
|
||||||
if (xct_off < ioff) { // Slide up non-first PT_LOAD.
|
if (xct_off < ioff) { // Slide up non-first PT_LOAD.
|
||||||
if ((1u<<12) < align) {
|
if ((1u<<12) < align) {
|
||||||
align = 1u<<12;
|
align = 1u<<12;
|
||||||
@@ -428,13 +428,13 @@ off_t PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
|
|||||||
continue; // all done with this PT_LOAD
|
continue; // all done with this PT_LOAD
|
||||||
}
|
}
|
||||||
// Compute new offset of &DT_INIT.d_val.
|
// Compute new offset of &DT_INIT.d_val.
|
||||||
if (/*0==jni_onload_sym &&*/ phdr->PT_DYNAMIC==type) {
|
if (/*0==jni_onload_sym &&*/ Elf32_Phdr::PT_DYNAMIC==type) {
|
||||||
off_init = ioff + ((xct_off < ioff) ? so_slide : 0);
|
off_init = ioff + ((xct_off < ioff) ? so_slide : 0);
|
||||||
fi->seek(ioff, SEEK_SET);
|
fi->seek(ioff, SEEK_SET);
|
||||||
fi->read(ibuf, len);
|
fi->read(ibuf, len);
|
||||||
Elf32_Dyn *dyn = (Elf32_Dyn *)(void *)ibuf;
|
Elf32_Dyn *dyn = (Elf32_Dyn *)(void *)ibuf;
|
||||||
for (int j2 = len; j2 > 0; ++dyn, j2 -= sizeof(*dyn)) {
|
for (int j2 = len; j2 > 0; ++dyn, j2 -= sizeof(*dyn)) {
|
||||||
if (dyn->DT_INIT==get_te32(&dyn->d_tag)) {
|
if (Elf32_Dyn::DT_INIT==get_te32(&dyn->d_tag)) {
|
||||||
unsigned const t = (unsigned char *)&dyn->d_val -
|
unsigned const t = (unsigned char *)&dyn->d_val -
|
||||||
(unsigned char *)ibuf;
|
(unsigned char *)ibuf;
|
||||||
off_init += t;
|
off_init += t;
|
||||||
@@ -536,7 +536,7 @@ off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
|
|||||||
upx_uint64_t const ioff = get_te64(&phdri[j].p_offset);
|
upx_uint64_t const ioff = get_te64(&phdri[j].p_offset);
|
||||||
upx_uint64_t align= get_te64(&phdr->p_align);
|
upx_uint64_t align= get_te64(&phdr->p_align);
|
||||||
unsigned const type = get_te32(&phdr->p_type);
|
unsigned const type = get_te32(&phdr->p_type);
|
||||||
if (phdr->PT_INTERP==type) {
|
if (Elf64_Phdr::PT_INTERP==type) {
|
||||||
// Rotate to highest position, so it can be lopped
|
// Rotate to highest position, so it can be lopped
|
||||||
// by decrementing e_phnum.
|
// by decrementing e_phnum.
|
||||||
memcpy((unsigned char *)ibuf, phdr, sizeof(*phdr));
|
memcpy((unsigned char *)ibuf, phdr, sizeof(*phdr));
|
||||||
@@ -546,7 +546,7 @@ off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
|
|||||||
set_te16(&ehdri.e_phnum, --e_phnum);
|
set_te16(&ehdri.e_phnum, --e_phnum);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (phdr->PT_LOAD==type) {
|
if (PT_LOAD64 == type) {
|
||||||
if (xct_off < ioff) { // Slide up non-first PT_LOAD.
|
if (xct_off < ioff) { // Slide up non-first PT_LOAD.
|
||||||
// AMD64 chip supports page sizes of 4KiB, 2MiB, and 1GiB;
|
// AMD64 chip supports page sizes of 4KiB, 2MiB, and 1GiB;
|
||||||
// the operating system chooses one. .p_align typically
|
// the operating system chooses one. .p_align typically
|
||||||
@@ -571,11 +571,11 @@ off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
|
|||||||
continue; // all done with this PT_LOAD
|
continue; // all done with this PT_LOAD
|
||||||
}
|
}
|
||||||
// Compute new offset of &DT_INIT.d_val.
|
// Compute new offset of &DT_INIT.d_val.
|
||||||
if (phdr->PT_DYNAMIC==type) {
|
if (Elf64_Phdr::PT_DYNAMIC==type) {
|
||||||
off_init = ioff + ((xct_off < ioff) ? so_slide : 0);
|
off_init = ioff + ((xct_off < ioff) ? so_slide : 0);
|
||||||
Elf64_Dyn *dyn = (Elf64_Dyn *)&file_image[ioff];
|
Elf64_Dyn *dyn = (Elf64_Dyn *)&file_image[ioff];
|
||||||
for (int j2 = len; j2 > 0; ++dyn, j2 -= sizeof(*dyn)) {
|
for (int j2 = len; j2 > 0; ++dyn, j2 -= sizeof(*dyn)) {
|
||||||
if (dyn->DT_INIT==get_te64(&dyn->d_tag)) {
|
if (Elf64_Dyn::DT_INIT==get_te64(&dyn->d_tag)) {
|
||||||
unsigned const t = (unsigned char *)&dyn->d_val -
|
unsigned const t = (unsigned char *)&dyn->d_val -
|
||||||
(unsigned char *)&file_image[ioff];
|
(unsigned char *)&file_image[ioff];
|
||||||
off_init += t;
|
off_init += t;
|
||||||
@@ -1702,7 +1702,7 @@ bool PackLinuxElf32::canPack()
|
|||||||
}
|
}
|
||||||
unsigned const p_type = get_te32(&phdr->p_type);
|
unsigned const p_type = get_te32(&phdr->p_type);
|
||||||
unsigned const p_offset = get_te32(&phdr->p_offset);
|
unsigned const p_offset = get_te32(&phdr->p_offset);
|
||||||
if (1!=exetype && phdr->PT_LOAD32 == p_type) { // 1st PT_LOAD
|
if (1!=exetype && PT_LOAD32 == p_type) { // 1st PT_LOAD
|
||||||
exetype = 1;
|
exetype = 1;
|
||||||
load_va = get_te32(&phdr->p_vaddr); // class data member
|
load_va = get_te32(&phdr->p_vaddr); // class data member
|
||||||
|
|
||||||
@@ -1722,7 +1722,7 @@ bool PackLinuxElf32::canPack()
|
|||||||
}
|
}
|
||||||
hatch_off = ~3u & (3+ get_te32(&phdr->p_memsz));
|
hatch_off = ~3u & (3+ get_te32(&phdr->p_memsz));
|
||||||
}
|
}
|
||||||
if (phdr->PT_NOTE == p_type) {
|
if (PT_NOTE32 == p_type) {
|
||||||
unsigned const x = get_te32(&phdr->p_memsz);
|
unsigned const x = get_te32(&phdr->p_memsz);
|
||||||
if ( sizeof(elfout.notes) < x // beware overflow of note_size
|
if ( sizeof(elfout.notes) < x // beware overflow of note_size
|
||||||
|| (sizeof(elfout.notes) < (note_size += x)) ) {
|
|| (sizeof(elfout.notes) < (note_size += x)) ) {
|
||||||
@@ -1889,7 +1889,7 @@ bool PackLinuxElf32::canPack()
|
|||||||
phdr = phdri;
|
phdr = phdri;
|
||||||
for (unsigned j= 0; j < e_phnum; ++phdr, ++j) {
|
for (unsigned j= 0; j < e_phnum; ++phdr, ++j) {
|
||||||
unsigned const vaddr = get_te32(&phdr->p_vaddr);
|
unsigned const vaddr = get_te32(&phdr->p_vaddr);
|
||||||
if (Elf32_Phdr::PT_NOTE == get_te32(&phdr->p_type)
|
if (PT_NOTE32 == get_te32(&phdr->p_type)
|
||||||
&& xct_va < vaddr) {
|
&& xct_va < vaddr) {
|
||||||
char buf[40]; snprintf(buf, sizeof(buf),
|
char buf[40]; snprintf(buf, sizeof(buf),
|
||||||
"PT_NOTE %#x above stub", vaddr);
|
"PT_NOTE %#x above stub", vaddr);
|
||||||
@@ -1956,7 +1956,7 @@ PackLinuxElf64::canPack()
|
|||||||
if (j >= 14)
|
if (j >= 14)
|
||||||
return false;
|
return false;
|
||||||
unsigned const p_type = get_te32(&phdr->p_type);
|
unsigned const p_type = get_te32(&phdr->p_type);
|
||||||
if (1!=exetype && phdr->PT_LOAD64 == p_type) { // 1st PT_LOAD
|
if (1!=exetype && PT_LOAD64 == p_type) { // 1st PT_LOAD
|
||||||
exetype = 1;
|
exetype = 1;
|
||||||
load_va = get_te64(&phdr->p_vaddr); // class data member
|
load_va = get_te64(&phdr->p_vaddr); // class data member
|
||||||
upx_uint64_t const p_offset = get_te64(&phdr->p_offset);
|
upx_uint64_t const p_offset = get_te64(&phdr->p_offset);
|
||||||
@@ -2085,7 +2085,7 @@ PackLinuxElf64::canPack()
|
|||||||
phdr = phdri;
|
phdr = phdri;
|
||||||
for (unsigned j= 0; j < e_phnum; ++phdr, ++j) {
|
for (unsigned j= 0; j < e_phnum; ++phdr, ++j) {
|
||||||
upx_uint64_t const vaddr = get_te64(&phdr->p_vaddr);
|
upx_uint64_t const vaddr = get_te64(&phdr->p_vaddr);
|
||||||
if (Elf64_Phdr::PT_NOTE == get_te32(&phdr->p_type)
|
if (PT_NOTE64 == get_te32(&phdr->p_type)
|
||||||
&& xct_va < vaddr) {
|
&& xct_va < vaddr) {
|
||||||
char buf[40]; snprintf(buf, sizeof(buf),
|
char buf[40]; snprintf(buf, sizeof(buf),
|
||||||
"PT_NOTE %#lx above stub", (unsigned long)vaddr);
|
"PT_NOTE %#lx above stub", (unsigned long)vaddr);
|
||||||
@@ -2139,7 +2139,7 @@ PackLinuxElf32::getbase(const Elf32_Phdr *phdr, int nph) const
|
|||||||
{
|
{
|
||||||
off_t base = ~0u;
|
off_t base = ~0u;
|
||||||
for (int j = 0; j < nph; ++phdr, ++j) {
|
for (int j = 0; j < nph; ++phdr, ++j) {
|
||||||
if (phdr->PT_LOAD == get_te32(&phdr->p_type)) {
|
if (PT_LOAD32 == get_te32(&phdr->p_type)) {
|
||||||
unsigned const vaddr = get_te32(&phdr->p_vaddr);
|
unsigned const vaddr = get_te32(&phdr->p_vaddr);
|
||||||
if (vaddr < (unsigned) base)
|
if (vaddr < (unsigned) base)
|
||||||
base = vaddr;
|
base = vaddr;
|
||||||
@@ -2302,7 +2302,7 @@ PackNetBSDElf32x86::generateElfHdr(
|
|||||||
note_offset += (np_PaX ? sizeof(Elf32_Phdr) : 0);
|
note_offset += (np_PaX ? sizeof(Elf32_Phdr) : 0);
|
||||||
Elf32_Phdr *phdr = &elfout.phdr[2];
|
Elf32_Phdr *phdr = &elfout.phdr[2];
|
||||||
if (np_NetBSD) {
|
if (np_NetBSD) {
|
||||||
set_te32(&phdr->p_type, Elf32_Phdr::PT_NOTE);
|
set_te32(&phdr->p_type, PT_NOTE32);
|
||||||
set_te32(&phdr->p_offset, note_offset);
|
set_te32(&phdr->p_offset, note_offset);
|
||||||
set_te32(&phdr->p_vaddr, note_offset);
|
set_te32(&phdr->p_vaddr, note_offset);
|
||||||
set_te32(&phdr->p_paddr, note_offset);
|
set_te32(&phdr->p_paddr, note_offset);
|
||||||
@@ -2316,7 +2316,7 @@ PackNetBSDElf32x86::generateElfHdr(
|
|||||||
++phdr;
|
++phdr;
|
||||||
}
|
}
|
||||||
if (np_PaX) {
|
if (np_PaX) {
|
||||||
set_te32(&phdr->p_type, Elf32_Phdr::PT_NOTE);
|
set_te32(&phdr->p_type, PT_NOTE32);
|
||||||
set_te32(&phdr->p_offset, note_offset);
|
set_te32(&phdr->p_offset, note_offset);
|
||||||
set_te32(&phdr->p_vaddr, note_offset);
|
set_te32(&phdr->p_vaddr, note_offset);
|
||||||
set_te32(&phdr->p_paddr, note_offset);
|
set_te32(&phdr->p_paddr, note_offset);
|
||||||
@@ -2393,7 +2393,7 @@ PackOpenBSDElf32x86::generateElfHdr(
|
|||||||
unsigned const note_offset = sizeof(*h3) - sizeof(linfo);
|
unsigned const note_offset = sizeof(*h3) - sizeof(linfo);
|
||||||
sz_elf_hdrs = sizeof(elfnote) + note_offset;
|
sz_elf_hdrs = sizeof(elfnote) + note_offset;
|
||||||
|
|
||||||
set_te32(&h3->phdr[2].p_type, Elf32_Phdr::PT_NOTE);
|
set_te32(&h3->phdr[2].p_type, PT_NOTE32);
|
||||||
set_te32(&h3->phdr[2].p_offset, note_offset);
|
set_te32(&h3->phdr[2].p_offset, note_offset);
|
||||||
set_te32(&h3->phdr[2].p_vaddr, note_offset);
|
set_te32(&h3->phdr[2].p_vaddr, note_offset);
|
||||||
set_te32(&h3->phdr[2].p_paddr, note_offset);
|
set_te32(&h3->phdr[2].p_paddr, note_offset);
|
||||||
@@ -2536,7 +2536,7 @@ void PackLinuxElf32::pack1(OutputFile *fo, Filter & /*ft*/)
|
|||||||
Elf32_Phdr *phdr = phdri;
|
Elf32_Phdr *phdr = phdri;
|
||||||
note_size = 0;
|
note_size = 0;
|
||||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||||
if (phdr->PT_NOTE32 == get_te32(&phdr->p_type)) {
|
if (PT_NOTE32 == get_te32(&phdr->p_type)) {
|
||||||
note_size += up4(get_te32(&phdr->p_filesz));
|
note_size += up4(get_te32(&phdr->p_filesz));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2547,19 +2547,19 @@ void PackLinuxElf32::pack1(OutputFile *fo, Filter & /*ft*/)
|
|||||||
phdr = phdri;
|
phdr = phdri;
|
||||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||||
unsigned const type = get_te32(&phdr->p_type);
|
unsigned const type = get_te32(&phdr->p_type);
|
||||||
if (phdr->PT_NOTE32 == type) {
|
if (PT_NOTE32 == type) {
|
||||||
unsigned const len = get_te32(&phdr->p_filesz);
|
unsigned const len = get_te32(&phdr->p_filesz);
|
||||||
fi->seek(get_te32(&phdr->p_offset), SEEK_SET);
|
fi->seek(get_te32(&phdr->p_offset), SEEK_SET);
|
||||||
fi->readx(¬e_body[note_size], len);
|
fi->readx(¬e_body[note_size], len);
|
||||||
note_size += up4(len);
|
note_size += up4(len);
|
||||||
}
|
}
|
||||||
if (phdr->PT_LOAD32 == type) {
|
if (PT_LOAD32 == type) {
|
||||||
unsigned x = get_te32(&phdr->p_align) >> lg2_page;
|
unsigned x = get_te32(&phdr->p_align) >> lg2_page;
|
||||||
while (x>>=1) {
|
while (x>>=1) {
|
||||||
++lg2_page;
|
++lg2_page;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (phdr->PT_GNU_STACK32 == type) {
|
if (PT_GNU_STACK32 == type) {
|
||||||
// MIPS stub cannot handle GNU_STACK yet.
|
// MIPS stub cannot handle GNU_STACK yet.
|
||||||
if (Elf32_Ehdr::EM_MIPS != this->e_machine) {
|
if (Elf32_Ehdr::EM_MIPS != this->e_machine) {
|
||||||
gnu_stack = phdr;
|
gnu_stack = phdr;
|
||||||
@@ -2846,7 +2846,7 @@ void PackLinuxElf64::pack1(OutputFile *fo, Filter & /*ft*/)
|
|||||||
Elf64_Phdr *phdr = phdri;
|
Elf64_Phdr *phdr = phdri;
|
||||||
note_size = 0;
|
note_size = 0;
|
||||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||||
if (phdr->PT_NOTE64 == get_te32(&phdr->p_type)) {
|
if (PT_NOTE64 == get_te32(&phdr->p_type)) {
|
||||||
note_size += up4(get_te64(&phdr->p_filesz));
|
note_size += up4(get_te64(&phdr->p_filesz));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2857,19 +2857,19 @@ void PackLinuxElf64::pack1(OutputFile *fo, Filter & /*ft*/)
|
|||||||
phdr = phdri;
|
phdr = phdri;
|
||||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||||
unsigned const type = get_te32(&phdr->p_type);
|
unsigned const type = get_te32(&phdr->p_type);
|
||||||
if (phdr->PT_NOTE64 == type) {
|
if (PT_NOTE64 == type) {
|
||||||
unsigned const len = get_te64(&phdr->p_filesz);
|
unsigned const len = get_te64(&phdr->p_filesz);
|
||||||
fi->seek(get_te64(&phdr->p_offset), SEEK_SET);
|
fi->seek(get_te64(&phdr->p_offset), SEEK_SET);
|
||||||
fi->readx(¬e_body[note_size], len);
|
fi->readx(¬e_body[note_size], len);
|
||||||
note_size += up4(len);
|
note_size += up4(len);
|
||||||
}
|
}
|
||||||
if (phdr->PT_LOAD64 == type) {
|
if (PT_LOAD64 == type) {
|
||||||
unsigned x = get_te64(&phdr->p_align) >> lg2_page;
|
unsigned x = get_te64(&phdr->p_align) >> lg2_page;
|
||||||
while (x>>=1) {
|
while (x>>=1) {
|
||||||
++lg2_page;
|
++lg2_page;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (phdr->PT_GNU_STACK64 == type) {
|
if (PT_GNU_STACK64 == type) {
|
||||||
gnu_stack = phdr;
|
gnu_stack = phdr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3515,7 +3515,7 @@ void PackLinuxElf32::pack4(OutputFile *fo, Filter &ft)
|
|||||||
Elf32_Phdr *phdr = &elfout.phdr[2];
|
Elf32_Phdr *phdr = &elfout.phdr[2];
|
||||||
unsigned const o_phnum = get_te16(&elfout.ehdr.e_phnum);
|
unsigned const o_phnum = get_te16(&elfout.ehdr.e_phnum);
|
||||||
for (unsigned j = 2; j < o_phnum; ++j, ++phdr) {
|
for (unsigned j = 2; j < o_phnum; ++j, ++phdr) {
|
||||||
if (Elf32_Phdr::PT_NOTE==get_te32(&phdr->p_type)) {
|
if (PT_NOTE32 == get_te32(&phdr->p_type)) {
|
||||||
set_te32( &phdr->p_vaddr,
|
set_te32( &phdr->p_vaddr,
|
||||||
reloc + get_te32(&phdr->p_vaddr));
|
reloc + get_te32(&phdr->p_vaddr));
|
||||||
set_te32( &phdr->p_paddr,
|
set_te32( &phdr->p_paddr,
|
||||||
@@ -3564,7 +3564,7 @@ void PackLinuxElf64::pack4(OutputFile *fo, Filter &ft)
|
|||||||
fo->rewrite(&linfo, sizeof(linfo));
|
fo->rewrite(&linfo, sizeof(linfo));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (Elf64_Phdr::PT_NOTE==get_te64(&elfout.phdr[2].p_type)) {
|
if (PT_NOTE64 == get_te64(&elfout.phdr[2].p_type)) {
|
||||||
upx_uint64_t const reloc = get_te64(&elfout.phdr[0].p_vaddr);
|
upx_uint64_t const reloc = get_te64(&elfout.phdr[0].p_vaddr);
|
||||||
set_te64( &elfout.phdr[2].p_vaddr,
|
set_te64( &elfout.phdr[2].p_vaddr,
|
||||||
reloc + get_te64(&elfout.phdr[2].p_vaddr));
|
reloc + get_te64(&elfout.phdr[2].p_vaddr));
|
||||||
@@ -3846,7 +3846,7 @@ void PackLinuxElf64::unpack(OutputFile *fo)
|
|||||||
phdr = (Elf64_Phdr *)&u[sizeof(*ehdr)];
|
phdr = (Elf64_Phdr *)&u[sizeof(*ehdr)];
|
||||||
if (fo)
|
if (fo)
|
||||||
for (unsigned j= 0; j < u_phnum; ++j, ++phdr) {
|
for (unsigned j= 0; j < u_phnum; ++j, ++phdr) {
|
||||||
if (phdr->PT_DYNAMIC==get_te32(&phdr->p_type)) {
|
if (Elf64_Phdr::PT_DYNAMIC==get_te32(&phdr->p_type)) {
|
||||||
upx_uint64_t dt_pltrelsz(0), dt_jmprel(0);
|
upx_uint64_t dt_pltrelsz(0), dt_jmprel(0);
|
||||||
upx_uint64_t dt_relasz(0), dt_rela(0);
|
upx_uint64_t dt_relasz(0), dt_rela(0);
|
||||||
unsigned const dyn_off = get_te64(&phdr->p_offset);
|
unsigned const dyn_off = get_te64(&phdr->p_offset);
|
||||||
@@ -3857,29 +3857,29 @@ void PackLinuxElf64::unpack(OutputFile *fo)
|
|||||||
upx_uint64_t const tag = get_te64(&dyn->d_tag);
|
upx_uint64_t const tag = get_te64(&dyn->d_tag);
|
||||||
upx_uint64_t val = get_te64(&dyn->d_val);
|
upx_uint64_t val = get_te64(&dyn->d_val);
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
case dyn->DT_INIT: {
|
case Elf64_Dyn::DT_INIT: {
|
||||||
fo->seek(sizeof(upx_uint64_t) + j2 + dyn_off, SEEK_SET);
|
fo->seek(sizeof(upx_uint64_t) + j2 + dyn_off, SEEK_SET);
|
||||||
fo->rewrite(&old_dtinit, sizeof(old_dtinit));
|
fo->rewrite(&old_dtinit, sizeof(old_dtinit));
|
||||||
} break;
|
} break;
|
||||||
case dyn->DT_PREINIT_ARRAY:
|
case Elf64_Dyn::DT_PREINIT_ARRAY:
|
||||||
case dyn->DT_INIT_ARRAY:
|
case Elf64_Dyn::DT_INIT_ARRAY:
|
||||||
case dyn->DT_FINI_ARRAY:
|
case Elf64_Dyn::DT_FINI_ARRAY:
|
||||||
case dyn->DT_FINI:
|
case Elf64_Dyn::DT_FINI:
|
||||||
case dyn->DT_PLTGOT: {
|
case Elf64_Dyn::DT_PLTGOT: {
|
||||||
fo->seek(sizeof(upx_uint64_t) + j2 + dyn_off, SEEK_SET);
|
fo->seek(sizeof(upx_uint64_t) + j2 + dyn_off, SEEK_SET);
|
||||||
val -= asl_delta;
|
val -= asl_delta;
|
||||||
fo->rewrite(&val, sizeof(val));
|
fo->rewrite(&val, sizeof(val));
|
||||||
} break;
|
} break;
|
||||||
case dyn->DT_PLTRELSZ: { // Size in bytes of PLT relocs
|
case Elf64_Dyn::DT_PLTRELSZ: { // Size in bytes of PLT relocs
|
||||||
dt_pltrelsz = val; (void)dt_pltrelsz;
|
dt_pltrelsz = val; (void)dt_pltrelsz;
|
||||||
} break;
|
} break;
|
||||||
case dyn->DT_JMPREL: { // Address of PLT relocs
|
case Elf64_Dyn::DT_JMPREL: { // Address of PLT relocs
|
||||||
dt_jmprel = val; (void)dt_jmprel;
|
dt_jmprel = val; (void)dt_jmprel;
|
||||||
} break;
|
} break;
|
||||||
case dyn->DT_RELASZ: { // Total size of Rela relocs
|
case Elf64_Dyn::DT_RELASZ: { // Total size of Rela relocs
|
||||||
dt_relasz = val;
|
dt_relasz = val;
|
||||||
} break;
|
} break;
|
||||||
case dyn->DT_RELA: { // Address of Rela relocs
|
case Elf64_Dyn::DT_RELA: { // Address of Rela relocs
|
||||||
dt_rela = val;
|
dt_rela = val;
|
||||||
} break;
|
} break;
|
||||||
} // end switch()
|
} // end switch()
|
||||||
@@ -4555,13 +4555,13 @@ void PackLinuxElf32::unpack(OutputFile *fo)
|
|||||||
// Restore DT_INIT.d_val
|
// Restore DT_INIT.d_val
|
||||||
phdr = (Elf32_Phdr *) (u.buf + sizeof(*ehdr));
|
phdr = (Elf32_Phdr *) (u.buf + sizeof(*ehdr));
|
||||||
for (unsigned j= 0; j < u_phnum; ++j, ++phdr) {
|
for (unsigned j= 0; j < u_phnum; ++j, ++phdr) {
|
||||||
if (phdr->PT_DYNAMIC==get_te32(&phdr->p_type)) {
|
if (Elf32_Phdr::PT_DYNAMIC==get_te32(&phdr->p_type)) {
|
||||||
unsigned const dyn_off = get_te32(&phdr->p_offset);
|
unsigned const dyn_off = get_te32(&phdr->p_offset);
|
||||||
unsigned const dyn_len = get_te32(&phdr->p_filesz);
|
unsigned const dyn_len = get_te32(&phdr->p_filesz);
|
||||||
Elf32_Dyn *dyn = (Elf32_Dyn *)((unsigned char *)ibuf +
|
Elf32_Dyn *dyn = (Elf32_Dyn *)((unsigned char *)ibuf +
|
||||||
(dyn_off - load_off));
|
(dyn_off - load_off));
|
||||||
for (unsigned j2= 0; j2 < dyn_len; ++dyn, j2 += sizeof(*dyn)) {
|
for (unsigned j2= 0; j2 < dyn_len; ++dyn, j2 += sizeof(*dyn)) {
|
||||||
if (dyn->DT_INIT==get_te32(&dyn->d_tag)) {
|
if (Elf32_Dyn::DT_INIT==get_te32(&dyn->d_tag)) {
|
||||||
if (fo) {
|
if (fo) {
|
||||||
fo->seek(sizeof(unsigned) + j2 + dyn_off, SEEK_SET);
|
fo->seek(sizeof(unsigned) + j2 + dyn_off, SEEK_SET);
|
||||||
fo->rewrite(&old_dtinit, sizeof(old_dtinit));
|
fo->rewrite(&old_dtinit, sizeof(old_dtinit));
|
||||||
|
|||||||
Reference in New Issue
Block a user