Line data Source code
1 : #ifndef HEADER_fd_src_ballet_elf_fd_elf_h 2 : #define HEADER_fd_src_ballet_elf_fd_elf_h 3 : 4 : /* Executable and Linking Format (ELF) */ 5 : 6 : #include "../../util/fd_util.h" 7 : #include <string.h> 8 : 9 : /* FD_ELF_EI: File type related */ 10 : 11 : #define FD_ELF_EI_MAG0 0 12 : #define FD_ELF_EI_MAG1 1 13 : #define FD_ELF_EI_MAG2 2 14 : #define FD_ELF_EI_MAG3 3 15 : #define FD_ELF_EI_CLASS 4 16 : #define FD_ELF_EI_DATA 5 17 : #define FD_ELF_EI_VERSION 6 18 : #define FD_ELF_EI_OSABI 7 19 : #define FD_ELF_EI_ABIVERSION 8 20 : #define FD_ELF_EI_NIDENT 16 21 : 22 : /* FD_ELF_CLASS: 32-bit/64-bit architecture */ 23 : 24 : #define FD_ELF_CLASS_NONE 0 25 : #define FD_ELF_CLASS_32 1 26 : #define FD_ELF_CLASS_64 2 27 : 28 : /* FD_ELF_DATA: Endianness */ 29 : 30 : #define FD_ELF_DATA_NONE 0 31 : #define FD_ELF_DATA_LE 1 32 : #define FD_ELF_DATA_BE 2 33 : 34 : /* FD_ELF_OSABI */ 35 : 36 : #define FD_ELF_OSABI_NONE 0 37 : 38 : /* FD_ELF_ET: ELF file type */ 39 : 40 : #define FD_ELF_ET_NONE 0 41 : #define FD_ELF_ET_REL 1 /* relocatable static object */ 42 : #define FD_ELF_ET_EXEC 2 /* executable */ 43 : #define FD_ELF_ET_DYN 3 /* shared object */ 44 : #define FD_ELF_ET_CORE 4 /* core dump */ 45 : 46 : /* FD_ELF_EM: Machine type */ 47 : 48 : #define FD_ELF_EM_NONE 0 49 : #define FD_ELF_EM_BPF 247 50 : #define FD_ELF_EM_SBPF 263 51 : 52 : /* FD_ELF_EF: ELF flags */ 53 : 54 : #define FD_ELF_EF_SBPF_V2 32 55 : 56 : /* FD_ELF_PT: Program header type */ 57 : 58 : #define FD_ELF_PT_NULL 0 59 9060 : #define FD_ELF_PT_LOAD 1 60 4206 : #define FD_ELF_PT_DYNAMIC 2 61 : 62 : /* FD_ELF_SHT: Section header type */ 63 : 64 : #define FD_ELF_SHT_NULL 0 65 18 : #define FD_ELF_SHT_PROGBITS 1 66 6 : #define FD_ELF_SHT_SYMTAB 2 67 6 : #define FD_ELF_SHT_STRTAB 3 68 : #define FD_ELF_SHT_RELA 4 69 : #define FD_ELF_SHT_HASH 5 70 48141 : #define FD_ELF_SHT_DYNAMIC 6 71 1596009 : #define FD_ELF_SHT_NOBITS 8 72 6 : #define FD_ELF_SHT_REL 9 73 : #define FD_ELF_SHT_DYNSYM 11 74 : 75 : /* FD_ELF_SHF: Section header flags */ 76 : 77 57024 : #define FD_ELF_SHF_WRITE 0x1 78 57024 : #define FD_ELF_SHF_ALLOC 0x2 79 : #define FD_ELF_SHF_EXECINSTR 0x4 80 : 81 : /* FD_ELF_DT: Dynamic entry type */ 82 : 83 : #define FD_ELF_DT_NULL 0 84 3378 : #define FD_ELF_DT_SYMTAB 6 85 3207 : #define FD_ELF_DT_REL 17 86 3261 : #define FD_ELF_DT_RELSZ 18 87 3261 : #define FD_ELF_DT_RELENT 19 88 : 89 : /* FD_ELF64_ST_TYPE extracts the symbol type from symbol st_info */ 90 : 91 439752 : #define FD_ELF64_ST_TYPE(i) ((i)&0xF) 92 : 93 : /* FD_ELF_STT: Symbol type */ 94 : 95 : #define FD_ELF_STT_NOTYPE 0 96 439752 : #define FD_ELF_STT_FUNC 2 97 : 98 : /* FD_ELF64_R_SYM extracts the symbol index from reloc r_info. 99 : FD_ELF64_R_TYPE extracts the relocation type from reloc r_info. */ 100 : 101 439887 : #define FD_ELF64_R_SYM(i) ((uint)((ulong)(i) >> 32)) 102 1968201 : #define FD_ELF64_R_TYPE(i) ((uint)((ulong)(i) & 0xFFFFFFFF)) 103 : 104 : /* FD_ELF_R_BPF: BPF relocation types */ 105 : 106 135 : #define FD_ELF_R_BPF_64_64 1 /* 64-bit immediate (lddw form) */ 107 1528257 : #define FD_ELF_R_BPF_64_RELATIVE 8 108 439752 : #define FD_ELF_R_BPF_64_32 10 109 : 110 : FD_PROTOTYPES_BEGIN 111 : 112 : /* fd_elf_read_cstr: Validate cstr and return pointer. Given memory 113 : region buf of size buf_sz, attempt to read cstr at offset off in 114 : [0,buf_sz) If buf_sz is 0, buf may be an invalid pointer. Returns 115 : pointer to first byte of cstr in buf on success, and NULL on failure. 116 : Reasons for failure include: off or cstr is out-of-bounds, footprint 117 : of cstr (including NUL) greater than max_sz. */ 118 : 119 : FD_FN_PURE static inline char const * 120 : fd_elf_read_cstr( void const * buf, 121 : ulong buf_sz, 122 : ulong off, 123 117 : ulong max_sz ) { 124 : 125 117 : if( FD_UNLIKELY( off>=buf_sz ) ) 126 3 : return NULL; 127 : 128 114 : char const * str = (char const *)( (ulong)buf + off ); 129 114 : ulong str_sz = buf_sz - off; 130 : 131 114 : ulong n = fd_ulong_min( str_sz, max_sz ); 132 114 : if( FD_UNLIKELY( fd_cstr_nlen( str, n )==n ) ) 133 15 : return NULL; 134 : 135 99 : return str; 136 114 : } 137 : 138 : FD_PROTOTYPES_END 139 : 140 : /* Re-export sibling headers for convenience */ 141 : 142 : #include "fd_elf64.h" 143 : 144 : #endif /* HEADER_fd_src_ballet_elf_fd_elf_h */ 145 :