33 #ifndef __UPX_P_LX_ELF_H //{ 34 #define __UPX_P_LX_ELF_H 1 45 virtual bool canUnpackVersion(
int version)
const {
return (version >= 11); }
48 virtual const int *getCompressionMethods(
int method,
int level)
const;
58 virtual void generateElfHdr(
63 virtual void defineSymbols(
Filter const *);
64 virtual void addStubEntrySections(
Filter const *);
68 virtual upx_uint64_t elf_unsigned_dynamic(
unsigned)
const = 0;
69 static unsigned elf_hash(
char const *) ;
70 static unsigned gnu_hash(
char const *) ;
90 upx_uint64_t jni_onload_va;
92 upx_uint16_t e_machine;
93 unsigned char ei_class;
94 unsigned char ei_data;
95 unsigned char ei_osabi;
96 char const *osabi_note;
98 unsigned char const *buildid_data;
100 static unsigned char o_shstrtab[];
110 virtual void PackLinuxElf32help1(
InputFile *f);
111 virtual int checkEhdr(Elf32_Ehdr
const *ehdr)
const;
112 virtual bool canPack();
116 virtual void ARM_defineSymbols(
Filter const *ft);
118 virtual int ARM_is_QNX(
void);
126 virtual void generateElfHdr(
131 virtual void buildLinuxLoader(
132 upx_byte
const *
const proto,
133 unsigned const szproto,
134 upx_byte
const *
const fold,
135 unsigned const szfold,
138 virtual off_t getbrk(
const Elf32_Phdr *phdr,
int e_phnum)
const;
139 virtual void patchLoader();
141 virtual unsigned find_LOAD_gap(Elf32_Phdr
const *
const phdri,
unsigned const k,
142 unsigned const e_phnum);
143 virtual off_t getbase(
const Elf32_Phdr *phdr,
int e_phnum)
const;
145 virtual Elf32_Sym
const *elf_lookup(
char const *)
const;
146 virtual unsigned elf_get_offset_from_address(
unsigned)
const;
147 Elf32_Shdr
const *elf_find_section_name(
char const *)
const;
148 Elf32_Shdr
const *elf_find_section_type(
unsigned)
const;
149 void const *elf_find_dynamic(
unsigned)
const;
150 Elf32_Dyn
const *elf_has_dynamic(
unsigned)
const;
151 upx_uint64_t elf_unsigned_dynamic(
unsigned)
const;
158 unsigned char *note_body;
160 Elf32_Shdr
const *shdri;
163 Elf32_Dyn
const *dynseg;
164 unsigned int const *hashtab;
165 unsigned int const *gashtab;
166 Elf32_Sym
const *dynsym;
167 Elf32_Sym
const *jni_onload_sym;
168 char const *shstrtab;
170 Elf32_Shdr
const *sec_strndx;
171 Elf32_Shdr
const *sec_dynsym;
172 Elf32_Shdr
const *sec_dynstr;
174 __packed_struct(cprElfHdr1)
178 __packed_struct_end()
180 __packed_struct(cprElfHdr2)
184 __packed_struct_end()
186 __packed_struct(cprElfHdr3)
190 __packed_struct_end()
192 __packed_struct(cprElfHdrNetBSD)
195 unsigned char notes[512];
196 __packed_struct_end()
198 cprElfHdrNetBSD elfout;
200 __packed_struct(cprElfShdr3)
202 __packed_struct_end()
213 static void compileTimeAssertions() {
214 COMPILE_TIME_ASSERT(
sizeof(cprElfHdr1) == 52 + 1*32 + 12)
215 COMPILE_TIME_ASSERT(
sizeof(cprElfHdr2) == 52 + 2*32 + 12)
216 COMPILE_TIME_ASSERT(
sizeof(cprElfHdr3) == 52 + 3*32 + 12)
217 COMPILE_TIME_ASSERT(
sizeof(cprElfHdrNetBSD) == 52 + 4*32 + 512)
218 COMPILE_TIME_ASSERT_ALIGNED1(cprElfHdr1)
219 COMPILE_TIME_ASSERT_ALIGNED1(cprElfHdr2)
220 COMPILE_TIME_ASSERT_ALIGNED1(cprElfHdr3)
221 COMPILE_TIME_ASSERT_ALIGNED1(cprElfHdrNetBSD)
235 virtual void PackLinuxElf64help1(
InputFile *f);
236 virtual int checkEhdr(Elf64_Ehdr
const *ehdr)
const;
244 virtual void generateElfHdr(
249 virtual void buildLinuxLoader(
250 upx_byte
const *
const proto,
251 unsigned const szproto,
252 upx_byte
const *
const fold,
253 unsigned const szfold,
256 virtual off_t getbrk(
const Elf64_Phdr *phdr,
int e_phnum)
const;
257 virtual void patchLoader();
259 virtual unsigned find_LOAD_gap(Elf64_Phdr
const *
const phdri,
unsigned const k,
260 unsigned const e_phnum);
262 virtual Elf64_Sym
const *elf_lookup(
char const *)
const;
263 virtual upx_uint64_t elf_get_offset_from_address(upx_uint64_t)
const;
264 Elf64_Shdr
const *elf_find_section_name(
char const *)
const;
265 Elf64_Shdr
const *elf_find_section_type(
unsigned)
const;
266 void const *elf_find_dynamic(
unsigned)
const;
267 Elf64_Dyn
const *elf_has_dynamic(
unsigned)
const;
268 upx_uint64_t elf_unsigned_dynamic(
unsigned)
const;
273 upx_uint64_t e_phoff;
274 upx_uint64_t e_shoff;
275 unsigned char *note_body;
277 Elf64_Shdr
const *shdri;
278 upx_uint64_t page_mask;
280 Elf64_Dyn
const *dynseg;
281 unsigned int const *hashtab;
282 unsigned int const *gashtab;
283 Elf64_Sym
const *dynsym;
284 Elf64_Sym
const *jni_onload_sym;
285 char const *shstrtab;
287 Elf64_Shdr
const *sec_strndx;
288 Elf64_Shdr
const *sec_dynsym;
289 Elf64_Shdr
const *sec_dynstr;
291 __packed_struct(cprElfHdr1)
295 __packed_struct_end()
297 __packed_struct(cprElfHdr2)
301 __packed_struct_end()
303 __packed_struct(cprElfHdr3)
307 __packed_struct_end()
309 __packed_struct(cprElfHdr4)
313 __packed_struct_end()
317 __packed_struct(cprElfShdr3)
319 __packed_struct_end()
323 static void compileTimeAssertions() {
324 COMPILE_TIME_ASSERT(
sizeof(cprElfHdr1) == 64 + 1*56 + 12)
325 COMPILE_TIME_ASSERT(
sizeof(cprElfHdr2) == 64 + 2*56 + 12)
326 COMPILE_TIME_ASSERT(
sizeof(cprElfHdr3) == 64 + 3*56 + 12)
327 COMPILE_TIME_ASSERT(
sizeof(cprElfHdr4) == 64 + 4*56 + 12)
328 COMPILE_TIME_ASSERT_ALIGNED1(cprElfHdr1)
329 COMPILE_TIME_ASSERT_ALIGNED1(cprElfHdr2)
330 COMPILE_TIME_ASSERT_ALIGNED1(cprElfHdr3)
331 COMPILE_TIME_ASSERT_ALIGNED1(cprElfHdr4)
340 bele = &N_BELE_RTP::be_policy;
341 PackLinuxElf32help1(f);
350 bele = &N_BELE_RTP::le_policy;
351 PackLinuxElf32help1(f);
361 page_size=1u<<lg2_page;
362 bele = &N_BELE_RTP::le_policy;
363 PackLinuxElf64help1(f);
378 virtual int getFormat()
const {
return UPX_F_LINUX_ELF64_AMD; }
379 virtual const char *getName()
const {
return "linux/amd64"; }
380 virtual const char *getFullName(
const options_t *)
const {
return "amd64-linux.elf"; }
381 virtual const int *getFilters()
const;
382 virtual bool canPack();
386 virtual void buildLoader(
const Filter *);
387 virtual Linker* newLinker()
const;
388 virtual void defineSymbols(
Filter const *);
402 virtual int getFormat()
const {
return UPX_F_LINUX_ELFPPC32; }
403 virtual const char *getName()
const {
return "linux/ppc32"; }
404 virtual const char *getFullName(
const options_t *)
const {
return "powerpc-linux.elf"; }
405 virtual const int *getFilters()
const;
408 virtual void buildLoader(
const Filter *);
409 virtual Linker* newLinker()
const;
422 virtual int getFormat()
const {
return UPX_F_LINUX_ELFPPC64LE; }
423 virtual const char *getName()
const {
return "linux/ppc64le"; }
424 virtual const char *getFullName(
const options_t *)
const {
return "powerpc64le-linux.elf"; }
425 virtual const int *getFilters()
const;
429 virtual bool canPack();
431 virtual void buildLoader(
const Filter *);
432 virtual Linker* newLinker()
const;
446 virtual int getFormat()
const {
return UPX_F_LINUX_ELF_i386; }
447 virtual const char *getName()
const {
return "linux/i386"; }
448 virtual const char *getFullName(
const options_t *)
const {
return "i386-linux.elf"; }
449 virtual const int *getFilters()
const;
454 virtual void buildLoader(
const Filter *);
455 virtual void addStubEntrySections(
Filter const *);
456 virtual Linker* newLinker()
const;
457 virtual void defineSymbols(
Filter const *);
466 virtual int getFormat()
const = 0;
467 virtual const char *getName()
const = 0;
468 virtual const char *getFullName(
const options_t *)
const = 0;
473 virtual void buildLoader(
const Filter *);
482 virtual int getFormat()
const {
return UPX_F_BSD_ELF_i386; }
483 virtual const char *getName()
const {
return "freebsd/i386"; }
484 virtual const char *getFullName(
const options_t *)
const {
return "i386-freebsd.elf"; }
493 virtual int getFormat()
const {
return UPX_F_BSD_ELF_i386; }
494 virtual const char *getName()
const {
return "netbsd/i386"; }
495 virtual const char *getFullName(
const options_t *)
const {
return "i386-netbsd.elf"; }
497 virtual void buildLoader(
const Filter *ft);
498 virtual void generateElfHdr(
511 virtual int getFormat()
const {
return UPX_F_BSD_ELF_i386; }
512 virtual const char *getName()
const {
return "openbsd/i386"; }
513 virtual const char *getFullName(
const options_t *)
const {
return "i386-openbsd.elf"; }
516 virtual void buildLoader(
const Filter *ft);
517 virtual void generateElfHdr(
535 virtual int getFormat()
const {
return UPX_F_LINUX_ELF32_ARMEL; }
536 virtual const char *getName()
const {
return "linux/arm"; }
537 virtual const char *getFullName(
const options_t *)
const {
return "arm-linux.elf"; }
538 virtual const int *getFilters()
const;
541 virtual const int *getCompressionMethods(
int method,
int level)
const;
542 virtual Linker* newLinker()
const;
544 virtual void buildLoader(
const Filter *);
546 virtual void defineSymbols(
Filter const *);
555 virtual int getFormat()
const {
return UPX_F_LINUX_ELF32_ARMEB; }
556 virtual const char *getName()
const {
return "linux/armeb"; }
557 virtual const char *getFullName(
const options_t *)
const {
return "armeb-linux.elf"; }
558 virtual const int *getFilters()
const;
561 virtual const int *getCompressionMethods(
int method,
int level)
const;
562 virtual Linker* newLinker()
const;
564 virtual void buildLoader(
const Filter *);
566 virtual void defineSymbols(
Filter const *);
575 virtual int getFormat()
const {
return UPX_F_LINUX_ELF32_MIPSEB; }
576 virtual const char *getName()
const {
return "linux/mips"; }
577 virtual const char *getFullName(
const options_t *)
const {
return "mips-linux.elf"; }
578 virtual const int *getFilters()
const;
581 virtual Linker* newLinker()
const;
583 virtual void buildLoader(
const Filter *);
585 virtual void defineSymbols(
Filter const *);
594 virtual int getFormat()
const {
return UPX_F_LINUX_ELF32_MIPSEL; }
595 virtual const char *getName()
const {
return "linux/mipsel"; }
596 virtual const char *getFullName(
const options_t *)
const {
return "mipsel-linux.elf"; }
597 virtual const int *getFilters()
const;
600 virtual Linker* newLinker()
const;
602 virtual void buildLoader(
const Filter *);
604 virtual void defineSymbols(
Filter const *);
Definition: p_lx_elf.h:335
Definition: p_lx_elf.h:37
Definition: p_lx_elf.h:440
Definition: p_lx_elf.h:226
Definition: p_lx_elf.h:416
Definition: p_lx_elf.h:505
Definition: p_lx_elf.h:460
Definition: p_lx_elf.h:529
Definition: p_lx_elf.h:345
Definition: p_lx_elf.h:476
Definition: p_lx_elf.h:372
Definition: p_lx_elf.h:588
Definition: p_lx_elf.h:206
Definition: p_lx_elf.h:487
Definition: p_lx_elf.h:355
Definition: p_lx_elf.h:569
Definition: p_lx_elf.h:103
Definition: p_lx_elf.h:549
Definition: p_lx_elf.h:396