mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
Compress shared library for i386-linux. DT_INIT must exist. Everything
needed by ld-linux for runtime relocation must be at the beginning of the first PT_LOAD, etc.
This commit is contained in:
parent
90ddc06c98
commit
856ecb84a0
535
src/p_lx_elf.cpp
535
src/p_lx_elf.cpp
|
@ -69,7 +69,7 @@ PackLinuxElf32::checkEhdr(Elf32_Ehdr const *ehdr) const
|
|||
return 3;
|
||||
if (get_te32(&ehdr->e_version) != Elf32_Ehdr::EV_CURRENT)
|
||||
return 4;
|
||||
if (get_te16(&ehdr->e_phnum) < 1)
|
||||
if (e_phnum < 1)
|
||||
return 5;
|
||||
if (get_te16(&ehdr->e_phentsize) != sizeof(Elf32_Phdr))
|
||||
return 6;
|
||||
|
@ -118,7 +118,7 @@ PackLinuxElf64::checkEhdr(Elf64_Ehdr const *ehdr) const
|
|||
return 3;
|
||||
if (get_te32(&ehdr->e_version) != Elf64_Ehdr::EV_CURRENT)
|
||||
return 4;
|
||||
if (get_te16(&ehdr->e_phnum) < 1)
|
||||
if (e_phnum < 1)
|
||||
return 5;
|
||||
if (get_te16(&ehdr->e_phentsize) != sizeof(Elf64_Phdr))
|
||||
return 6;
|
||||
|
@ -142,9 +142,9 @@ PackLinuxElf64::checkEhdr(Elf64_Ehdr const *ehdr) const
|
|||
}
|
||||
|
||||
PackLinuxElf::PackLinuxElf(InputFile *f)
|
||||
: super(f), file_image(NULL), dynstr(NULL),
|
||||
: super(f), e_phnum(0), file_image(NULL), dynstr(NULL),
|
||||
sz_phdrs(0), sz_elf_hdrs(0), sz_pack2(0),
|
||||
lg2_page(12), page_size(1u<<lg2_page),
|
||||
lg2_page(12), page_size(1u<<lg2_page), xct_off(0), xct_va(0),
|
||||
e_machine(0), ei_class(0), ei_data(0), ei_osabi(0), osabi_note(NULL)
|
||||
{
|
||||
}
|
||||
|
@ -161,21 +161,110 @@ void PackLinuxElf::pack3(OutputFile *fo, Filter &ft)
|
|||
unsigned len = fo->getBytesWritten();
|
||||
fo->write(&zero, 3& -len); // ALIGN_UP 0 mod 4
|
||||
len += (3& -len); // 0 mod 4
|
||||
if (0==(4 & len)) {
|
||||
fo->write(&zero, 4);
|
||||
len += 4;
|
||||
} // 4 mod 8
|
||||
set_te32(&disp, len); // FIXME? -(sz_elf_hdrs+sizeof(l_info)+sizeof(p_info))
|
||||
fo->write(&disp, sizeof(disp));
|
||||
sz_pack2 = sizeof(disp) + len; // 0 mod 8
|
||||
unsigned const t = 4 ^ (4 & len) ^ ((!!xct_off)<<2); // 0 or 4
|
||||
fo->write(&zero, t);
|
||||
len += t;
|
||||
if (xct_off) {
|
||||
set_te32(&disp, xct_va - xct_off + len); // to detect dynamic reloc
|
||||
fo->write(&disp, sizeof(disp));
|
||||
len += sizeof(disp);
|
||||
|
||||
super::pack3(fo, ft);
|
||||
set_te32(&disp, elf_unsigned_dynamic(Elf32_Dyn::DT_INIT));
|
||||
fo->write(&disp, sizeof(disp));
|
||||
len += sizeof(disp);
|
||||
|
||||
set_te32(&disp, hatch_va);
|
||||
fo->write(&disp, sizeof(disp));
|
||||
len += sizeof(disp);
|
||||
|
||||
set_te32(&disp, xct_va);
|
||||
fo->write(&disp, sizeof(disp));
|
||||
len += sizeof(disp);
|
||||
}
|
||||
else {
|
||||
set_te32(&disp, len - xct_off); // distance back to beginning
|
||||
fo->write(&disp, sizeof(disp));
|
||||
len += sizeof(disp);
|
||||
}
|
||||
sz_pack2 = len; // 0 mod 8
|
||||
|
||||
super::pack3(fo, ft); // append the decompressor
|
||||
}
|
||||
|
||||
void PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
|
||||
{
|
||||
super::pack3(fo, ft);
|
||||
set_te32(&elfout.phdr[0].p_filesz, sz_pack2);
|
||||
if (0!=xct_off) { // shared library
|
||||
Elf32_Phdr *phdr = phdri;
|
||||
unsigned off = sz_pack2;
|
||||
unsigned off_init = 0; // where in file
|
||||
unsigned va_init = sz_pack2; // virtual address
|
||||
unsigned rel = 0;
|
||||
unsigned old_dtinit = 0;
|
||||
for (int j = e_phnum; --j>=0; ++phdr) {
|
||||
unsigned const len = get_te32(&phdr->p_filesz);
|
||||
unsigned const ioff = get_te32(&phdr->p_offset);
|
||||
unsigned const type = get_te32(&phdr->p_type);
|
||||
if (phdr->PT_INTERP==type) { // FIXME
|
||||
// Rotate to highest position, so it can be lopped
|
||||
// by decrementing e_phnum. FIXME: must relocate .p_offset,
|
||||
// and ::pack4 must rewrite it to the output, too.
|
||||
memcpy((unsigned char *)ibuf, phdr, sizeof(*phdr));
|
||||
memcpy(phdr, 1+phdr, j * sizeof(*phdr));
|
||||
memcpy(&phdr[j], (unsigned char *)ibuf, sizeof(*phdr));
|
||||
--phdr;
|
||||
set_te16(&ehdri.e_phnum, --e_phnum);
|
||||
continue;
|
||||
}
|
||||
if (phdr->PT_LOAD32==type) {
|
||||
if (xct_off < ioff) { // Slide up non-first PT_LOAD.
|
||||
fi->seek(ioff, SEEK_SET);
|
||||
fi->readx(ibuf, len);
|
||||
off += ~page_mask & (ioff - off);
|
||||
fo->seek(off, SEEK_SET);
|
||||
fo->write(ibuf, len);
|
||||
rel = off - ioff;
|
||||
set_te32(&phdr->p_offset, rel + ioff);
|
||||
}
|
||||
else { // Change length of first PT_LOAD.
|
||||
va_init += get_te32(&phdr->p_vaddr);
|
||||
set_te32(&phdr->p_filesz, sz_pack2);
|
||||
set_te32(&phdr->p_memsz, sz_pack2); // FIXME
|
||||
}
|
||||
continue; // all done with this PT_LOAD
|
||||
}
|
||||
// Compute new offset of &DT_INIT.d_val.
|
||||
if (phdr->PT_DYNAMIC==type) {
|
||||
off_init = rel + ioff;
|
||||
fi->seek(ioff, SEEK_SET);
|
||||
fi->read(ibuf, len);
|
||||
Elf32_Dyn *dyn = (Elf32_Dyn *)(void *)ibuf;
|
||||
for (int j = len; j > 0; ++dyn, j -= sizeof(*dyn)) {
|
||||
if (dyn->DT_INIT==get_te32(&dyn->d_tag)) {
|
||||
old_dtinit = dyn->d_val;
|
||||
unsigned const t = (unsigned char *)&dyn->d_val -
|
||||
(unsigned char *)ibuf;
|
||||
off_init += t;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// fall through to relocate .p_offset
|
||||
}
|
||||
if (xct_off < ioff)
|
||||
set_te32(&phdr->p_offset, rel + ioff);
|
||||
}
|
||||
if (off_init) { // change DT_INIT.d_val
|
||||
fo->seek(off_init, SEEK_SET);
|
||||
unsigned word; set_te32(&word, va_init);
|
||||
fo->rewrite(&word, sizeof(word));
|
||||
fo->seek(0, SEEK_END);
|
||||
}
|
||||
ehdri.e_shnum = 0;
|
||||
ehdri.e_shoff = old_dtinit; // easy to find for unpacking
|
||||
//ehdri.e_shentsize = 0;
|
||||
//ehdri.e_shstrndx = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
|
||||
|
@ -212,6 +301,8 @@ PackLinuxElf32::PackLinuxElf32(InputFile *f)
|
|||
shstrtab(NULL), n_elf_shnum(0),
|
||||
sec_strndx(NULL), sec_dynsym(NULL), sec_dynstr(NULL)
|
||||
{
|
||||
f->seek(0, SEEK_SET);
|
||||
f->readx(&ehdri, sizeof(ehdri));
|
||||
}
|
||||
|
||||
PackLinuxElf32::~PackLinuxElf32()
|
||||
|
@ -220,8 +311,11 @@ PackLinuxElf32::~PackLinuxElf32()
|
|||
}
|
||||
|
||||
PackLinuxElf64::PackLinuxElf64(InputFile *f)
|
||||
: super(f), phdri(NULL), page_mask(~0ull<<lg2_page)
|
||||
: super(f), phdri(NULL), page_mask(~0ull<<lg2_page),
|
||||
dynseg(0)
|
||||
{
|
||||
f->seek(0, SEEK_SET);
|
||||
f->readx(&ehdri, sizeof(ehdri));
|
||||
}
|
||||
|
||||
PackLinuxElf64::~PackLinuxElf64()
|
||||
|
@ -474,7 +568,7 @@ PackLinuxElf32::buildLinuxLoader(
|
|||
}
|
||||
unsigned char const *const uncLoader = fold_hdrlen + fold;
|
||||
|
||||
h.sz_cpr = MemBuffer::getSizeForCompression(h.sz_unc);
|
||||
h.sz_cpr = MemBuffer::getSizeForCompression(h.sz_unc + (0==h.sz_unc));
|
||||
unsigned char *const cprLoader = new unsigned char[sizeof(h) + h.sz_cpr];
|
||||
if (0 < szfold) {
|
||||
int r = upx_compress(uncLoader, h.sz_unc, sizeof(h) + cprLoader, &h.sz_cpr,
|
||||
|
@ -571,7 +665,7 @@ PackLinuxElf64amd::defineSymbols(Filter const *)
|
|||
// size (total over all PT_LOAD64) as an upper bound.
|
||||
unsigned len = 0;
|
||||
acc_uint64l_t lo_va_user = ~0ull; // infinity
|
||||
for (int j= get_te16(&ehdri.e_phnum); --j>=0; ) {
|
||||
for (int j= e_phnum; --j>=0; ) {
|
||||
if (PT_LOAD64 == get_te32(&phdri[j].p_type)) {
|
||||
len += (unsigned)get_te64(&phdri[j].p_filesz);
|
||||
acc_uint64l_t const va = get_te64(&phdri[j].p_vaddr);
|
||||
|
@ -598,7 +692,7 @@ PackLinuxElf64amd::defineSymbols(Filter const *)
|
|||
set_te64(&elfout.phdr[0].p_paddr, lo_va_user);
|
||||
lo_va_stub = lo_va_user;
|
||||
adrc = lo_va_stub;
|
||||
adrm = getbrk(phdri, get_te16(&ehdri.e_phnum));
|
||||
adrm = getbrk(phdri, e_phnum);
|
||||
adru = page_mask & (~page_mask + adrm); // round up to page boundary
|
||||
adrx = adru + hlen;
|
||||
lenm = page_size + len;
|
||||
|
@ -640,10 +734,18 @@ static const
|
|||
#include "stub/i386-linux.elf-entry.h"
|
||||
static const
|
||||
#include "stub/i386-linux.elf-fold.h"
|
||||
static const
|
||||
#include "stub/i386-linux.shlib-init.h"
|
||||
|
||||
void
|
||||
PackLinuxElf32x86::buildLoader(const Filter *ft)
|
||||
{
|
||||
if (0!=xct_off) { // shared library
|
||||
buildLinuxLoader(
|
||||
stub_i386_linux_shlib_init, sizeof(stub_i386_linux_shlib_init),
|
||||
NULL, 0, ft );
|
||||
return;
|
||||
}
|
||||
unsigned char tmp[sizeof(stub_i386_linux_elf_fold)];
|
||||
memcpy(tmp, stub_i386_linux_elf_fold, sizeof(stub_i386_linux_elf_fold));
|
||||
checkPatch(NULL, 0, 0, 0); // reset
|
||||
|
@ -842,6 +944,12 @@ Elf32_Shdr const *PackLinuxElf32::elf_find_section_type(
|
|||
return 0;
|
||||
}
|
||||
|
||||
static unsigned
|
||||
umin(unsigned a, unsigned b)
|
||||
{
|
||||
return (a < b) ? a : b;
|
||||
}
|
||||
|
||||
bool PackLinuxElf32::canPack()
|
||||
{
|
||||
union {
|
||||
|
@ -872,8 +980,8 @@ bool PackLinuxElf32::canPack()
|
|||
}
|
||||
|
||||
unsigned osabi0 = u.buf[Elf32_Ehdr::EI_OSABI];
|
||||
unsigned va_load = 0;
|
||||
// The first PT_LOAD32 must cover the beginning of the file (0==p_offset).
|
||||
unsigned const e_phnum = get_te16(&ehdr->e_phnum);
|
||||
Elf32_Phdr const *phdr = (Elf32_Phdr const *)(u.buf + e_phoff);
|
||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||
if (j >= 14)
|
||||
|
@ -885,6 +993,7 @@ bool PackLinuxElf32::canPack()
|
|||
throwCantPack("invalid Phdr p_offset; try '--force-execve'");
|
||||
return false;
|
||||
}
|
||||
va_load = phdr->p_vaddr;
|
||||
exetype = 1;
|
||||
}
|
||||
if (Elf32_Ehdr::ELFOSABI_NONE==osabi0 // Still seems to be generic.
|
||||
|
@ -938,51 +1047,96 @@ bool PackLinuxElf32::canPack()
|
|||
fi->seek(0, SEEK_SET);
|
||||
fi->readx(file_image, file_size);
|
||||
memcpy(&ehdri, ehdr, sizeof(Elf32_Ehdr));
|
||||
phdri= (Elf32_Phdr *)(e_phoff + file_image); // do not free() !!
|
||||
shdri= (Elf32_Shdr *)(e_shoff + file_image); // do not free() !!
|
||||
phdri= (Elf32_Phdr *)(e_phoff + file_image); // do not free() !!
|
||||
shdri= (Elf32_Shdr const *)(e_shoff + file_image); // do not free() !!
|
||||
|
||||
n_elf_shnum = get_te16(&ehdr->e_shnum);
|
||||
shdri = (Elf32_Shdr const *)(e_shoff + file_image);
|
||||
//sec_strndx = &shdri[ehdr->e_shstrndx];
|
||||
//shstrtab = (char const *)(sec_strndx->sh_offset + file_image);
|
||||
sec_dynsym = elf_find_section_type(Elf32_Shdr::SHT_DYNSYM);
|
||||
sec_dynstr = get_te32(&sec_dynsym->sh_link) + shdri;
|
||||
if (sec_dynsym)
|
||||
sec_dynstr = get_te32(&sec_dynsym->sh_link) + shdri;
|
||||
|
||||
int j= e_phnum;
|
||||
phdr= phdri;
|
||||
for (; --j>=0; ++phdr) if (Elf32_Phdr::PT_DYNAMIC==get_te32(&phdr->p_type)) {
|
||||
for (; --j>=0; ++phdr)
|
||||
if (Elf32_Phdr::PT_DYNAMIC==get_te32(&phdr->p_type)) {
|
||||
dynseg= (Elf32_Dyn const *)(get_te32(&phdr->p_offset) + file_image);
|
||||
break;
|
||||
}
|
||||
// elf_find_dynamic() returns 0 if 0==dynseg.
|
||||
//gashtab= (unsigned int const *)elf_find_dynamic(Elf32_Dyn::DT_GNU_HASH);
|
||||
//hashtab= (unsigned int const *)elf_find_dynamic(Elf32_Dyn::DT_HASH);
|
||||
dynstr= (char const *)elf_find_dynamic(Elf32_Dyn::DT_STRTAB);
|
||||
dynsym= (Elf32_Sym const *)elf_find_dynamic(Elf32_Dyn::DT_SYMTAB);
|
||||
Elf32_Rel const *
|
||||
jmprel= (Elf32_Rel const *)elf_find_dynamic(Elf32_Dyn::DT_JMPREL);
|
||||
//unsigned const sz_1pltrel =
|
||||
// (Elf32_Dyn::DT_REL==elf_unsigned_dynamic(Elf32_Dyn::DT_PLTREL))
|
||||
// ? elf_unsigned_dynamic(Elf32_Dyn::DT_RELENT)
|
||||
// : elf_unsigned_dynamic(Elf32_Dyn::DT_RELAENT);
|
||||
|
||||
// Modified 2009-10-10 to detect a ProgramLinkageTable relocation
|
||||
// which references the symbol, because DT_GNU_HASH contains only
|
||||
// defined symbols, and there might be no DT_HASH.
|
||||
|
||||
Elf32_Rel const *
|
||||
jmprel= (Elf32_Rel const *)elf_find_dynamic(Elf32_Dyn::DT_JMPREL);
|
||||
for ( int sz = elf_unsigned_dynamic(Elf32_Dyn::DT_PLTRELSZ);
|
||||
0 < sz;
|
||||
(sz -= sizeof(Elf32_Rel)), ++jmprel) {
|
||||
unsigned const symnum = jmprel->r_info >> 8;
|
||||
(sz -= sizeof(Elf32_Rel)), ++jmprel
|
||||
) {
|
||||
unsigned const symnum = get_te32(&jmprel->r_info) >> 8;
|
||||
char const *const symnam = get_te32(&dynsym[symnum].st_name) + dynstr;
|
||||
if (0==strcmp(symnam, "__libc_start_main")
|
||||
|| 0==strcmp(symnam, "__uClibc_main")
|
||||
|| 0==strcmp(symnam, "__uClibc_start_main"))
|
||||
goto main_found;
|
||||
goto proceed;
|
||||
}
|
||||
phdri = 0;
|
||||
|
||||
// Heuristic HACK for shared libraries (compare Darwin (MacOS) Dylib.)
|
||||
// If there is an existing DT_INIT, and if everything that the dynamic
|
||||
// linker ld-linux needs to perform relocations before calling DT_INIT
|
||||
// resides below the first SHT_EXECINSTR Section in one PT_LOAD, then
|
||||
// compress from the first executable Section to the end of that PT_LOAD.
|
||||
// We must not alter anything that ld-linux might touch before it calls
|
||||
// the DT_INIT function.
|
||||
//
|
||||
// Obviously this hack requires that the linker script put pieces
|
||||
// into good positions when building the original shared library,
|
||||
// and also requires ld-linux to behave.
|
||||
|
||||
if (elf_find_dynamic(Elf32_Dyn::DT_INIT)) {
|
||||
Elf32_Shdr const *shdr = shdri;
|
||||
xct_va = ~0u;
|
||||
for (j= n_elf_shnum; --j>=0; ++shdr) {
|
||||
if (Elf32_Shdr::SHF_EXECINSTR & get_te32(&shdr->sh_flags)) {
|
||||
xct_va = umin(xct_va, get_te32(&shdr->sh_addr));
|
||||
}
|
||||
}
|
||||
// Rely on 0==elf_unsigned_dynamic(tag) if no such tag.
|
||||
unsigned const va_gash = elf_unsigned_dynamic(Elf32_Dyn::DT_GNU_HASH);
|
||||
unsigned const va_hash = elf_unsigned_dynamic(Elf32_Dyn::DT_HASH);
|
||||
if (xct_va < va_gash || (0==va_gash && xct_va < va_hash)
|
||||
|| xct_va < elf_unsigned_dynamic(Elf32_Dyn::DT_STRTAB)
|
||||
|| xct_va < elf_unsigned_dynamic(Elf32_Dyn::DT_SYMTAB)
|
||||
|| xct_va < elf_unsigned_dynamic(Elf32_Dyn::DT_REL)
|
||||
|| xct_va < elf_unsigned_dynamic(Elf32_Dyn::DT_RELA)
|
||||
|| xct_va < elf_unsigned_dynamic(Elf32_Dyn::DT_JMPREL)
|
||||
|| xct_va < elf_unsigned_dynamic(Elf32_Dyn::DT_VERDEF)
|
||||
|| xct_va < elf_unsigned_dynamic(Elf32_Dyn::DT_VERSYM)
|
||||
|| xct_va < elf_unsigned_dynamic(Elf32_Dyn::DT_VERNEEDED) ) {
|
||||
goto abandon;
|
||||
}
|
||||
for ((shdr= shdri), (j= n_elf_shnum); --j>=0; ++shdr) {
|
||||
if ( shdr->sh_addr==va_gash
|
||||
|| (shdr->sh_addr==va_hash && 0==va_gash) ) {
|
||||
shdr= &shdri[shdr->sh_link]; // the associated SHT_SYMTAB
|
||||
hatch_off = (char *)&ehdri.e_ident[12] - (char *)&ehdri;
|
||||
hatch_va = hatch_off + va_load;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// FIXME: DT_TEXTREL
|
||||
xct_off = elf_get_offset_from_address(xct_va);
|
||||
goto proceed; // But proper packing depends on checking xct_va.
|
||||
}
|
||||
abandon:
|
||||
phdri = 0; // Done with this
|
||||
return false;
|
||||
main_found:
|
||||
proceed:
|
||||
phdri = 0;
|
||||
}
|
||||
// XXX Theoretically the following test should be first,
|
||||
|
@ -1026,7 +1180,6 @@ PackLinuxElf64amd::canPack()
|
|||
}
|
||||
|
||||
// The first PT_LOAD64 must cover the beginning of the file (0==p_offset).
|
||||
unsigned const e_phnum = get_te16(&ehdr->e_phnum);
|
||||
Elf64_Phdr const *phdr = (Elf64_Phdr const *)(u.buf + (unsigned) e_phoff);
|
||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||
if (j >= 14)
|
||||
|
@ -1125,9 +1278,8 @@ PackLinuxElf32::generateElfHdr(
|
|||
|
||||
sz_elf_hdrs = sizeof(*h2) - sizeof(linfo); // default
|
||||
set_te32(&h2->phdr[0].p_filesz, sizeof(*h2)); // + identsize;
|
||||
h2->phdr[0].p_memsz = h2->phdr[0].p_filesz;
|
||||
h2->phdr[0].p_memsz = h2->phdr[0].p_filesz;
|
||||
|
||||
unsigned const e_phnum = get_te16(&ehdri.e_phnum);
|
||||
Elf32_Phdr const *phdr = phdri;
|
||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||
if (phdr->PT_LOAD32 == get_te32(&phdr->p_type)) {
|
||||
|
@ -1251,7 +1403,6 @@ PackLinuxElf64::generateElfHdr(
|
|||
set_te64(&h2->phdr[0].p_filesz, sizeof(*h2)); // + identsize;
|
||||
h2->phdr[0].p_memsz = h2->phdr[0].p_filesz;
|
||||
|
||||
unsigned const e_phnum = get_te16(&ehdri.e_phnum);
|
||||
Elf64_Phdr const *phdr = phdri;
|
||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||
if (phdr->PT_LOAD64 == get_te64(&phdr->p_type)) {
|
||||
|
@ -1295,7 +1446,6 @@ void PackLinuxElf32::pack1(OutputFile */*fo*/, Filter &/*ft*/)
|
|||
fi->seek(0, SEEK_SET);
|
||||
fi->readx(&ehdri, sizeof(ehdri));
|
||||
unsigned const e_phoff = get_te32(&ehdri.e_phoff);
|
||||
unsigned const e_phnum = get_te16(&ehdri.e_phnum);
|
||||
assert(e_phoff == sizeof(Elf32_Ehdr)); // checked by canPack()
|
||||
sz_phdrs = e_phnum * get_te16(&ehdri.e_phentsize);
|
||||
|
||||
|
@ -1309,13 +1459,23 @@ void PackLinuxElf32::pack1(OutputFile */*fo*/, Filter &/*ft*/)
|
|||
void PackLinuxElf32x86::pack1(OutputFile *fo, Filter &ft)
|
||||
{
|
||||
PackLinuxElf32::pack1(fo, ft);
|
||||
generateElfHdr(fo, stub_i386_linux_elf_fold, getbrk(phdri, get_te16(&ehdri.e_phnum)) );
|
||||
if (0==xct_off) // main executable
|
||||
generateElfHdr(fo, stub_i386_linux_elf_fold,
|
||||
getbrk(phdri, e_phnum) );
|
||||
else { // shared library
|
||||
fi->seek(0, SEEK_SET);
|
||||
fi->readx(ibuf, xct_off);
|
||||
|
||||
sz_elf_hdrs = xct_off - sizeof(l_info);
|
||||
fo->write(ibuf, xct_off);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void PackBSDElf32x86::pack1(OutputFile *fo, Filter &ft)
|
||||
{
|
||||
PackLinuxElf32::pack1(fo, ft);
|
||||
generateElfHdr(fo, stub_i386_bsd_elf_fold, getbrk(phdri, get_te16(&ehdri.e_phnum)) );
|
||||
generateElfHdr(fo, stub_i386_bsd_elf_fold, getbrk(phdri, e_phnum) );
|
||||
}
|
||||
|
||||
void PackLinuxElf32armLe::pack1(OutputFile *fo, Filter &ft)
|
||||
|
@ -1331,7 +1491,7 @@ void PackLinuxElf32armLe::pack1(OutputFile *fo, Filter &ft)
|
|||
else {
|
||||
memcpy(&h3, stub_arm_linux_elf_fold, sizeof(Elf32_Ehdr) + 2*sizeof(Elf32_Phdr));
|
||||
}
|
||||
generateElfHdr(fo, &h3, getbrk(phdri, get_te16(&ehdri.e_phnum)) );
|
||||
generateElfHdr(fo, &h3, getbrk(phdri, e_phnum) );
|
||||
}
|
||||
|
||||
void PackLinuxElf32armBe::pack1(OutputFile *fo, Filter &ft)
|
||||
|
@ -1339,7 +1499,7 @@ void PackLinuxElf32armBe::pack1(OutputFile *fo, Filter &ft)
|
|||
super::pack1(fo, ft);
|
||||
cprElfHdr3 h3;
|
||||
memcpy(&h3, stub_armeb_linux_elf_fold, sizeof(Elf32_Ehdr) + 2*sizeof(Elf32_Phdr));
|
||||
generateElfHdr(fo, &h3, getbrk(phdri, get_te16(&ehdri.e_phnum)) );
|
||||
generateElfHdr(fo, &h3, getbrk(phdri, e_phnum) );
|
||||
}
|
||||
|
||||
void PackLinuxElf32mipsel::pack1(OutputFile *fo, Filter &ft)
|
||||
|
@ -1347,7 +1507,7 @@ void PackLinuxElf32mipsel::pack1(OutputFile *fo, Filter &ft)
|
|||
super::pack1(fo, ft);
|
||||
cprElfHdr3 h3;
|
||||
memcpy(&h3, stub_mipsel_r3000_linux_elf_fold, sizeof(Elf32_Ehdr) + 2*sizeof(Elf32_Phdr));
|
||||
generateElfHdr(fo, &h3, getbrk(phdri, get_te16(&ehdri.e_phnum)) );
|
||||
generateElfHdr(fo, &h3, getbrk(phdri, e_phnum) );
|
||||
}
|
||||
|
||||
void PackLinuxElf32mipseb::pack1(OutputFile *fo, Filter &ft)
|
||||
|
@ -1355,13 +1515,13 @@ void PackLinuxElf32mipseb::pack1(OutputFile *fo, Filter &ft)
|
|||
super::pack1(fo, ft);
|
||||
cprElfHdr3 h3;
|
||||
memcpy(&h3, stub_mips_r3000_linux_elf_fold, sizeof(Elf32_Ehdr) + 2*sizeof(Elf32_Phdr));
|
||||
generateElfHdr(fo, &h3, getbrk(phdri, get_te16(&ehdri.e_phnum)) );
|
||||
generateElfHdr(fo, &h3, getbrk(phdri, e_phnum) );
|
||||
}
|
||||
|
||||
void PackLinuxElf32ppc::pack1(OutputFile *fo, Filter &ft)
|
||||
{
|
||||
super::pack1(fo, ft);
|
||||
generateElfHdr(fo, stub_powerpc_linux_elf_fold, getbrk(phdri, get_te16(&ehdri.e_phnum)) );
|
||||
generateElfHdr(fo, stub_powerpc_linux_elf_fold, getbrk(phdri, e_phnum) );
|
||||
}
|
||||
|
||||
void PackLinuxElf64::pack1(OutputFile */*fo*/, Filter &/*ft*/)
|
||||
|
@ -1369,7 +1529,6 @@ void PackLinuxElf64::pack1(OutputFile */*fo*/, Filter &/*ft*/)
|
|||
fi->seek(0, SEEK_SET);
|
||||
fi->readx(&ehdri, sizeof(ehdri));
|
||||
unsigned const e_phoff = get_te32(&ehdri.e_phoff);
|
||||
unsigned const e_phnum = get_te16(&ehdri.e_phnum);
|
||||
assert(e_phoff == sizeof(Elf64_Ehdr)); // checked by canPack()
|
||||
sz_phdrs = e_phnum * get_te16(&ehdri.e_phentsize);
|
||||
|
||||
|
@ -1383,7 +1542,7 @@ void PackLinuxElf64::pack1(OutputFile */*fo*/, Filter &/*ft*/)
|
|||
void PackLinuxElf64amd::pack1(OutputFile *fo, Filter &ft)
|
||||
{
|
||||
super::pack1(fo, ft);
|
||||
generateElfHdr(fo, stub_amd64_linux_elf_fold, getbrk(phdri, get_te16(&ehdri.e_phnum)) );
|
||||
generateElfHdr(fo, stub_amd64_linux_elf_fold, getbrk(phdri, e_phnum) );
|
||||
}
|
||||
|
||||
// Determine length of gap between PT_LOAD phdr[k] and closest PT_LOAD
|
||||
|
@ -1428,10 +1587,26 @@ void PackLinuxElf32::pack2(OutputFile *fo, Filter &ft)
|
|||
{
|
||||
Extent x;
|
||||
unsigned k;
|
||||
bool is_shlib = (0!=xct_off);
|
||||
|
||||
if (0) { // Only to make unpacking easier!
|
||||
struct b_info h; memset(&h, 0, sizeof(h));
|
||||
h.sz_unc = sizeof(ehdri) + sizeof(*phdri) * e_phnum;
|
||||
h.b_method = (unsigned char) ph.method;
|
||||
int const r = upx_compress(ibuf, h.sz_unc, obuf, &h.sz_cpr,
|
||||
NULL, ph.method, 10, NULL, NULL );
|
||||
if (r != UPX_E_OK || h.sz_cpr >= h.sz_unc)
|
||||
throwInternalError("loader compression failed");
|
||||
|
||||
unsigned const clen = h.sz_cpr;
|
||||
set_te32(&h.sz_unc, h.sz_unc);
|
||||
set_te32(&h.sz_cpr, h.sz_cpr);
|
||||
fo->write(&h, sizeof(h));
|
||||
fo->write(obuf, clen);
|
||||
}
|
||||
|
||||
// count passes, set ptload vars
|
||||
uip->ui_total_passes = 0;
|
||||
unsigned const e_phnum = get_te16(&ehdri.e_phnum);
|
||||
for (k = 0; k < e_phnum; ++k) {
|
||||
if (PT_LOAD32 == get_te32(&phdri[k].p_type)) {
|
||||
uip->ui_total_passes++;
|
||||
|
@ -1442,11 +1617,11 @@ void PackLinuxElf32::pack2(OutputFile *fo, Filter &ft)
|
|||
}
|
||||
|
||||
// compress extents
|
||||
unsigned total_in = 0;
|
||||
unsigned total_out = 0;
|
||||
|
||||
unsigned hdr_u_len = sizeof(Elf32_Ehdr) + sz_phdrs;
|
||||
|
||||
unsigned total_in = xct_off - (is_shlib ? hdr_u_len : 0);
|
||||
unsigned total_out = xct_off;
|
||||
|
||||
uip->ui_pass = 0;
|
||||
ft.addvalue = 0;
|
||||
|
||||
|
@ -1458,19 +1633,24 @@ void PackLinuxElf32::pack2(OutputFile *fo, Filter &ft)
|
|||
x.offset = get_te32(&phdri[k].p_offset);
|
||||
x.size = get_te32(&phdri[k].p_filesz);
|
||||
if (0 == nx) { // 1st PT_LOAD32 must cover Ehdr at 0==p_offset
|
||||
unsigned const delta = sizeof(Elf32_Ehdr) + sz_phdrs;
|
||||
unsigned const delta = !is_shlib
|
||||
? (sizeof(Elf32_Ehdr) + sz_phdrs) // main executable
|
||||
: xct_off; // shared library
|
||||
if (ft.id < 0x40) {
|
||||
// FIXME: ?? ft.addvalue += delta;
|
||||
}
|
||||
x.offset += delta;
|
||||
x.size -= delta;
|
||||
x.offset += delta;
|
||||
x.size -= delta;
|
||||
}
|
||||
// compressWithFilters() always assumes a "loader", so would
|
||||
// throw NotCompressible for small .data Extents, which PowerPC
|
||||
// sometimes marks as PF_X anyway. So filter only first segment.
|
||||
if (0==nx || !is_shlib)
|
||||
packExtent(x, total_in, total_out,
|
||||
((0==nx && (Elf32_Phdr::PF_X & get_te32(&phdri[k].p_flags)))
|
||||
? &ft : 0 ), fo, hdr_u_len);
|
||||
else
|
||||
total_in += x.size;
|
||||
hdr_u_len = 0;
|
||||
++nx;
|
||||
}
|
||||
|
@ -1532,7 +1712,6 @@ void PackLinuxElf64::pack2(OutputFile *fo, Filter &ft)
|
|||
|
||||
// count passes, set ptload vars
|
||||
uip->ui_total_passes = 0;
|
||||
unsigned const e_phnum = get_te16(&ehdri.e_phnum);
|
||||
for (k = 0; k < e_phnum; ++k) {
|
||||
if (PT_LOAD64==get_te32(&phdri[k].p_type)) {
|
||||
uip->ui_total_passes++;
|
||||
|
@ -1647,7 +1826,7 @@ void PackLinuxElf32::ARM_defineSymbols(Filter const * /*ft*/)
|
|||
set_te32(&elfout.phdr[0].p_paddr, lo_va_user);
|
||||
lo_va_stub = lo_va_user;
|
||||
adrc = lo_va_stub;
|
||||
adrm = getbrk(phdri, get_te16(&ehdri.e_phnum));
|
||||
adrm = getbrk(phdri, e_phnum);
|
||||
adrx = hlen + (page_mask & (~page_mask + adrm)); // round up to page boundary
|
||||
}
|
||||
adrm = page_mask & (~page_mask + adrm); // round up to page boundary
|
||||
|
@ -1679,7 +1858,7 @@ void PackLinuxElf32mipseb::defineSymbols(Filter const * /*ft*/)
|
|||
// size (total over all PT_LOAD32) as an upper bound.
|
||||
unsigned len = 0;
|
||||
unsigned lo_va_user = ~0u; // infinity
|
||||
for (int j= get_te16(&ehdri.e_phnum); --j>=0; ) {
|
||||
for (int j= e_phnum; --j>=0; ) {
|
||||
if (PT_LOAD32 == get_te32(&phdri[j].p_type)) {
|
||||
len += (unsigned)get_te32(&phdri[j].p_filesz);
|
||||
unsigned const va = get_te32(&phdri[j].p_vaddr);
|
||||
|
@ -1706,7 +1885,7 @@ void PackLinuxElf32mipseb::defineSymbols(Filter const * /*ft*/)
|
|||
set_te32(&elfout.phdr[0].p_paddr, lo_va_user);
|
||||
lo_va_stub = lo_va_user;
|
||||
adrc = lo_va_stub;
|
||||
adrm = getbrk(phdri, get_te16(&ehdri.e_phnum));
|
||||
adrm = getbrk(phdri, e_phnum);
|
||||
adru = page_mask & (~page_mask + adrm); // round up to page boundary
|
||||
adrx = adru + hlen;
|
||||
lenm = page_size + len;
|
||||
|
@ -1751,7 +1930,7 @@ void PackLinuxElf32mipsel::defineSymbols(Filter const * /*ft*/)
|
|||
// size (total over all PT_LOAD32) as an upper bound.
|
||||
unsigned len = 0;
|
||||
unsigned lo_va_user = ~0u; // infinity
|
||||
for (int j= get_te16(&ehdri.e_phnum); --j>=0; ) {
|
||||
for (int j= e_phnum; --j>=0; ) {
|
||||
if (PT_LOAD32 == get_te32(&phdri[j].p_type)) {
|
||||
len += (unsigned)get_te32(&phdri[j].p_filesz);
|
||||
unsigned const va = get_te32(&phdri[j].p_vaddr);
|
||||
|
@ -1778,7 +1957,7 @@ void PackLinuxElf32mipsel::defineSymbols(Filter const * /*ft*/)
|
|||
set_te32(&elfout.phdr[0].p_paddr, lo_va_user);
|
||||
lo_va_stub = lo_va_user;
|
||||
adrc = lo_va_stub;
|
||||
adrm = getbrk(phdri, get_te16(&ehdri.e_phnum));
|
||||
adrm = getbrk(phdri, e_phnum);
|
||||
adru = page_mask & (~page_mask + adrm); // round up to page boundary
|
||||
adrx = adru + hlen;
|
||||
lenm = page_size + len;
|
||||
|
@ -1845,20 +2024,31 @@ void PackLinuxElf32::pack4(OutputFile *fo, Filter &ft)
|
|||
// Strict SELinux (or PaX, grSecurity) disallows PF_W with PF_X
|
||||
//elfout.phdr[0].p_flags |= Elf32_Phdr::PF_W;
|
||||
}
|
||||
|
||||
fo->seek(0, SEEK_SET);
|
||||
if (Elf32_Phdr::PT_NOTE==get_te32(&elfout.phdr[2].p_type)) {
|
||||
unsigned const reloc = get_te32(&elfout.phdr[0].p_vaddr);
|
||||
set_te32( &elfout.phdr[2].p_vaddr,
|
||||
reloc + get_te32(&elfout.phdr[2].p_vaddr));
|
||||
set_te32( &elfout.phdr[2].p_paddr,
|
||||
reloc + get_te32(&elfout.phdr[2].p_paddr));
|
||||
fo->rewrite(&elfout, sz_elf_hdrs);
|
||||
fo->rewrite(&elfnote, sizeof(elfnote));
|
||||
if (0!=xct_off) { // shared library
|
||||
ehdri.e_ident[0+hatch_off] = 0xcd; // INT 0x80 (syscall [munmap])
|
||||
ehdri.e_ident[1+hatch_off] = 0x80;
|
||||
ehdri.e_ident[2+hatch_off] = 0x61; // POPA
|
||||
ehdri.e_ident[3+hatch_off] = 0xc3; // RET
|
||||
fo->rewrite(&ehdri, sizeof(ehdri));
|
||||
fo->rewrite(phdri, e_phnum * sizeof(*phdri));
|
||||
}
|
||||
else {
|
||||
fo->rewrite(&elfout, sz_elf_hdrs);
|
||||
if (Elf32_Phdr::PT_NOTE==get_te32(&elfout.phdr[2].p_type)) {
|
||||
unsigned const reloc = get_te32(&elfout.phdr[0].p_vaddr);
|
||||
set_te32( &elfout.phdr[2].p_vaddr,
|
||||
reloc + get_te32(&elfout.phdr[2].p_vaddr));
|
||||
set_te32( &elfout.phdr[2].p_paddr,
|
||||
reloc + get_te32(&elfout.phdr[2].p_paddr));
|
||||
fo->rewrite(&elfout, sz_elf_hdrs);
|
||||
fo->rewrite(&elfnote, sizeof(elfnote));
|
||||
}
|
||||
else {
|
||||
fo->rewrite(&elfout, sz_elf_hdrs);
|
||||
}
|
||||
fo->rewrite(&linfo, sizeof(linfo));
|
||||
}
|
||||
fo->rewrite(&linfo, sizeof(linfo));
|
||||
}
|
||||
|
||||
void PackLinuxElf64::pack4(OutputFile *fo, Filter &ft)
|
||||
|
@ -1924,8 +2114,20 @@ void PackLinuxElf32::unpack(OutputFile *fo)
|
|||
ph.filter_cto = bhdr.b_cto8;
|
||||
|
||||
// Uncompress Ehdr and Phdrs.
|
||||
bool is_shlib = (sizeof(u) < ph.u_len);
|
||||
if (is_shlib) {
|
||||
fi->seek(0, SEEK_SET);
|
||||
fi->readx(ibuf, file_size); // the whole compressed file
|
||||
// FIXME: re-construct original Ehdr and Phdrs in ibuf
|
||||
fo->write(ibuf, overlay_offset);
|
||||
// FIXME: not finished
|
||||
return;
|
||||
}
|
||||
fi->readx(ibuf, ph.c_len);
|
||||
decompress(ibuf, (upx_byte *)ehdr, false);
|
||||
if (!is_shlib) {
|
||||
decompress(ibuf, (upx_byte *)ehdr, false);
|
||||
fi->seek(- (off_t) (szb_info + ph.c_len), SEEK_CUR);
|
||||
}
|
||||
|
||||
unsigned total_in = 0;
|
||||
unsigned total_out = 0;
|
||||
|
@ -1934,9 +2136,7 @@ void PackLinuxElf32::unpack(OutputFile *fo)
|
|||
|
||||
// decompress PT_LOAD32
|
||||
bool first_PF_X = true;
|
||||
unsigned const phnum = get_te16(&ehdr->e_phnum);
|
||||
fi->seek(- (off_t) (szb_info + ph.c_len), SEEK_CUR);
|
||||
for (unsigned j=0; j < phnum; ++phdr, ++j) {
|
||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||
if (PT_LOAD32==get_te32(&phdr->p_type)) {
|
||||
unsigned const filesz = get_te32(&phdr->p_filesz);
|
||||
unsigned const offset = get_te32(&phdr->p_offset);
|
||||
|
@ -1955,8 +2155,8 @@ void PackLinuxElf32::unpack(OutputFile *fo)
|
|||
}
|
||||
|
||||
phdr = (Elf32_Phdr *) (u.buf + sizeof(*ehdr));
|
||||
for (unsigned j = 0; j < phnum; ++j) {
|
||||
unsigned const size = find_LOAD_gap(phdr, j, phnum);
|
||||
for (unsigned j = 0; j < e_phnum; ++j) {
|
||||
unsigned const size = find_LOAD_gap(phdr, j, e_phnum);
|
||||
if (size) {
|
||||
unsigned const where = get_te32(&phdr[j].p_offset) +
|
||||
get_te32(&phdr[j].p_filesz);
|
||||
|
@ -2042,9 +2242,8 @@ void PackLinuxElf64::unpack(OutputFile *fo)
|
|||
|
||||
// decompress PT_LOAD32
|
||||
bool first_PF_X = true;
|
||||
unsigned const phnum = get_te16(&ehdr->e_phnum);
|
||||
fi->seek(- (off_t) (szb_info + ph.c_len), SEEK_CUR);
|
||||
for (unsigned j=0; j < phnum; ++phdr, ++j) {
|
||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||
if (PT_LOAD32==get_te32(&phdr->p_type)) {
|
||||
acc_uint64l_t const filesz = get_te64(&phdr->p_filesz);
|
||||
acc_uint64l_t const offset = get_te64(&phdr->p_offset);
|
||||
|
@ -2063,8 +2262,8 @@ void PackLinuxElf64::unpack(OutputFile *fo)
|
|||
}
|
||||
|
||||
phdr = (Elf64_Phdr *) (u.buf + sizeof(*ehdr));
|
||||
for (unsigned j = 0; j < phnum; ++j) {
|
||||
unsigned const size = find_LOAD_gap(phdr, j, phnum);
|
||||
for (unsigned j = 0; j < e_phnum; ++j) {
|
||||
unsigned const size = find_LOAD_gap(phdr, j, e_phnum);
|
||||
if (size) {
|
||||
unsigned const where = get_te64(&phdr[j].p_offset) +
|
||||
get_te64(&phdr[j].p_filesz);
|
||||
|
@ -2260,7 +2459,7 @@ unsigned
|
|||
PackLinuxElf32::elf_get_offset_from_address(unsigned const addr) const
|
||||
{
|
||||
Elf32_Phdr const *phdr = phdri;
|
||||
int j = get_te16(&ehdri.e_phnum);
|
||||
int j = e_phnum;
|
||||
for (; --j>=0; ++phdr) if (PT_LOAD32 == get_te32(&phdr->p_type)) {
|
||||
unsigned const t = addr - get_te32(&phdr->p_vaddr);
|
||||
if (t < get_te32(&phdr->p_filesz)) {
|
||||
|
@ -2285,7 +2484,7 @@ PackLinuxElf32::elf_find_dynamic(unsigned int const key) const
|
|||
return 0;
|
||||
}
|
||||
|
||||
unsigned
|
||||
uint64_t
|
||||
PackLinuxElf32::elf_unsigned_dynamic(unsigned int const key) const
|
||||
{
|
||||
Elf32_Dyn const *dynp= dynseg;
|
||||
|
@ -2296,6 +2495,46 @@ PackLinuxElf32::elf_unsigned_dynamic(unsigned int const key) const
|
|||
return 0;
|
||||
}
|
||||
|
||||
unsigned
|
||||
PackLinuxElf64::elf_get_offset_from_address(unsigned const addr) const
|
||||
{
|
||||
Elf64_Phdr const *phdr = phdri;
|
||||
int j = e_phnum;
|
||||
for (; --j>=0; ++phdr) if (PT_LOAD64 == get_te64(&phdr->p_type)) {
|
||||
unsigned const t = addr - get_te64(&phdr->p_vaddr);
|
||||
if (t < get_te64(&phdr->p_filesz)) {
|
||||
return t + get_te64(&phdr->p_offset);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void const *
|
||||
PackLinuxElf64::elf_find_dynamic(unsigned int const key) const
|
||||
{
|
||||
Elf64_Dyn const *dynp= dynseg;
|
||||
if (dynp)
|
||||
for (; Elf64_Dyn::DT_NULL!=dynp->d_tag; ++dynp) if (get_te64(&dynp->d_tag)==key) {
|
||||
unsigned const t= elf_get_offset_from_address(get_te64(&dynp->d_val));
|
||||
if (t) {
|
||||
return t + file_image;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
PackLinuxElf64::elf_unsigned_dynamic(unsigned int const key) const
|
||||
{
|
||||
Elf64_Dyn const *dynp= dynseg;
|
||||
if (dynp)
|
||||
for (; Elf64_Dyn::DT_NULL!=dynp->d_tag; ++dynp) if (get_te64(&dynp->d_tag)==key) {
|
||||
return get_te64(&dynp->d_val);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned PackLinuxElf32::gnu_hash(char const *q)
|
||||
{
|
||||
unsigned char const *p = (unsigned char const *)q;
|
||||
|
@ -2378,7 +2617,10 @@ void PackLinuxElf32x86::unpack(OutputFile *fo)
|
|||
//struct { Elf32_Ehdr ehdr; Elf32_Phdr phdr; } e;
|
||||
} u;
|
||||
Elf32_Ehdr *const ehdr = (Elf32_Ehdr *) u.buf;
|
||||
Elf32_Phdr const *phdr = (Elf32_Phdr *) (u.buf + sizeof(*ehdr));
|
||||
Elf32_Phdr *phdr = (Elf32_Phdr *) (u.buf + sizeof(*ehdr));
|
||||
unsigned old_data_off = 0;
|
||||
unsigned old_data_len = 0;
|
||||
unsigned old_dtinit = 0;
|
||||
|
||||
unsigned szb_info = sizeof(b_info);
|
||||
{
|
||||
|
@ -2392,6 +2634,7 @@ void PackLinuxElf32x86::unpack(OutputFile *fo)
|
|||
szb_info = 2*sizeof(unsigned);
|
||||
}
|
||||
}
|
||||
old_dtinit = ehdr->e_shoff;
|
||||
|
||||
fi->seek(overlay_offset, SEEK_SET);
|
||||
p_info hbuf;
|
||||
|
@ -2407,39 +2650,86 @@ void PackLinuxElf32x86::unpack(OutputFile *fo)
|
|||
ph.u_len = get_te32(&bhdr.sz_unc);
|
||||
ph.c_len = get_te32(&bhdr.sz_cpr);
|
||||
ph.filter_cto = bhdr.b_cto8;
|
||||
bool const is_shlib = ehdr->e_ident[12]==0xcd;
|
||||
|
||||
// Uncompress Ehdr and Phdrs.
|
||||
// Peek at resulting Ehdr and Phdrs for use in controlling unpacking.
|
||||
// Uncompress an extra time, and don't verify or update checksums.
|
||||
if (ibuf.getSize() < ph.c_len || sizeof(u) < ph.u_len)
|
||||
throwCompressedDataViolation();
|
||||
fi->readx(ibuf, ph.c_len);
|
||||
decompress(ibuf, (upx_byte *)ehdr, false);
|
||||
fi->seek(- (off_t) (szb_info + ph.c_len), SEEK_CUR);
|
||||
|
||||
unsigned total_in = 0;
|
||||
unsigned total_out = 0;
|
||||
unsigned c_adler = upx_adler32(NULL, 0);
|
||||
unsigned u_adler = upx_adler32(NULL, 0);
|
||||
|
||||
// decompress PT_LOAD32
|
||||
bool first_PF_X = true;
|
||||
fi->seek(- (off_t) (szb_info + ph.c_len), SEEK_CUR);
|
||||
unsigned const phnum = get_te16(&ehdr->e_phnum);
|
||||
for (unsigned j=0; j < phnum; ++phdr, ++j) {
|
||||
if (PT_LOAD32==get_te32(&phdr->p_type)) {
|
||||
if (fo)
|
||||
fo->seek(get_te32(&phdr->p_offset), SEEK_SET);
|
||||
if (Elf32_Phdr::PF_X & phdr->p_flags) {
|
||||
unpackExtent(get_te32(&phdr->p_filesz), fo, total_in, total_out,
|
||||
c_adler, u_adler, first_PF_X, szb_info);
|
||||
first_PF_X = false;
|
||||
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,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
|
||||
// The first PT_LOAD. Part is not compressed (for benefit of rtld.)
|
||||
// Read enough to position the input for next unpackExtent.
|
||||
fi->seek(0, SEEK_SET);
|
||||
fi->readx(ibuf, overlay_offset + sizeof(hbuf) + szb_info + ph.c_len);
|
||||
if (fo) {
|
||||
fo->write(ibuf + ph.u_len, overlay_offset - ph.u_len);
|
||||
}
|
||||
// Search the Phdrs of compressed
|
||||
int n_ptload = 0;
|
||||
phdr = (Elf32_Phdr *)(1+ (Elf32_Ehdr *)(unsigned char *)ibuf);
|
||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||
if (PT_LOAD32==get_te32(&phdr->p_type) && 0!=n_ptload++) {
|
||||
old_data_off = get_te32(&phdr->p_offset);
|
||||
old_data_len = get_te32(&phdr->p_filesz);
|
||||
break;
|
||||
}
|
||||
else {
|
||||
unpackExtent(get_te32(&phdr->p_filesz), fo, total_in, total_out,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
}
|
||||
|
||||
total_in = overlay_offset;
|
||||
total_out = overlay_offset;
|
||||
ph.u_len = 0;
|
||||
|
||||
// Decompress and unfilter the tail of first PT_LOAD.
|
||||
phdr = (Elf32_Phdr *)(1+ ehdr);
|
||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||
if (PT_LOAD32==get_te32(&phdr->p_type)) {
|
||||
ph.u_len = get_te32(&phdr->p_filesz) - overlay_offset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
unpackExtent(ph.u_len, fo, total_in, total_out,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
}
|
||||
else { // main executable
|
||||
// Decompress each PT_LOAD.
|
||||
bool first_PF_X = true;
|
||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||
if (PT_LOAD32==get_te32(&phdr->p_type)) {
|
||||
unsigned const filesz = get_te32(&phdr->p_filesz);
|
||||
unsigned const offset = get_te32(&phdr->p_offset);
|
||||
if (fo)
|
||||
fo->seek(offset, SEEK_SET);
|
||||
if (Elf32_Phdr::PF_X & get_te32(&phdr->p_flags)) {
|
||||
unpackExtent(filesz, fo, total_in, total_out,
|
||||
c_adler, u_adler, first_PF_X, szb_info);
|
||||
first_PF_X = false;
|
||||
}
|
||||
else {
|
||||
unpackExtent(filesz, fo, total_in, total_out,
|
||||
c_adler, u_adler, false, szb_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The gaps between PT_LOAD and after last PT_LOAD
|
||||
phdr = (Elf32_Phdr *) (u.buf + sizeof(*ehdr));
|
||||
for (unsigned j = 0; j < phnum; ++j) {
|
||||
unsigned const size = find_LOAD_gap(phdr, j, phnum);
|
||||
for (unsigned j = 0; j < e_phnum; ++j) {
|
||||
unsigned const size = find_LOAD_gap(phdr, j, e_phnum);
|
||||
if (size) {
|
||||
unsigned const where = get_te32(&phdr[j].p_offset) +
|
||||
get_te32(&phdr[j].p_filesz);
|
||||
|
@ -2464,6 +2754,45 @@ void PackLinuxElf32x86::unpack(OutputFile *fo)
|
|||
throwCompressedDataViolation();
|
||||
}
|
||||
|
||||
if (is_shlib) { // the non-first PT_LOAD
|
||||
int n_ptload = 0;
|
||||
unsigned load_off = 0;
|
||||
phdr = (Elf32_Phdr *) (u.buf + sizeof(*ehdr));
|
||||
for (unsigned j= 0; j < e_phnum; ++j, ++phdr) {
|
||||
if (PT_LOAD32==get_te32(&phdr->p_type) && 0!=n_ptload++) {
|
||||
load_off = get_te32(&phdr->p_offset);
|
||||
fi->seek(old_data_off, SEEK_SET);
|
||||
fi->readx(ibuf, old_data_len);
|
||||
total_in += old_data_len;
|
||||
total_out += old_data_len;
|
||||
if (fo) {
|
||||
fo->seek(get_te32(&phdr->p_offset), SEEK_SET);
|
||||
fo->rewrite(ibuf, old_data_len);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Restore DT_INIT.d_val
|
||||
phdr = (Elf32_Phdr *) (u.buf + sizeof(*ehdr));
|
||||
for (unsigned j= 0; j < e_phnum; ++j, ++phdr) {
|
||||
if (phdr->PT_DYNAMIC==get_te32(&phdr->p_type)) {
|
||||
unsigned const dyn_off = get_te32(&phdr->p_offset);
|
||||
unsigned const dyn_len = get_te32(&phdr->p_filesz);
|
||||
Elf32_Dyn *dyn = (Elf32_Dyn *)((unsigned char *)ibuf +
|
||||
(dyn_off - load_off));
|
||||
for (unsigned j= 0; j < dyn_len; ++dyn, j += sizeof(*dyn)) {
|
||||
if (dyn->DT_INIT==get_te32(&dyn->d_tag)) {
|
||||
if (fo) {
|
||||
fo->seek(sizeof(unsigned) + j + dyn_off, SEEK_SET);
|
||||
fo->rewrite(&old_dtinit, sizeof(old_dtinit));
|
||||
fo->seek(0, SEEK_END);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// update header with totals
|
||||
ph.c_len = total_in;
|
||||
ph.u_len = total_out;
|
||||
|
|
|
@ -63,7 +63,12 @@ protected:
|
|||
virtual void addStubEntrySections(Filter const *);
|
||||
virtual void unpack(OutputFile *fo) = 0;
|
||||
|
||||
virtual unsigned elf_get_offset_from_address(unsigned) const = 0;
|
||||
virtual void const *elf_find_dynamic(unsigned) const = 0;
|
||||
virtual uint64_t elf_unsigned_dynamic(unsigned) const = 0;
|
||||
|
||||
protected:
|
||||
unsigned e_phnum; /* Program header table entry count */
|
||||
char *file_image; // if ET_DYN investigation
|
||||
char const *dynstr; // from DT_STRTAB
|
||||
|
||||
|
@ -72,6 +77,10 @@ protected:
|
|||
unsigned sz_pack2; // after pack2(), before loader
|
||||
unsigned lg2_page; // log2(PAGE_SIZE)
|
||||
unsigned page_size; // 1u<<lg2_page
|
||||
unsigned xct_off; // shared library: file offset of SHT_EXECINSTR
|
||||
unsigned xct_va; // minimum SHT_EXECINSTR virtual address
|
||||
unsigned hatch_off; // file offset of escape hatch
|
||||
unsigned hatch_va; // virtual address of escape hatch
|
||||
|
||||
unsigned short e_machine;
|
||||
unsigned char ei_class;
|
||||
|
@ -122,12 +131,12 @@ protected:
|
|||
|
||||
static unsigned elf_hash(char const *) /*const*/;
|
||||
static unsigned gnu_hash(char const *) /*const*/;
|
||||
virtual void const *elf_find_dynamic(unsigned) const;
|
||||
virtual unsigned elf_unsigned_dynamic(unsigned) const;
|
||||
virtual Elf32_Sym const *elf_lookup(char const *) const;
|
||||
virtual unsigned elf_get_offset_from_address(unsigned) const;
|
||||
Elf32_Shdr const *elf_find_section_name(char const *) const;
|
||||
Elf32_Shdr const *elf_find_section_type(unsigned) const;
|
||||
void const *elf_find_dynamic(unsigned) const;
|
||||
uint64_t elf_unsigned_dynamic(unsigned) const;
|
||||
|
||||
protected:
|
||||
Elf32_Ehdr ehdri; // from input file
|
||||
|
@ -220,11 +229,17 @@ protected:
|
|||
virtual unsigned find_LOAD_gap(Elf64_Phdr const *const phdri, unsigned const k,
|
||||
unsigned const e_phnum);
|
||||
|
||||
virtual unsigned elf_get_offset_from_address(unsigned) const;
|
||||
void const *elf_find_dynamic(unsigned) const;
|
||||
uint64_t elf_unsigned_dynamic(unsigned) const;
|
||||
|
||||
protected:
|
||||
Elf64_Ehdr ehdri; // from input file
|
||||
Elf64_Phdr *phdri; // for input file
|
||||
acc_uint64l_t page_mask; // AND clears the offset-within-page
|
||||
|
||||
Elf64_Dyn const *dynseg; // from PT_DYNAMIC
|
||||
|
||||
__packed_struct(cprElfHdr1)
|
||||
Elf64_Ehdr ehdr;
|
||||
Elf64_Phdr phdr[1];
|
||||
|
@ -259,21 +274,30 @@ class PackLinuxElf32Be : public PackLinuxElf32
|
|||
{
|
||||
typedef PackLinuxElf32 super;
|
||||
protected:
|
||||
PackLinuxElf32Be(InputFile *f) : super(f) { bele = &N_BELE_RTP::be_policy; }
|
||||
PackLinuxElf32Be(InputFile *f) : super(f) {
|
||||
bele = &N_BELE_RTP::be_policy;
|
||||
e_phnum = get_te16(&ehdri.e_phnum);
|
||||
}
|
||||
};
|
||||
|
||||
class PackLinuxElf32Le : public PackLinuxElf32
|
||||
{
|
||||
typedef PackLinuxElf32 super;
|
||||
protected:
|
||||
PackLinuxElf32Le(InputFile *f) : super(f) { bele = &N_BELE_RTP::le_policy; }
|
||||
PackLinuxElf32Le(InputFile *f) : super(f) {
|
||||
bele = &N_BELE_RTP::le_policy;
|
||||
e_phnum = get_te16(&ehdri.e_phnum);
|
||||
}
|
||||
};
|
||||
|
||||
class PackLinuxElf64Le : public PackLinuxElf64
|
||||
{
|
||||
typedef PackLinuxElf64 super;
|
||||
protected:
|
||||
PackLinuxElf64Le(InputFile *f) : super(f) { bele = &N_BELE_RTP::le_policy; }
|
||||
PackLinuxElf64Le(InputFile *f) : super(f) {
|
||||
bele = &N_BELE_RTP::le_policy;
|
||||
e_phnum = get_te16(&ehdri.e_phnum);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -97,6 +97,7 @@ STUBS += i386-linux.elf.shell-fold.h
|
|||
STUBS += i386-linux.kernel.vmlinux.h
|
||||
STUBS += i386-linux.kernel.vmlinux-head.h
|
||||
STUBS += i386-linux.kernel.vmlinuz.h
|
||||
STUBS += i386-linux.shlib-init.h
|
||||
STUBS += i386-win32.pe.h
|
||||
STUBS += m68k-atari.tos.h
|
||||
STUBS += mips.r3000-linux.elf-entry.h
|
||||
|
@ -889,6 +890,18 @@ i386-linux.kernel.vmlinux-head.h : $(srcdir)/src/$$T.S
|
|||
$(call tc,bin2h) tmp/$T.bin $@
|
||||
|
||||
|
||||
# /***********************************************************************
|
||||
# // i386-linux.shlib
|
||||
# ************************************************************************/
|
||||
|
||||
i386-linux.shlib%.h : tc_list = i386-linux.elf arch-i386 default
|
||||
i386-linux.shlib%.h : tc_bfdname = elf32-i386
|
||||
|
||||
i386-linux.shlib-init.h : $(srcdir)/src/$$T.S
|
||||
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin
|
||||
$(call tc,f-embed_objinfo,tmp/$T.bin)
|
||||
$(call tc,bin2h) tmp/$T.bin $@
|
||||
|
||||
# /***********************************************************************
|
||||
# // armel-linux.kernel.vmlinuz
|
||||
# // armel-linux.kernel.vmlinuz-head
|
||||
|
|
2396
src/stub/i386-linux.shlib-init.h
Normal file
2396
src/stub/i386-linux.shlib-init.h
Normal file
File diff suppressed because it is too large
Load Diff
314
src/stub/src/i386-linux.shlib-init.S
Normal file
314
src/stub/src/i386-linux.shlib-init.S
Normal file
|
@ -0,0 +1,314 @@
|
|||
/*
|
||||
; i386-linux.shlib-init.S -- Linux shared library init & decompressor (Elf binary)
|
||||
;
|
||||
; This file is part of the UPX executable compressor.
|
||||
;
|
||||
; Copyright (C) 1996-2009 Markus Franz Xaver Johannes Oberhumer
|
||||
; Copyright (C) 1996-2009 Laszlo Molnar
|
||||
; Copyright (C) 2000-2009 John F. Reiser
|
||||
; All Rights Reserved.
|
||||
;
|
||||
; UPX and the UCL library are free software; you can redistribute them
|
||||
; and/or modify them under the terms of the GNU General Public License as
|
||||
; published by the Free Software Foundation; either version 2 of
|
||||
; the License, or (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU General Public License
|
||||
; along with this program; see the file COPYING.
|
||||
; If not, write to the Free Software Foundation, Inc.,
|
||||
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
;
|
||||
; Markus F.X.J. Oberhumer Laszlo Molnar
|
||||
; <markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||
;
|
||||
; John F. Reiser
|
||||
; <jreiser@users.sourceforge.net>
|
||||
;
|
||||
*/
|
||||
|
||||
#include "arch/i386/macros.S"
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
// program entry point
|
||||
// see glibc/sysdeps/i386/elf/start.S
|
||||
**************************************************************************/
|
||||
|
||||
section LEXEC000
|
||||
// .long . // compress-time virtual address (detect runtime relocation)
|
||||
// .long user DT_INIT
|
||||
// .long &escape_hatch
|
||||
// .long &{p_info; b_info; compressed data}
|
||||
_start: .globl _start
|
||||
//// int3
|
||||
push eax; pusha
|
||||
mov ebp,esp
|
||||
o_uinit= 8*4 // beyond saved registers
|
||||
//o_reloc= 6*4 // saved ecx
|
||||
|
||||
call main // push address of decompress subroutine
|
||||
decompress:
|
||||
|
||||
// /*************************************************************************
|
||||
// // C callable decompressor
|
||||
// **************************************************************************/
|
||||
|
||||
// /* Offsets to parameters, allowing for {pusha + call} */
|
||||
#define O_INP (8*4 +1*4)
|
||||
#define O_INS (8*4 +2*4)
|
||||
#define O_OUTP (8*4 +3*4)
|
||||
#define O_OUTS (8*4 +4*4)
|
||||
#define O_PARAM (8*4 +5*4)
|
||||
|
||||
#define INP dword ptr [esp+O_INP]
|
||||
#define INS dword ptr [esp+O_INS]
|
||||
#define OUTP dword ptr [esp+O_OUTP]
|
||||
#define OUTS dword ptr [esp+O_OUTS]
|
||||
#define PARM dword ptr [esp+O_PARAM]
|
||||
|
||||
section LEXEC009
|
||||
//; empty section for commonality with l_lx_exec86.asm
|
||||
section LEXEC010
|
||||
pusha
|
||||
// cld
|
||||
|
||||
mov esi, INP
|
||||
mov edi, OUTP
|
||||
|
||||
or ebp, -1
|
||||
//;; align 8
|
||||
|
||||
#include "arch/i386/nrv2b_d32.S"
|
||||
#include "arch/i386/nrv2d_d32.S"
|
||||
#include "arch/i386/nrv2e_d32.S"
|
||||
#include "arch/i386/lzma_d.S"
|
||||
cjt32 0
|
||||
|
||||
section LEXEC015
|
||||
// eax is 0 from decompressor code
|
||||
//xor eax, eax ; return code
|
||||
|
||||
// check compressed size
|
||||
mov edx, INP
|
||||
add edx, INS
|
||||
cmp esi, edx
|
||||
jz .ok
|
||||
dec eax
|
||||
.ok:
|
||||
|
||||
// write back the uncompressed size
|
||||
sub edi, OUTP
|
||||
mov edx, OUTS
|
||||
mov [edx], edi
|
||||
|
||||
mov [7*4 + esp], eax
|
||||
popa
|
||||
ret
|
||||
|
||||
ctojr32
|
||||
ctok32 edi, dl
|
||||
section LEXEC017
|
||||
popa
|
||||
ret
|
||||
|
||||
section LEXEC020
|
||||
|
||||
#define PAGE_SIZE ( 1<<12)
|
||||
PAGE_MASK= -PAGE_SIZE // AND clears the offset within page
|
||||
|
||||
#define MAP_FIXED 0x10
|
||||
#define MAP_PRIVATE 0x02
|
||||
#define MAP_ANONYMOUS 0x20
|
||||
#define PROT_READ 1
|
||||
#define PROT_WRITE 2
|
||||
#define PROT_EXEC 4
|
||||
#define __NR_mmap 90
|
||||
#define __NR_munmap 91
|
||||
#define __NR_mprotect 125
|
||||
#define szElf32_Ehdr 0x34
|
||||
#define p_memsz 5*4
|
||||
sz_p_info = 3*4
|
||||
sz_b_info=3*4
|
||||
sz_unc= 0
|
||||
sz_cpr= 4
|
||||
b_method= 8
|
||||
|
||||
#define __NR_write 4
|
||||
#define __NR_exit 1
|
||||
|
||||
#define pushsbli .byte 0x6a, /* push sign-extended byte to long immediate*/
|
||||
|
||||
msg_SELinux:
|
||||
pushsbli L71 - L70
|
||||
pop edx // length
|
||||
call L71
|
||||
L70:
|
||||
.ascii "PROT_EXEC|PROT_WRITE failed.\n"
|
||||
L71:
|
||||
pop ecx // message text
|
||||
push 2 // fd stderr
|
||||
pop ebx
|
||||
push __NR_write; pop eax; int 0x80
|
||||
die:
|
||||
mov bl, 127 // only low 7 bits matter!
|
||||
push __NR_exit; pop eax; int 0x80
|
||||
|
||||
main:
|
||||
// 1. allocate temporary pages
|
||||
// 2. copy to temporary pages:
|
||||
// fragment of page below dst; compressed src;
|
||||
// decompress+unfilter; supervise
|
||||
// 3. mmap destination pages for decompressed data
|
||||
// 4. create escape hatch
|
||||
// 5. jump to temporary pages
|
||||
// 6. uncompress
|
||||
// 7. unfilter
|
||||
// 8. mprotect decompressed pages
|
||||
// 9 setup args for unmap of temp pages
|
||||
// 10. jump to escape hatch
|
||||
// 11. unmap temporary pages
|
||||
// 12. goto user DT_INIT
|
||||
|
||||
pop edx // &decompress
|
||||
|
||||
lea esi,[edx + _start - decompress - 4*4]
|
||||
mov ecx,esi
|
||||
lodsd; sub ecx,eax; //mov [ebp+o_reloc],ecx
|
||||
lodsd; add eax,ecx; mov [ebp+o_uinit],eax // reloc DT_INIT for step 12
|
||||
lodsd; add eax,ecx; push eax // reloc &hatch for step 10
|
||||
o_hatch= -1*4
|
||||
lodsd; add eax,ecx; xchg eax,edi // &p_info; also destination for decompress
|
||||
lea esi,[edi + sz_p_info] // &b_info
|
||||
|
||||
push eax; push eax // param space: munmap temp pages step 9
|
||||
p_unmap= -3*4
|
||||
|
||||
lodsd; lodsd; add esi,eax; lodsd // skip unpack helper block
|
||||
|
||||
lodsd // eax=dstlen
|
||||
mov ebx,edi
|
||||
and ebx,~PAGE_MASK // ebx= fragment
|
||||
add eax,ebx // extend to page-aligned
|
||||
sub edi,ebx
|
||||
push eax; push edi // params: mprotect restored pages step 8
|
||||
p_mprot= -5*4
|
||||
sub eax,ebx // restore
|
||||
add edi,ebx
|
||||
|
||||
movzbl ecx,[esi+b_method-4+1]; push ecx // ftid
|
||||
movzbl ecx,[esi+b_method-4+2]; push ecx // cto8
|
||||
push eax; mov ecx,esp // dstlen also for unfilter step 7
|
||||
push edi // dst param for unfilter step 7
|
||||
p_unflt= -9*4
|
||||
push edx // &decompress
|
||||
o_uncpr= -10*4
|
||||
|
||||
lodsd; xchg eax,edx // edx= srclen
|
||||
lodsd; push eax // method,filter,cto,junk
|
||||
push ecx // &dstlen
|
||||
push edi // dst
|
||||
push edx // srclen
|
||||
push esi // src; arglist ready for decompress step 6
|
||||
p_uncpr= -15*4
|
||||
|
||||
mov eax,[ebp+o_uncpr] // &decompress
|
||||
add edx,[eax-4] // l_d_cpr + l_f_unc
|
||||
|
||||
call L220
|
||||
supervise:
|
||||
// Allocate pages for result of decompressing.
|
||||
// These replace the compressed source and the following hole.
|
||||
push 0; push 0
|
||||
push MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED
|
||||
push PROT_READ|PROT_WRITE
|
||||
push [ebp+p_mprot+4] // dstlen
|
||||
push [ebp+p_mprot] // dst
|
||||
mov ecx,ebx // save fragment
|
||||
mov ebx,esp
|
||||
push __NR_mmap; pop eax; int 0x80
|
||||
cmp eax,[ebx]; je 0f; hlt; 0:
|
||||
add esp,6*4
|
||||
|
||||
// Restore fragment of page below dst
|
||||
xchg eax,edi
|
||||
mov esi,[ebp+p_unmap]
|
||||
add ecx,3; shr ecx,2 // FIXME: is this safe?
|
||||
rep movsd
|
||||
|
||||
call [ebp+o_uncpr] // decompress
|
||||
add esp,5*4 // remove params
|
||||
//o_uncpr
|
||||
pop eax // &decompress
|
||||
//p_unflt
|
||||
cmp [word ptr esp+3*4],0; je 0f // 0==ftid ==> no filter
|
||||
add eax,2; call eax // unfilter {i386 f_unf==(2+f_unc)}
|
||||
0:
|
||||
add esp,4*4
|
||||
//p_mprot
|
||||
pop ebx // dst including fragment
|
||||
pop ecx // dstlen
|
||||
push PROT_READ|PROT_EXEC; pop edx
|
||||
push __NR_mprotect; pop eax; int 0x80
|
||||
//p_unmap
|
||||
pop ebx // &temp pages
|
||||
pop ecx // length
|
||||
push __NR_munmap; pop eax
|
||||
ret // goto escape hatch
|
||||
//hatch:
|
||||
int 0x80 // munmap temporary pages
|
||||
popa
|
||||
ret // goto user DT_INIT
|
||||
|
||||
L220:
|
||||
pop esi // &supervise
|
||||
add edx,[esi-4] // total length to allocate
|
||||
add edx,ebx // include fragment
|
||||
|
||||
// Allocate pages to hold temporary copy.
|
||||
push 0; push 0
|
||||
push MAP_PRIVATE|MAP_ANONYMOUS
|
||||
push PROT_READ|PROT_WRITE|PROT_EXEC
|
||||
push edx // length with fragment
|
||||
push 0 // addr
|
||||
mov ecx,ebx // save fragment
|
||||
mov ebx,esp // & vec
|
||||
push __NR_mmap; pop eax; int 0x80
|
||||
cmp eax,PAGE_MASK; jb 0f; hlt; 0:
|
||||
add esp,6*4
|
||||
mov ebx,ecx // save fragment
|
||||
|
||||
mov [ebp+p_unmap ],eax // addr
|
||||
mov [ebp+p_unmap+4],edx // length with fragment
|
||||
xchg eax,edi // edi= dst
|
||||
xchg eax,esi // eax= &supervise
|
||||
//p_uncpr
|
||||
mov esi,[ebp+p_mprot]
|
||||
add ecx,3; shr ecx,2 // FIXME: is this safe?
|
||||
rep movsd // copy the fragment
|
||||
|
||||
pop esi // &src data (after fragment)
|
||||
pop ecx; push ecx // length
|
||||
push edi // &copied data (after fragment)
|
||||
add ecx,3; shr ecx,2
|
||||
rep movsd // copy compressed data
|
||||
|
||||
mov esi,[ebp+o_uncpr]
|
||||
mov [ebp+o_uncpr],edi
|
||||
mov ecx,[esi-4]
|
||||
rep movsb
|
||||
|
||||
//o_super
|
||||
xchg eax,esi // esi= &supervise
|
||||
push edi // &copied
|
||||
mov ecx,[esi-4]
|
||||
rep movsb
|
||||
|
||||
ret // goto copied supervise:
|
||||
|
||||
// vi:ts=8:et:nowrap
|
||||
|
653
src/stub/tmp/i386-linux.shlib-init.bin.dump
Normal file
653
src/stub/tmp/i386-linux.shlib-init.bin.dump
Normal file
|
@ -0,0 +1,653 @@
|
|||
file format elf32-i386
|
||||
|
||||
Sections:
|
||||
Idx Name Size VMA LMA File off Algn Flags
|
||||
0 LEXEC000 0000000a 00000000 00000000 00000034 2**0 CONTENTS, RELOC, READONLY
|
||||
1 LEXEC009 00000000 00000000 00000000 0000003e 2**0 CONTENTS, READONLY
|
||||
2 LEXEC010 0000000c 00000000 00000000 0000003e 2**0 CONTENTS, READONLY
|
||||
3 N2BSMA10 00000003 00000000 00000000 0000004a 2**0 CONTENTS, RELOC, READONLY
|
||||
4 N2BFAS10 00000002 00000000 00000000 0000004d 2**0 CONTENTS, RELOC, READONLY
|
||||
5 N2BFAS11 00000006 00000000 00000000 0000004f 2**0 CONTENTS, READONLY
|
||||
6 N2BDEC10 0000000b 00000000 00000000 00000055 2**0 CONTENTS, READONLY
|
||||
7 N2BSMA20 00000005 00000000 00000000 00000060 2**0 CONTENTS, RELOC, READONLY
|
||||
8 N2BFAS20 00000009 00000000 00000000 00000065 2**0 CONTENTS, RELOC, READONLY
|
||||
9 N2BDEC20 0000000d 00000000 00000000 0000006e 2**0 CONTENTS, READONLY
|
||||
10 N2BSMA30 0000000d 00000000 00000000 0000007b 2**0 CONTENTS, RELOC, READONLY
|
||||
11 N2BFAS30 0000000f 00000000 00000000 00000088 2**0 CONTENTS, RELOC, READONLY
|
||||
12 N2BDEC30 0000003e 00000000 00000000 00000097 2**0 CONTENTS, RELOC, READONLY
|
||||
13 N2BSMA40 0000000d 00000000 00000000 000000d5 2**0 CONTENTS, RELOC, READONLY
|
||||
14 N2BFAS40 0000000f 00000000 00000000 000000e2 2**0 CONTENTS, RELOC, READONLY
|
||||
15 N2BSMA50 00000002 00000000 00000000 000000f1 2**0 CONTENTS, READONLY
|
||||
16 N2BFAS50 00000003 00000000 00000000 000000f3 2**0 CONTENTS, READONLY
|
||||
17 N2BDEC50 00000009 00000000 00000000 000000f6 2**0 CONTENTS, READONLY
|
||||
18 N2BSMA60 0000000c 00000000 00000000 000000ff 2**0 CONTENTS, RELOC, READONLY
|
||||
19 N2BFAS60 00000019 00000000 00000000 0000010b 2**0 CONTENTS, RELOC, READONLY
|
||||
20 N2BFAS61 00000016 00000000 00000000 00000124 2**0 CONTENTS, RELOC, READONLY
|
||||
21 N2BDEC60 00000000 00000000 00000000 0000013a 2**0 CONTENTS, READONLY
|
||||
22 N2DSMA10 00000003 00000000 00000000 0000013a 2**0 CONTENTS, RELOC, READONLY
|
||||
23 N2DFAS10 00000002 00000000 00000000 0000013d 2**0 CONTENTS, RELOC, READONLY
|
||||
24 N2DFAS11 00000006 00000000 00000000 0000013f 2**0 CONTENTS, READONLY
|
||||
25 N2DDEC10 0000000b 00000000 00000000 00000145 2**0 CONTENTS, READONLY
|
||||
26 N2DSMA20 00000005 00000000 00000000 00000150 2**0 CONTENTS, RELOC, READONLY
|
||||
27 N2DFAS20 00000009 00000000 00000000 00000155 2**0 CONTENTS, RELOC, READONLY
|
||||
28 N2DDEC20 0000000d 00000000 00000000 0000015e 2**0 CONTENTS, READONLY
|
||||
29 N2DSMA30 0000000d 00000000 00000000 0000016b 2**0 CONTENTS, RELOC, READONLY
|
||||
30 N2DFAS30 0000000f 00000000 00000000 00000178 2**0 CONTENTS, RELOC, READONLY
|
||||
31 N2DDEC30 00000052 00000000 00000000 00000187 2**0 CONTENTS, RELOC, READONLY
|
||||
32 N2DSMA40 0000000d 00000000 00000000 000001d9 2**0 CONTENTS, RELOC, READONLY
|
||||
33 N2DFAS40 0000000f 00000000 00000000 000001e6 2**0 CONTENTS, RELOC, READONLY
|
||||
34 N2DSMA50 00000002 00000000 00000000 000001f5 2**0 CONTENTS, READONLY
|
||||
35 N2DFAS50 00000003 00000000 00000000 000001f7 2**0 CONTENTS, READONLY
|
||||
36 N2DDEC50 00000009 00000000 00000000 000001fa 2**0 CONTENTS, READONLY
|
||||
37 N2DSMA60 0000000c 00000000 00000000 00000203 2**0 CONTENTS, RELOC, READONLY
|
||||
38 N2DFAS60 00000019 00000000 00000000 0000020f 2**0 CONTENTS, RELOC, READONLY
|
||||
39 N2DFAS61 00000016 00000000 00000000 00000228 2**0 CONTENTS, RELOC, READONLY
|
||||
40 N2DDEC60 00000000 00000000 00000000 0000023e 2**0 CONTENTS, READONLY
|
||||
41 N2ESMA10 00000003 00000000 00000000 0000023e 2**0 CONTENTS, RELOC, READONLY
|
||||
42 N2EFAS10 00000002 00000000 00000000 00000241 2**0 CONTENTS, RELOC, READONLY
|
||||
43 N2EFAS11 00000006 00000000 00000000 00000243 2**0 CONTENTS, READONLY
|
||||
44 N2EDEC10 0000000b 00000000 00000000 00000249 2**0 CONTENTS, READONLY
|
||||
45 N2ESMA20 00000005 00000000 00000000 00000254 2**0 CONTENTS, RELOC, READONLY
|
||||
46 N2EFAS20 00000009 00000000 00000000 00000259 2**0 CONTENTS, RELOC, READONLY
|
||||
47 N2EDEC20 0000000d 00000000 00000000 00000262 2**0 CONTENTS, READONLY
|
||||
48 N2ESMA30 0000000d 00000000 00000000 0000026f 2**0 CONTENTS, RELOC, READONLY
|
||||
49 N2EFAS30 0000000f 00000000 00000000 0000027c 2**0 CONTENTS, RELOC, READONLY
|
||||
50 N2EDEC30 0000005f 00000000 00000000 0000028b 2**0 CONTENTS, RELOC, READONLY
|
||||
51 N2ESMA40 0000000d 00000000 00000000 000002ea 2**0 CONTENTS, RELOC, READONLY
|
||||
52 N2EFAS40 0000000f 00000000 00000000 000002f7 2**0 CONTENTS, RELOC, READONLY
|
||||
53 N2ESMA50 00000002 00000000 00000000 00000306 2**0 CONTENTS, READONLY
|
||||
54 N2EFAS50 00000003 00000000 00000000 00000308 2**0 CONTENTS, READONLY
|
||||
55 N2EDEC50 00000009 00000000 00000000 0000030b 2**0 CONTENTS, READONLY
|
||||
56 N2ESMA60 0000000c 00000000 00000000 00000314 2**0 CONTENTS, RELOC, READONLY
|
||||
57 N2EFAS60 00000019 00000000 00000000 00000320 2**0 CONTENTS, RELOC, READONLY
|
||||
58 N2EFAS61 00000016 00000000 00000000 00000339 2**0 CONTENTS, RELOC, READONLY
|
||||
59 N2EDEC60 00000000 00000000 00000000 0000034f 2**0 CONTENTS, READONLY
|
||||
60 LZMA_DEC00 0000002e 00000000 00000000 0000034f 2**0 CONTENTS, RELOC, READONLY
|
||||
61 LZMA_ELF00 00000048 00000000 00000000 0000037d 2**0 CONTENTS, READONLY
|
||||
62 LZMA_DEC10 00000a86 00000000 00000000 000003c5 2**0 CONTENTS, READONLY
|
||||
63 LZMA_DEC20 00000a86 00000000 00000000 00000e4b 2**0 CONTENTS, READONLY
|
||||
64 LZMA_DEC30 0000001a 00000000 00000000 000018d1 2**0 CONTENTS, READONLY
|
||||
65 CALLTR00 0000000e 00000000 00000000 000018eb 2**0 CONTENTS, RELOC, READONLY
|
||||
66 CTCLEVE1 00000005 00000000 00000000 000018f9 2**0 CONTENTS, RELOC, READONLY
|
||||
67 CALLTR01 00000005 00000000 00000000 000018fe 2**0 CONTENTS, READONLY
|
||||
68 CTBSHR01 00000004 00000000 00000000 00001903 2**0 CONTENTS, READONLY
|
||||
69 CTBROR01 00000002 00000000 00000000 00001907 2**0 CONTENTS, READONLY
|
||||
70 CTBSWA01 00000005 00000000 00000000 00001909 2**0 CONTENTS, READONLY
|
||||
71 CALLTR02 0000000e 00000000 00000000 0000190e 2**0 CONTENTS, RELOC, READONLY
|
||||
72 CALLTR10 00000005 00000000 00000000 0000191c 2**0 CONTENTS, RELOC, READONLY
|
||||
73 CALLTRE8 00000002 00000000 00000000 00001921 2**0 CONTENTS, READONLY
|
||||
74 CALLTRE9 00000002 00000000 00000000 00001923 2**0 CONTENTS, READONLY
|
||||
75 CALLTR11 00000004 00000000 00000000 00001925 2**0 CONTENTS, RELOC, READONLY
|
||||
76 CTCLEVE2 00000005 00000000 00000000 00001929 2**0 CONTENTS, RELOC, READONLY
|
||||
77 CALLTR12 00000002 00000000 00000000 0000192e 2**0 CONTENTS, READONLY
|
||||
78 CTBSHR11 00000004 00000000 00000000 00001930 2**0 CONTENTS, READONLY
|
||||
79 CTBROR11 00000002 00000000 00000000 00001934 2**0 CONTENTS, READONLY
|
||||
80 CTBSWA11 00000005 00000000 00000000 00001936 2**0 CONTENTS, READONLY
|
||||
81 CALLTR13 00000005 00000000 00000000 0000193b 2**0 CONTENTS, RELOC, READONLY
|
||||
82 LEXEC015 0000001d 00000000 00000000 00001940 2**0 CONTENTS, READONLY
|
||||
83 LXUNF000 00000002 00000000 00000000 0000195d 2**0 CONTENTS, RELOC, READONLY
|
||||
84 LXUNF002 00000005 00000000 00000000 0000195f 2**0 CONTENTS, READONLY
|
||||
85 MRUBYTE0 00000002 00000000 00000000 00001964 2**0 CONTENTS, READONLY
|
||||
86 LXMRU005 00000005 00000000 00000000 00001966 2**0 CONTENTS, RELOC, READONLY
|
||||
87 LXMRU006 00000007 00000000 00000000 0000196b 2**0 CONTENTS, READONLY
|
||||
88 LXMRU007 00000007 00000000 00000000 00001972 2**0 CONTENTS, READONLY
|
||||
89 LXUNF008 00000004 00000000 00000000 00001979 2**0 CONTENTS, READONLY
|
||||
90 LXUNF010 00000005 00000000 00000000 0000197d 2**0 CONTENTS, RELOC, READONLY
|
||||
91 LXJCC010 00000003 00000000 00000000 00001982 2**0 CONTENTS, READONLY
|
||||
92 LXMRU045 00000003 00000000 00000000 00001985 2**0 CONTENTS, READONLY
|
||||
93 LXMRU046 00000002 00000000 00000000 00001988 2**0 CONTENTS, READONLY
|
||||
94 LXJCC020 00000002 00000000 00000000 0000198a 2**0 CONTENTS, RELOC, READONLY
|
||||
95 LXJCC021 00000005 00000000 00000000 0000198c 2**0 CONTENTS, RELOC, READONLY
|
||||
96 LXJCC023 00000007 00000000 00000000 00001991 2**0 CONTENTS, READONLY
|
||||
97 LXUNF037 00000002 00000000 00000000 00001998 2**0 CONTENTS, READONLY
|
||||
98 LXUNF386 00000001 00000000 00000000 0000199a 2**0 CONTENTS, READONLY
|
||||
99 LXUNF387 00000009 00000000 00000000 0000199b 2**0 CONTENTS, READONLY
|
||||
100 LXUNF388 00000003 00000000 00000000 000019a4 2**0 CONTENTS, RELOC, READONLY
|
||||
101 LXUNF486 00000004 00000000 00000000 000019a7 2**0 CONTENTS, READONLY
|
||||
102 LXUNF487 00000002 00000000 00000000 000019ab 2**0 CONTENTS, RELOC, READONLY
|
||||
103 LXMRU065 00000005 00000000 00000000 000019ad 2**0 CONTENTS, RELOC, READONLY
|
||||
104 MRUBYTE3 00000002 00000000 00000000 000019b2 2**0 CONTENTS, READONLY
|
||||
105 MRUARB30 00000001 00000000 00000000 000019b4 2**0 CONTENTS, READONLY
|
||||
106 MRUBITS3 00000002 00000000 00000000 000019b5 2**0 CONTENTS, READONLY
|
||||
107 MRUARB40 00000004 00000000 00000000 000019b7 2**0 CONTENTS, READONLY
|
||||
108 LXMRU070 00000008 00000000 00000000 000019bb 2**0 CONTENTS, RELOC, READONLY
|
||||
109 MRUBYTE4 00000003 00000000 00000000 000019c3 2**0 CONTENTS, READONLY
|
||||
110 MRUBITS4 00000002 00000000 00000000 000019c6 2**0 CONTENTS, READONLY
|
||||
111 MRUARB50 00000006 00000000 00000000 000019c8 2**0 CONTENTS, READONLY
|
||||
112 LXMRU080 00000003 00000000 00000000 000019ce 2**0 CONTENTS, READONLY
|
||||
113 MRUBYTE5 00000002 00000000 00000000 000019d1 2**0 CONTENTS, READONLY
|
||||
114 MRUARB60 00000001 00000000 00000000 000019d3 2**0 CONTENTS, READONLY
|
||||
115 MRUBITS5 00000002 00000000 00000000 000019d4 2**0 CONTENTS, READONLY
|
||||
116 MRUARB70 00000004 00000000 00000000 000019d6 2**0 CONTENTS, READONLY
|
||||
117 LXMRU090 0000000b 00000000 00000000 000019da 2**0 CONTENTS, RELOC, READONLY
|
||||
118 MRUBYTE6 00000002 00000000 00000000 000019e5 2**0 CONTENTS, READONLY
|
||||
119 MRUARB80 00000001 00000000 00000000 000019e7 2**0 CONTENTS, READONLY
|
||||
120 MRUBITS6 00000002 00000000 00000000 000019e8 2**0 CONTENTS, READONLY
|
||||
121 MRUARB90 00000004 00000000 00000000 000019ea 2**0 CONTENTS, READONLY
|
||||
122 LXMRU100 00000010 00000000 00000000 000019ee 2**0 CONTENTS, READONLY
|
||||
123 LXUNF040 00000005 00000000 00000000 000019fe 2**0 CONTENTS, READONLY
|
||||
124 LXMRU110 00000003 00000000 00000000 00001a03 2**0 CONTENTS, READONLY
|
||||
125 LXMRU111 00000002 00000000 00000000 00001a06 2**0 CONTENTS, READONLY
|
||||
126 LXUNF041 00000007 00000000 00000000 00001a08 2**0 CONTENTS, RELOC, READONLY
|
||||
127 LXUNF042 00000000 00000000 00000000 00001a0f 2**0 CONTENTS, READONLY
|
||||
128 LEXEC016 00000005 00000000 00000000 00001a0f 2**0 CONTENTS, RELOC, READONLY
|
||||
129 LXMRU010 00000001 00000000 00000000 00001a14 2**0 CONTENTS, READONLY
|
||||
130 LXJMPA00 00000002 00000000 00000000 00001a15 2**0 CONTENTS, READONLY
|
||||
131 LXCALLB0 00000002 00000000 00000000 00001a17 2**0 CONTENTS, READONLY
|
||||
132 LXUNF021 00000006 00000000 00000000 00001a19 2**0 CONTENTS, READONLY
|
||||
133 LXMRU022 00000003 00000000 00000000 00001a1f 2**0 CONTENTS, READONLY
|
||||
134 LXJMPA01 00000002 00000000 00000000 00001a22 2**0 CONTENTS, READONLY
|
||||
135 LXCALLB1 00000002 00000000 00000000 00001a24 2**0 CONTENTS, READONLY
|
||||
136 MRUBITS1 00000001 00000000 00000000 00001a26 2**0 CONTENTS, READONLY
|
||||
137 LXMRU030 00000002 00000000 00000000 00001a27 2**0 CONTENTS, READONLY
|
||||
138 MRUBYTE1 00000002 00000000 00000000 00001a29 2**0 CONTENTS, READONLY
|
||||
139 MRUARB10 00000001 00000000 00000000 00001a2b 2**0 CONTENTS, READONLY
|
||||
140 LXMRU040 00000002 00000000 00000000 00001a2c 2**0 CONTENTS, RELOC, READONLY
|
||||
141 LXUNF030 00000006 00000000 00000000 00001a2e 2**0 CONTENTS, READONLY
|
||||
142 LXJCC000 00000008 00000000 00000000 00001a34 2**0 CONTENTS, RELOC, READONLY
|
||||
143 LXCJ0MRU 00000002 00000000 00000000 00001a3c 2**0 CONTENTS, READONLY
|
||||
144 LXCJ1MRU 00000003 00000000 00000000 00001a3e 2**0 CONTENTS, READONLY
|
||||
145 LXCALJMP 00000003 00000000 00000000 00001a41 2**0 CONTENTS, READONLY
|
||||
146 LXCALL00 00000002 00000000 00000000 00001a44 2**0 CONTENTS, RELOC, READONLY
|
||||
147 LXCALL01 00000003 00000000 00000000 00001a46 2**0 CONTENTS, READONLY
|
||||
148 LXCJ2MRU 00000002 00000000 00000000 00001a49 2**0 CONTENTS, RELOC, READONLY
|
||||
149 LXCJ4MRU 00000002 00000000 00000000 00001a4b 2**0 CONTENTS, RELOC, READONLY
|
||||
150 LXCJ6MRU 00000002 00000000 00000000 00001a4d 2**0 CONTENTS, RELOC, READONLY
|
||||
151 LXCJ7MRU 00000002 00000000 00000000 00001a4f 2**0 CONTENTS, RELOC, READONLY
|
||||
152 LXCJ8MRU 00000003 00000000 00000000 00001a51 2**0 CONTENTS, RELOC, READONLY
|
||||
153 LXUNF034 00000005 00000000 00000000 00001a54 2**0 CONTENTS, RELOC, READONLY
|
||||
154 LXMRU055 00000002 00000000 00000000 00001a59 2**0 CONTENTS, READONLY
|
||||
155 MRUBYTE2 00000005 00000000 00000000 00001a5b 2**0 CONTENTS, READONLY
|
||||
156 MRUBITS2 00000005 00000000 00000000 00001a60 2**0 CONTENTS, READONLY
|
||||
157 MRUARB20 00000005 00000000 00000000 00001a65 2**0 CONTENTS, READONLY
|
||||
158 LXMRU057 00000006 00000000 00000000 00001a6a 2**0 CONTENTS, READONLY
|
||||
159 LXMRU058 00000001 00000000 00000000 00001a70 2**0 CONTENTS, READONLY
|
||||
160 LXUNF035 00000006 00000000 00000000 00001a71 2**0 CONTENTS, READONLY
|
||||
161 ctok32.00 00000009 00000000 00000000 00001a77 2**0 CONTENTS, RELOC, READONLY
|
||||
162 ctok32.10 0000000e 00000000 00000000 00001a80 2**0 CONTENTS, RELOC, READONLY
|
||||
163 ctok32.20 00000021 00000000 00000000 00001a8e 2**0 CONTENTS, RELOC, READONLY
|
||||
164 ctok32.30 00000007 00000000 00000000 00001aaf 2**0 CONTENTS, RELOC, READONLY
|
||||
165 ctok32.40 00000005 00000000 00000000 00001ab6 2**0 CONTENTS, RELOC, READONLY
|
||||
166 LEXEC017 00000002 00000000 00000000 00001abb 2**0 CONTENTS, READONLY
|
||||
167 LEXEC020 0000013a 00000000 00000000 00001abd 2**0 CONTENTS, READONLY
|
||||
SYMBOL TABLE:
|
||||
00000000 l d N2BSMA10 00000000 N2BSMA10
|
||||
00000000 l d N2BFAS11 00000000 N2BFAS11
|
||||
00000000 l d N2BDEC10 00000000 N2BDEC10
|
||||
00000000 l d N2BDEC20 00000000 N2BDEC20
|
||||
00000000 l d N2BDEC30 00000000 N2BDEC30
|
||||
00000000 l d N2BDEC50 00000000 N2BDEC50
|
||||
00000000 l d N2BFAS61 00000000 N2BFAS61
|
||||
00000000 l d N2BDEC60 00000000 N2BDEC60
|
||||
00000000 l d N2DSMA10 00000000 N2DSMA10
|
||||
00000000 l d N2DFAS11 00000000 N2DFAS11
|
||||
00000000 l d N2DDEC10 00000000 N2DDEC10
|
||||
00000000 l d N2DDEC20 00000000 N2DDEC20
|
||||
00000000 l d N2DDEC30 00000000 N2DDEC30
|
||||
00000000 l d N2DDEC50 00000000 N2DDEC50
|
||||
00000000 l d N2DFAS61 00000000 N2DFAS61
|
||||
00000000 l d N2DDEC60 00000000 N2DDEC60
|
||||
00000000 l d N2ESMA10 00000000 N2ESMA10
|
||||
00000000 l d N2EFAS11 00000000 N2EFAS11
|
||||
00000000 l d N2EDEC10 00000000 N2EDEC10
|
||||
00000000 l d N2EDEC20 00000000 N2EDEC20
|
||||
00000000 l d N2EDEC30 00000000 N2EDEC30
|
||||
00000000 l d N2EDEC50 00000000 N2EDEC50
|
||||
00000000 l d N2EFAS61 00000000 N2EFAS61
|
||||
00000000 l d N2EDEC60 00000000 N2EDEC60
|
||||
00000000 l d CALLTR00 00000000 CALLTR00
|
||||
00000000 l d CALLTR10 00000000 CALLTR10
|
||||
00000000 l d CALLTR11 00000000 CALLTR11
|
||||
00000000 l d CALLTR13 00000000 CALLTR13
|
||||
00000000 l d LXUNF010 00000000 LXUNF010
|
||||
00000000 l d LXJCC010 00000000 LXJCC010
|
||||
00000000 l d LXUNF037 00000000 LXUNF037
|
||||
00000000 l d LXMRU070 00000000 LXMRU070
|
||||
00000000 l d LXMRU100 00000000 LXMRU100
|
||||
00000000 l d LXUNF040 00000000 LXUNF040
|
||||
00000000 l d LXUNF042 00000000 LXUNF042
|
||||
00000000 l d LXMRU030 00000000 LXMRU030
|
||||
00000000 l d LXUNF030 00000000 LXUNF030
|
||||
00000000 l d LXCJ8MRU 00000000 LXCJ8MRU
|
||||
00000000 l d LXUNF034 00000000 LXUNF034
|
||||
00000000 l d ctok32.00 00000000 ctok32.00
|
||||
00000000 l d ctok32.10 00000000 ctok32.10
|
||||
00000000 l d ctok32.20 00000000 ctok32.20
|
||||
00000000 l d ctok32.40 00000000 ctok32.40
|
||||
00000000 l d LEXEC020 00000000 LEXEC020
|
||||
00000000 l d LEXEC000 00000000 LEXEC000
|
||||
00000000 l d LEXEC009 00000000 LEXEC009
|
||||
00000000 l d LEXEC010 00000000 LEXEC010
|
||||
00000000 l d N2BFAS10 00000000 N2BFAS10
|
||||
00000000 l d N2BSMA20 00000000 N2BSMA20
|
||||
00000000 l d N2BFAS20 00000000 N2BFAS20
|
||||
00000000 l d N2BSMA30 00000000 N2BSMA30
|
||||
00000000 l d N2BFAS30 00000000 N2BFAS30
|
||||
00000000 l d N2BSMA40 00000000 N2BSMA40
|
||||
00000000 l d N2BFAS40 00000000 N2BFAS40
|
||||
00000000 l d N2BSMA50 00000000 N2BSMA50
|
||||
00000000 l d N2BFAS50 00000000 N2BFAS50
|
||||
00000000 l d N2BSMA60 00000000 N2BSMA60
|
||||
00000000 l d N2BFAS60 00000000 N2BFAS60
|
||||
00000000 l d N2DFAS10 00000000 N2DFAS10
|
||||
00000000 l d N2DSMA20 00000000 N2DSMA20
|
||||
00000000 l d N2DFAS20 00000000 N2DFAS20
|
||||
00000000 l d N2DSMA30 00000000 N2DSMA30
|
||||
00000000 l d N2DFAS30 00000000 N2DFAS30
|
||||
00000000 l d N2DSMA40 00000000 N2DSMA40
|
||||
00000000 l d N2DFAS40 00000000 N2DFAS40
|
||||
00000000 l d N2DSMA50 00000000 N2DSMA50
|
||||
00000000 l d N2DFAS50 00000000 N2DFAS50
|
||||
00000000 l d N2DSMA60 00000000 N2DSMA60
|
||||
00000000 l d N2DFAS60 00000000 N2DFAS60
|
||||
00000000 l d N2EFAS10 00000000 N2EFAS10
|
||||
00000000 l d N2ESMA20 00000000 N2ESMA20
|
||||
00000000 l d N2EFAS20 00000000 N2EFAS20
|
||||
00000000 l d N2ESMA30 00000000 N2ESMA30
|
||||
00000000 l d N2EFAS30 00000000 N2EFAS30
|
||||
00000000 l d N2ESMA40 00000000 N2ESMA40
|
||||
00000000 l d N2EFAS40 00000000 N2EFAS40
|
||||
00000000 l d N2ESMA50 00000000 N2ESMA50
|
||||
00000000 l d N2EFAS50 00000000 N2EFAS50
|
||||
00000000 l d N2ESMA60 00000000 N2ESMA60
|
||||
00000000 l d N2EFAS60 00000000 N2EFAS60
|
||||
00000000 l d LZMA_DEC00 00000000 LZMA_DEC00
|
||||
00000000 l d LZMA_ELF00 00000000 LZMA_ELF00
|
||||
00000000 l d LZMA_DEC10 00000000 LZMA_DEC10
|
||||
00000000 l d LZMA_DEC20 00000000 LZMA_DEC20
|
||||
00000000 l d LZMA_DEC30 00000000 LZMA_DEC30
|
||||
00000000 l d CTCLEVE1 00000000 CTCLEVE1
|
||||
00000000 l d CALLTR01 00000000 CALLTR01
|
||||
00000000 l d CTBSHR01 00000000 CTBSHR01
|
||||
00000000 l d CTBROR01 00000000 CTBROR01
|
||||
00000000 l d CTBSWA01 00000000 CTBSWA01
|
||||
00000000 l d CALLTR02 00000000 CALLTR02
|
||||
00000000 l d CALLTRE8 00000000 CALLTRE8
|
||||
00000000 l d CALLTRE9 00000000 CALLTRE9
|
||||
00000000 l d CTCLEVE2 00000000 CTCLEVE2
|
||||
00000000 l d CALLTR12 00000000 CALLTR12
|
||||
00000000 l d CTBSHR11 00000000 CTBSHR11
|
||||
00000000 l d CTBROR11 00000000 CTBROR11
|
||||
00000000 l d CTBSWA11 00000000 CTBSWA11
|
||||
00000000 l d LEXEC015 00000000 LEXEC015
|
||||
00000000 l d LXUNF000 00000000 LXUNF000
|
||||
00000000 l d LXUNF002 00000000 LXUNF002
|
||||
00000000 l d MRUBYTE0 00000000 MRUBYTE0
|
||||
00000000 l d LXMRU005 00000000 LXMRU005
|
||||
00000000 l d LXMRU006 00000000 LXMRU006
|
||||
00000000 l d LXMRU007 00000000 LXMRU007
|
||||
00000000 l d LXUNF008 00000000 LXUNF008
|
||||
00000000 l d LXMRU045 00000000 LXMRU045
|
||||
00000000 l d LXMRU046 00000000 LXMRU046
|
||||
00000000 l d LXJCC020 00000000 LXJCC020
|
||||
00000000 l d LXJCC021 00000000 LXJCC021
|
||||
00000000 l d LXJCC023 00000000 LXJCC023
|
||||
00000000 l d LXUNF386 00000000 LXUNF386
|
||||
00000000 l d LXUNF387 00000000 LXUNF387
|
||||
00000000 l d LXUNF388 00000000 LXUNF388
|
||||
00000000 l d LXUNF486 00000000 LXUNF486
|
||||
00000000 l d LXUNF487 00000000 LXUNF487
|
||||
00000000 l d LXMRU065 00000000 LXMRU065
|
||||
00000000 l d MRUBYTE3 00000000 MRUBYTE3
|
||||
00000000 l d MRUARB30 00000000 MRUARB30
|
||||
00000000 l d MRUBITS3 00000000 MRUBITS3
|
||||
00000000 l d MRUARB40 00000000 MRUARB40
|
||||
00000000 l d MRUBYTE4 00000000 MRUBYTE4
|
||||
00000000 l d MRUBITS4 00000000 MRUBITS4
|
||||
00000000 l d MRUARB50 00000000 MRUARB50
|
||||
00000000 l d LXMRU080 00000000 LXMRU080
|
||||
00000000 l d MRUBYTE5 00000000 MRUBYTE5
|
||||
00000000 l d MRUARB60 00000000 MRUARB60
|
||||
00000000 l d MRUBITS5 00000000 MRUBITS5
|
||||
00000000 l d MRUARB70 00000000 MRUARB70
|
||||
00000000 l d LXMRU090 00000000 LXMRU090
|
||||
00000000 l d MRUBYTE6 00000000 MRUBYTE6
|
||||
00000000 l d MRUARB80 00000000 MRUARB80
|
||||
00000000 l d MRUBITS6 00000000 MRUBITS6
|
||||
00000000 l d MRUARB90 00000000 MRUARB90
|
||||
00000000 l d LXMRU110 00000000 LXMRU110
|
||||
00000000 l d LXMRU111 00000000 LXMRU111
|
||||
00000000 l d LXUNF041 00000000 LXUNF041
|
||||
00000000 l d LEXEC016 00000000 LEXEC016
|
||||
00000000 l d LXMRU010 00000000 LXMRU010
|
||||
00000000 l d LXJMPA00 00000000 LXJMPA00
|
||||
00000000 l d LXCALLB0 00000000 LXCALLB0
|
||||
00000000 l d LXUNF021 00000000 LXUNF021
|
||||
00000000 l d LXMRU022 00000000 LXMRU022
|
||||
00000000 l d LXJMPA01 00000000 LXJMPA01
|
||||
00000000 l d LXCALLB1 00000000 LXCALLB1
|
||||
00000000 l d MRUBITS1 00000000 MRUBITS1
|
||||
00000000 l d MRUBYTE1 00000000 MRUBYTE1
|
||||
00000000 l d MRUARB10 00000000 MRUARB10
|
||||
00000000 l d LXMRU040 00000000 LXMRU040
|
||||
00000000 l d LXJCC000 00000000 LXJCC000
|
||||
00000000 l d LXCJ0MRU 00000000 LXCJ0MRU
|
||||
00000000 l d LXCJ1MRU 00000000 LXCJ1MRU
|
||||
00000000 l d LXCALJMP 00000000 LXCALJMP
|
||||
00000000 l d LXCALL00 00000000 LXCALL00
|
||||
00000000 l d LXCALL01 00000000 LXCALL01
|
||||
00000000 l d LXCJ2MRU 00000000 LXCJ2MRU
|
||||
00000000 l d LXCJ4MRU 00000000 LXCJ4MRU
|
||||
00000000 l d LXCJ6MRU 00000000 LXCJ6MRU
|
||||
00000000 l d LXCJ7MRU 00000000 LXCJ7MRU
|
||||
00000000 l d LXMRU055 00000000 LXMRU055
|
||||
00000000 l d MRUBYTE2 00000000 MRUBYTE2
|
||||
00000000 l d MRUBITS2 00000000 MRUBITS2
|
||||
00000000 l d MRUARB20 00000000 MRUARB20
|
||||
00000000 l d LXMRU057 00000000 LXMRU057
|
||||
00000000 l d LXMRU058 00000000 LXMRU058
|
||||
00000000 l d LXUNF035 00000000 LXUNF035
|
||||
00000000 l d ctok32.30 00000000 ctok32.30
|
||||
00000000 l d LEXEC017 00000000 LEXEC017
|
||||
00000000 g LEXEC000 00000000 _start
|
||||
00000000 *UND* 00000000 lzma_stack_adjust
|
||||
00000000 *UND* 00000000 lzma_u_len
|
||||
00000000 *UND* 00000000 lzma_c_len
|
||||
00000000 *UND* 00000000 lzma_properties
|
||||
00000000 *UND* 00000000 filter_length
|
||||
00000000 *UND* 00000000 filter_cto
|
||||
00000000 *UND* 00000000 NMRU
|
||||
|
||||
RELOCATION RECORDS FOR [LEXEC000]:
|
||||
OFFSET TYPE VALUE
|
||||
00000006 R_386_PC32 LEXEC020
|
||||
|
||||
RELOCATION RECORDS FOR [N2BSMA10]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 N2BDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2BFAS10]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 N2BDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2BSMA20]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 N2BSMA10
|
||||
|
||||
RELOCATION RECORDS FOR [N2BFAS20]:
|
||||
OFFSET TYPE VALUE
|
||||
00000003 R_386_PC8 N2BFAS11
|
||||
|
||||
RELOCATION RECORDS FOR [N2BSMA30]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000c R_386_PC8 N2BDEC20
|
||||
|
||||
RELOCATION RECORDS FOR [N2BFAS30]:
|
||||
OFFSET TYPE VALUE
|
||||
00000003 R_386_PC8 N2BDEC20
|
||||
0000000e R_386_PC8 N2BDEC20
|
||||
|
||||
RELOCATION RECORDS FOR [N2BDEC30]:
|
||||
OFFSET TYPE VALUE
|
||||
00000011 R_386_PC8 N2BDEC60
|
||||
0000002f R_386_PC8 N2BDEC50
|
||||
|
||||
RELOCATION RECORDS FOR [N2BSMA40]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000c R_386_PC8 N2BDEC30
|
||||
|
||||
RELOCATION RECORDS FOR [N2BFAS40]:
|
||||
OFFSET TYPE VALUE
|
||||
00000003 R_386_PC8 N2BDEC30
|
||||
0000000e R_386_PC8 N2BDEC30
|
||||
|
||||
RELOCATION RECORDS FOR [N2BSMA60]:
|
||||
OFFSET TYPE VALUE
|
||||
00000008 R_386_PC32 N2BDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2BFAS60]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000a R_386_PC8 N2BFAS61
|
||||
00000015 R_386_PC32 N2BDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2BFAS61]:
|
||||
OFFSET TYPE VALUE
|
||||
00000012 R_386_PC32 N2BDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2DSMA10]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 N2DDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2DFAS10]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 N2DDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2DSMA20]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 N2DSMA10
|
||||
|
||||
RELOCATION RECORDS FOR [N2DFAS20]:
|
||||
OFFSET TYPE VALUE
|
||||
00000003 R_386_PC8 N2DFAS11
|
||||
|
||||
RELOCATION RECORDS FOR [N2DSMA30]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000c R_386_PC8 N2DDEC30
|
||||
|
||||
RELOCATION RECORDS FOR [N2DFAS30]:
|
||||
OFFSET TYPE VALUE
|
||||
00000005 R_386_PC8 N2DDEC30
|
||||
0000000e R_386_PC8 N2DDEC30
|
||||
|
||||
RELOCATION RECORDS FOR [N2DDEC30]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000f R_386_PC8 N2DDEC20
|
||||
00000021 R_386_PC8 N2DDEC60
|
||||
00000043 R_386_PC8 N2DDEC50
|
||||
|
||||
RELOCATION RECORDS FOR [N2DSMA40]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000c R_386_PC8 N2DDEC30
|
||||
|
||||
RELOCATION RECORDS FOR [N2DFAS40]:
|
||||
OFFSET TYPE VALUE
|
||||
00000003 R_386_PC8 N2DDEC30
|
||||
0000000e R_386_PC8 N2DDEC30
|
||||
|
||||
RELOCATION RECORDS FOR [N2DSMA60]:
|
||||
OFFSET TYPE VALUE
|
||||
00000008 R_386_PC32 N2DDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2DFAS60]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000a R_386_PC8 N2DFAS61
|
||||
00000015 R_386_PC32 N2DDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2DFAS61]:
|
||||
OFFSET TYPE VALUE
|
||||
00000012 R_386_PC32 N2DDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2ESMA10]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 N2EDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2EFAS10]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 N2EDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2ESMA20]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 N2ESMA10
|
||||
|
||||
RELOCATION RECORDS FOR [N2EFAS20]:
|
||||
OFFSET TYPE VALUE
|
||||
00000003 R_386_PC8 N2EFAS11
|
||||
|
||||
RELOCATION RECORDS FOR [N2ESMA30]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000c R_386_PC8 N2EDEC30
|
||||
|
||||
RELOCATION RECORDS FOR [N2EFAS30]:
|
||||
OFFSET TYPE VALUE
|
||||
00000005 R_386_PC8 N2EDEC30
|
||||
0000000e R_386_PC8 N2EDEC30
|
||||
|
||||
RELOCATION RECORDS FOR [N2EDEC30]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000f R_386_PC8 N2EDEC20
|
||||
0000001e R_386_PC8 N2EDEC50
|
||||
00000030 R_386_PC8 N2EDEC60
|
||||
|
||||
RELOCATION RECORDS FOR [N2ESMA40]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000c R_386_PC8 N2EDEC30
|
||||
|
||||
RELOCATION RECORDS FOR [N2EFAS40]:
|
||||
OFFSET TYPE VALUE
|
||||
00000003 R_386_PC8 N2EDEC30
|
||||
0000000e R_386_PC8 N2EDEC30
|
||||
|
||||
RELOCATION RECORDS FOR [N2ESMA60]:
|
||||
OFFSET TYPE VALUE
|
||||
00000008 R_386_PC32 N2EDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2EFAS60]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000a R_386_PC8 N2EFAS61
|
||||
00000015 R_386_PC32 N2EDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [N2EFAS61]:
|
||||
OFFSET TYPE VALUE
|
||||
00000012 R_386_PC32 N2EDEC10
|
||||
|
||||
RELOCATION RECORDS FOR [LZMA_DEC00]:
|
||||
OFFSET TYPE VALUE
|
||||
00000005 R_386_32 lzma_stack_adjust
|
||||
00000014 R_386_32 lzma_u_len
|
||||
0000001e R_386_32 lzma_c_len
|
||||
0000002a R_386_32 lzma_properties
|
||||
|
||||
RELOCATION RECORDS FOR [CALLTR00]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_32 filter_length
|
||||
|
||||
RELOCATION RECORDS FOR [CTCLEVE1]:
|
||||
OFFSET TYPE VALUE
|
||||
00000002 R_386_8 filter_cto
|
||||
00000004 R_386_PC8 CALLTR00
|
||||
|
||||
RELOCATION RECORDS FOR [CALLTR02]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000d R_386_PC8 CALLTR00
|
||||
|
||||
RELOCATION RECORDS FOR [CALLTR10]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_32 filter_length
|
||||
|
||||
RELOCATION RECORDS FOR [CALLTR11]:
|
||||
OFFSET TYPE VALUE
|
||||
00000003 R_386_PC8 CALLTR13
|
||||
|
||||
RELOCATION RECORDS FOR [CTCLEVE2]:
|
||||
OFFSET TYPE VALUE
|
||||
00000002 R_386_8 filter_cto
|
||||
00000004 R_386_PC8 CALLTR11
|
||||
|
||||
RELOCATION RECORDS FOR [CALLTR13]:
|
||||
OFFSET TYPE VALUE
|
||||
00000004 R_386_PC8 CALLTR10
|
||||
|
||||
RELOCATION RECORDS FOR [LXUNF000]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 LXUNF010
|
||||
|
||||
RELOCATION RECORDS FOR [LXMRU005]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_32 NMRU
|
||||
|
||||
RELOCATION RECORDS FOR [LXUNF010]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC32 LXUNF042
|
||||
|
||||
RELOCATION RECORDS FOR [LXJCC020]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 LXUNF034
|
||||
|
||||
RELOCATION RECORDS FOR [LXJCC021]:
|
||||
OFFSET TYPE VALUE
|
||||
00000004 R_386_PC8 LXUNF034
|
||||
|
||||
RELOCATION RECORDS FOR [LXUNF388]:
|
||||
OFFSET TYPE VALUE
|
||||
00000002 R_386_PC8 LXUNF040
|
||||
|
||||
RELOCATION RECORDS FOR [LXUNF487]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 LXUNF040
|
||||
|
||||
RELOCATION RECORDS FOR [LXMRU065]:
|
||||
OFFSET TYPE VALUE
|
||||
00000004 R_386_PC8 LXMRU070
|
||||
|
||||
RELOCATION RECORDS FOR [LXMRU070]:
|
||||
OFFSET TYPE VALUE
|
||||
00000004 R_386_PC8 LXUNF040
|
||||
|
||||
RELOCATION RECORDS FOR [LXMRU090]:
|
||||
OFFSET TYPE VALUE
|
||||
00000006 R_386_PC8 LXMRU100
|
||||
|
||||
RELOCATION RECORDS FOR [LXUNF041]:
|
||||
OFFSET TYPE VALUE
|
||||
00000006 R_386_PC8 LXUNF034
|
||||
|
||||
RELOCATION RECORDS FOR [LEXEC016]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC32 LXUNF042
|
||||
|
||||
RELOCATION RECORDS FOR [LXMRU040]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 LXMRU030
|
||||
|
||||
RELOCATION RECORDS FOR [LXJCC000]:
|
||||
OFFSET TYPE VALUE
|
||||
00000007 R_386_PC8 LXJCC010
|
||||
|
||||
RELOCATION RECORDS FOR [LXCALL00]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 LXUNF037
|
||||
|
||||
RELOCATION RECORDS FOR [LXCJ2MRU]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 LXUNF037
|
||||
|
||||
RELOCATION RECORDS FOR [LXCJ4MRU]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 LXUNF034
|
||||
|
||||
RELOCATION RECORDS FOR [LXCJ6MRU]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 LXCJ8MRU
|
||||
|
||||
RELOCATION RECORDS FOR [LXCJ7MRU]:
|
||||
OFFSET TYPE VALUE
|
||||
00000001 R_386_PC8 LXCJ8MRU
|
||||
|
||||
RELOCATION RECORDS FOR [LXCJ8MRU]:
|
||||
OFFSET TYPE VALUE
|
||||
00000002 R_386_PC8 LXUNF037
|
||||
|
||||
RELOCATION RECORDS FOR [LXUNF034]:
|
||||
OFFSET TYPE VALUE
|
||||
00000004 R_386_PC8 LXUNF030
|
||||
|
||||
RELOCATION RECORDS FOR [ctok32.00]:
|
||||
OFFSET TYPE VALUE
|
||||
00000003 R_386_PC8 ctok32.20
|
||||
|
||||
RELOCATION RECORDS FOR [ctok32.10]:
|
||||
OFFSET TYPE VALUE
|
||||
0000000d R_386_PC8 ctok32.20
|
||||
|
||||
RELOCATION RECORDS FOR [ctok32.20]:
|
||||
OFFSET TYPE VALUE
|
||||
00000005 R_386_PC8 ctok32.40
|
||||
00000009 R_386_PC8 ctok32.40
|
||||
|
||||
RELOCATION RECORDS FOR [ctok32.30]:
|
||||
OFFSET TYPE VALUE
|
||||
00000006 R_386_PC8 ctok32.10
|
||||
|
||||
RELOCATION RECORDS FOR [ctok32.40]:
|
||||
OFFSET TYPE VALUE
|
||||
00000004 R_386_PC8 ctok32.00
|
Loading…
Reference in New Issue
Block a user