1 /* 2 * Copyright 2005-2012 Gentoo Foundation 3 * Distributed under the terms of the GNU General Public License v2 4 * 5 * Copyright 2005-2012 Ned Ludd - <solar@gentoo.org> 6 * Copyright 2005-2012 Mike Frysinger - <vapier@gentoo.org> 7 * 8 * Make sure all of the common elf stuff is setup as we expect 9 */ 10 11 #ifndef _PAX_ELF_H 12 #define _PAX_ELF_H 13 14 typedef struct { 15 const void *phdr; 16 const void *shdr; 17 /* When we need to duplicate the ELF buffer for alignment. */ 18 void *_data; 19 union { 20 const void *ehdr, *vdata; 21 const char *data; 22 uintptr_t udata; 23 }; 24 const void *data_end; 25 char elf_class; 26 off_t len; 27 int fd; 28 int is_mmap; 29 const char *filename; 30 const char *base_filename; 31 } elfobj; 32 #define EHDR32(ptr) ((Elf32_Ehdr *)(ptr)) 33 #define EHDR64(ptr) ((Elf64_Ehdr *)(ptr)) 34 #define PHDR32(ptr) ((Elf32_Phdr *)(ptr)) 35 #define PHDR64(ptr) ((Elf64_Phdr *)(ptr)) 36 #define SHDR32(ptr) ((Elf32_Shdr *)(ptr)) 37 #define SHDR64(ptr) ((Elf64_Shdr *)(ptr)) 38 #define RELA32(ptr) ((Elf32_Rela *)(ptr)) 39 #define RELA64(ptr) ((Elf64_Rela *)(ptr)) 40 #define REL32(ptr) ((Elf32_Rel *)(ptr)) 41 #define REL64(ptr) ((Elf64_Rel *)(ptr)) 42 #define DYN32(ptr) ((Elf32_Dyn *)(ptr)) 43 #define DYN64(ptr) ((Elf64_Dyn *)(ptr)) 44 #define SYM32(ptr) ((Elf32_Sym *)(ptr)) 45 #define SYM64(ptr) ((Elf64_Sym *)(ptr)) 46 47 #define VALID_RANGE(elf, offset, size) \ 48 ((uint64_t)(size) <= (uint64_t)elf->len && \ 49 (uint64_t)(offset) <= (uint64_t)elf->len - (uint64_t)(size)) 50 #define VALID_SHDR(elf, shdr) \ 51 (shdr && \ 52 EGET(shdr->sh_type) != SHT_NOBITS && \ 53 VALID_RANGE(elf, EGET(shdr->sh_offset), EGET(shdr->sh_size))) 54 #define VALID_PHDR(elf, phdr) \ 55 (phdr && VALID_RANGE(elf, EGET(phdr->p_offset), EGET(phdr->p_filesz))) 56 57 /* prototypes */ 58 extern const char *pax_short_hf_flags(unsigned long flags); 59 extern const char *pax_short_pf_flags(unsigned long flags); 60 extern const char *gnu_short_stack_flags(unsigned long flags); 61 extern elfobj *readelf_buffer(const char *filename, const void *buffer, size_t buffer_len); 62 extern elfobj *_readelf_fd(const char *filename, int fd, size_t len, int read_only); 63 #define readelf_fd(filename, fd, len) _readelf_fd(filename, fd, len, 1) 64 extern elfobj *_readelf(const char *filename, int read_only); 65 #define readelf(filename) _readelf(filename, 1) 66 extern void unreadelf(elfobj *elf); 67 extern const char *get_elfeitype(int ei_type, int type); 68 extern const char *get_elfetype(const elfobj *elf); 69 extern const char *get_endian(const elfobj *elf); 70 extern const char *get_elfosabi(const elfobj *elf); 71 extern const char *get_elf_eabi(const elfobj *elf); 72 extern const char *get_elfemtype(const elfobj *elf); 73 extern const char *get_elfptype(int type); 74 extern const char *get_elfdtype(int type); 75 extern const char *get_elfshntype(int type); 76 extern const char *get_elfshttype(int type); 77 extern const char *get_elfstbtype(int type); 78 extern const char *get_elfstvtype(int type); 79 extern const char *get_elfstttype(int type); 80 extern const char *get_elfnttype(uint16_t e_type, const char *name, int type); 81 extern const void *elf_findsecbyname(const elfobj *elf, const char *name); 82 extern unsigned int get_etype(const elfobj *elf); 83 extern unsigned int get_emtype(const elfobj *elf); 84 extern void print_etypes(FILE *); 85 extern unsigned int etype_lookup(const char *); 86 87 /* PaX flags (to be read in elfhdr.e_flags) */ 88 #define HF_PAX_PAGEEXEC 1 /* 0: Paging based non-exec pages */ 89 #define HF_PAX_EMUTRAMP 2 /* 0: Emulate trampolines */ 90 #define HF_PAX_MPROTECT 4 /* 0: Restrict mprotect() */ 91 #define HF_PAX_RANDMMAP 8 /* 0: Randomize mmap() base */ 92 #define HF_PAX_RANDEXEC 16 /* 1: Randomize ET_EXEC base */ 93 #define HF_PAX_SEGMEXEC 32 /* 0: Segmentation based non-exec pages */ 94 95 #define EI_PAX 14 /* Index in e_ident[] where to read flags */ 96 #define __EI_PAX_FLAGS(B, elf) \ 97 ((EHDR ## B (elf->ehdr)->e_ident[EI_PAX + 1] << 8) + \ 98 EHDR ## B (elf->ehdr)->e_ident[EI_PAX]) 99 #define EI_PAX_FLAGS(elf) \ 100 (__extension__ ({ \ 101 unsigned long __res; \ 102 if (elf->elf_class == ELFCLASS32) \ 103 __res = __EI_PAX_FLAGS(32, elf); \ 104 else \ 105 __res = __EI_PAX_FLAGS(64, elf); \ 106 __res; \ 107 })) 108 109 #endif /* _PAX_ELF_H */ 110