1
0
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:
John Reiser 2009-10-15 20:35:07 -07:00
parent 90ddc06c98
commit 856ecb84a0
6 changed files with 3837 additions and 108 deletions

View File

@ -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;

View File

@ -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);
}
};

View File

@ -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

File diff suppressed because it is too large Load Diff

View 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

View 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