void PackLinuxElf32x86interp::pack1(OutputFile *fo, Filter &) { fi->seek(0, SEEK_SET); fi->readx(&ehdri, sizeof(ehdri)); assert(ehdri.e_phoff == sizeof(Elf32_Ehdr)); // checked by canPack() sz_phdrs = ehdri.e_phnum * ehdri.e_phentsize; phdri = new Elf32_Phdr[(unsigned)ehdri.e_phnum]; fi->seek(ehdri.e_phoff, SEEK_SET); fi->readx(phdri, sz_phdrs); #define E Elf32_Ehdr cprElfHdr3 h3; memset(&h3, 0, sizeof(h3)); memcpy(h3.ehdr.e_ident, "\177ELF", 4); h3.ehdr.e_ident[E::EI_CLASS] = E::ELFCLASS32; h3.ehdr.e_ident[E::EI_DATA] = E::ELFDATA2LSB; h3.ehdr.e_ident[E::EI_VERSION] = E::EV_CURRENT; h3.ehdr.e_ident[E::EI_OSABI] = E::ELFOSABI_LINUX; h3.ehdr.e_ident[E::EI_ABIVERSION] = E::EV_CURRENT; h3.ehdr.e_type = E::ET_EXEC; h3.ehdr.e_machine = E::EM_386; h3.ehdr.e_version = 1; h3.ehdr.e_phoff = sizeof(Elf32_Ehdr); h3.ehdr.e_ehsize = sizeof(Elf32_Ehdr); h3.ehdr.e_phentsize = sizeof(Elf32_Phdr); h3.ehdr.e_phnum = 3; h3.phdr[0].p_type = PT_LOAD; h3.phdr[0].p_flags = Elf32_Phdr::PF_X | Elf32_Phdr::PF_R; h3.phdr[0].p_align = 0x1000; h3.phdr[1].p_type = PT_LOAD; h3.phdr[1].p_flags = Elf32_Phdr::PF_W | Elf32_Phdr::PF_R; h3.phdr[1].p_align = 1; h3.phdr[2].p_type = PT_INTERP; h3.phdr[2].p_offset = (char *)&h3.phdr[2].p_vaddr - (char *)&h3; memcpy(&h3.phdr[2].p_vaddr, "/upxrun", h3.phdr[2].p_filesz = 8); h3.phdr[2].p_align = 1; if (opt->o_unix.make_ptinterp) { // unusual "once per release" *(cprElfHdr3 *)&elfout = h3; elfout.ehdr.e_phnum = 1; fo->write(&elfout, elfout.ehdr.e_ehsize + elfout.ehdr.e_phentsize); } else { // usual case generateElfHdr(fo, &h3, getbrk(phdri, ehdri.e_phnum)); } #undef E }
t_malloc extend_block(t_malloc prev, size_t size) { t_malloc tmp; if ((SIZE + size) <= getfreespace() && sbrk(0) > getbrk()) tmp = sbrk(0) - getfreespace(); else { tmp = sbrk(0); if ((void*)-1 == sbrk(getpagesize())) return (NULL); } tmp = sbrk(0); if ((void*)-1 == sbrk(SIZE + size)) return (NULL); tmp->size = size; tmp->next = NULL; tmp->prev = prev; tmp->ptr = tmp->data; if (prev) prev->next = tmp; tmp->is_free = 0; return (tmp); }