1 /* 2 * Copyright (C) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef OHOS_LUME_ASSET_COMPILER_H 17 #define OHOS_LUME_ASSET_COMPILER_H 18 enum : uint32_t { 19 LC_SEGMENT_64 = 0x19, 20 LC_SYMTAB = 0x2, 21 }; 22 23 enum : uint8_t { 24 N_UNDF = 0x0u, 25 N_ABS = 0x2u, 26 N_SECT = 0xeu, 27 N_PBUD = 0xcu, 28 N_INDR = 0xau 29 }; 30 31 enum : uint32_t { 32 MH_OBJECT = 0x1u, 33 MH_EXECUTE = 0x2u, 34 MH_FVMLIB = 0x3u, 35 MH_CORE = 0x4u, 36 MH_PRELOAD = 0x5u, 37 MH_DYLIB = 0x6u, 38 MH_DYLINKER = 0x7u, 39 MH_BUNDLE = 0x8u, 40 MH_DYLIB_STUB = 0x9u, 41 MH_DSYM = 0xAu, 42 MH_KEXT_BUNDLE = 0xBu, 43 MH_FILESET = 0xCu, 44 }; 45 46 enum : uint32_t { 47 CPU_ARCH_MASK = 0xff000000, 48 CPU_ARCH_ABI64 = 0x01000000, 49 CPU_ARCH_ABI64_32 = 0x02000000, 50 }; 51 52 enum : uint32_t { 53 CPU_TYPE_ANY = static_cast<uint32_t>(-1), 54 CPU_TYPE_X86 = 7, 55 CPU_TYPE_I386 = CPU_TYPE_X86, 56 CPU_TYPE_X86_64 = CPU_TYPE_X86 | CPU_ARCH_ABI64, 57 /* CPU_TYPE_MIPS = 8, */ 58 CPU_TYPE_MC98000 = 10, 59 CPU_TYPE_ARM = 12, 60 CPU_TYPE_ARM64 = CPU_TYPE_ARM | CPU_ARCH_ABI64, 61 CPU_TYPE_ARM64_32 = CPU_TYPE_ARM | CPU_ARCH_ABI64_32, 62 CPU_TYPE_SPARC = 14, 63 CPU_TYPE_POWERPC = 18, 64 CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC | CPU_ARCH_ABI64 65 }; 66 67 enum : uint32_t { 68 CPU_SUBTYPE_MASK = 0xff000000, 69 CPU_SUBTYPE_LIB64 = 0x80000000, 70 CPU_SUBTYPE_MULTIPLE = ~0u 71 }; 72 73 enum : uint32_t { 74 CPU_SUBTYPE_I386_ALL = 3, 75 CPU_SUBTYPE_386 = 3, 76 CPU_SUBTYPE_486 = 4, 77 CPU_SUBTYPE_486SX = 0x84, 78 CPU_SUBTYPE_586 = 5, 79 CPU_SUBTYPE_PENT = CPU_SUBTYPE_586, 80 CPU_SUBTYPE_PENTPRO = 0x16, 81 CPU_SUBTYPE_PENTII_M3 = 0x36, 82 CPU_SUBTYPE_PENTII_M5 = 0x56, 83 CPU_SUBTYPE_CELERON = 0x67, 84 CPU_SUBTYPE_CELERON_MOBILE = 0x77, 85 CPU_SUBTYPE_PENTIUM_3 = 0x08, 86 CPU_SUBTYPE_PENTIUM_3_M = 0x18, 87 CPU_SUBTYPE_PENTIUM_3_XEON = 0x28, 88 CPU_SUBTYPE_PENTIUM_M = 0x09, 89 CPU_SUBTYPE_PENTIUM_4 = 0x0a, 90 CPU_SUBTYPE_PENTIUM_4_M = 0x1a, 91 CPU_SUBTYPE_ITANIUM = 0x0b, 92 CPU_SUBTYPE_ITANIUM_2 = 0x1b, 93 CPU_SUBTYPE_XEON = 0x0c, 94 CPU_SUBTYPE_XEON_MP = 0x1c, 95 96 CPU_SUBTYPE_X86_ALL = 3, 97 CPU_SUBTYPE_X86_64_ALL = 3, 98 CPU_SUBTYPE_X86_ARCH1 = 4, 99 CPU_SUBTYPE_X86_64_H = 8 100 }; 101 102 enum : uint32_t { 103 CPU_SUBTYPE_ARM64_ALL = 0, 104 CPU_SUBTYPE_ARM64_V8 = 1, 105 CPU_SUBTYPE_ARM64E = 2, 106 }; 107 108 enum : uint32_t { 109 MH_MAGIC = 0xFEEDFACEu, 110 MH_CIGAM = 0xCEFAEDFEu, 111 MH_MAGIC_64 = 0xFEEDFACFu, 112 MH_CIGAM_64 = 0xCFFAEDFEu, 113 FAT_MAGIC = 0xCAFEBABEu, 114 FAT_CIGAM = 0xBEBAFECAu, 115 FAT_MAGIC_64 = 0xCAFEBABFu, 116 FAT_CIGAM_64 = 0xBFBAFECAu 117 }; 118 119 enum { 120 MH_NOUNDEFS = 0x00000001u, 121 MH_INCRLINK = 0x00000002u, 122 MH_DYLDLINK = 0x00000004u, 123 MH_BINDATLOAD = 0x00000008u, 124 MH_PREBOUND = 0x00000010u, 125 MH_SPLIT_SEGS = 0x00000020u, 126 MH_LAZY_INIT = 0x00000040u, 127 MH_TWOLEVEL = 0x00000080u, 128 MH_FORCE_FLAT = 0x00000100u, 129 MH_NOMULTIDEFS = 0x00000200u, 130 MH_NOFIXPREBINDING = 0x00000400u, 131 MH_PREBINDABLE = 0x00000800u, 132 MH_ALLMODSBOUND = 0x00001000u, 133 MH_SUBSECTIONS_VIA_SYMBOLS = 0x00002000u, 134 MH_CANONICAL = 0x00004000u, 135 MH_WEAK_DEFINES = 0x00008000u, 136 MH_BINDS_TO_WEAK = 0x00010000u, 137 MH_ALLOW_STACK_EXECUTION = 0x00020000u, 138 MH_ROOT_SAFE = 0x00040000u, 139 MH_SETUID_SAFE = 0x00080000u, 140 MH_NO_REEXPORTED_DYLIBS = 0x00100000u, 141 MH_PIE = 0x00200000u, 142 MH_DEAD_STRIPPABLE_DYLIB = 0x00400000u, 143 MH_HAS_TLV_DESCRIPTORS = 0x00800000u, 144 MH_NO_HEAP_EXECUTION = 0x01000000u, 145 MH_APP_EXTENSION_SAFE = 0x02000000u, 146 MH_NLIST_OUTOFSYNC_WITH_DYLDINFO = 0x04000000u, 147 MH_SIM_SUPPORT = 0x08000000u, 148 MH_DYLIB_IN_CACHE = 0x80000000u 149 }; 150 151 enum { 152 N_STAB = 0xe0, 153 N_PEXT = 0x10, 154 N_TYPE = 0x0e, 155 N_EXT = 0x01 156 }; 157 158 enum { VM_PROT_READ = 0x1, VM_PROT_WRITE = 0x2, VM_PROT_EXECUTE = 0x4 }; 159 160 161 enum cpu_subtype_t {}; 162 enum cpu_type_t {}; 163 typedef int vm_prot_t; 164 165 struct fat_header { 166 uint32_t magic; 167 uint32_t nfat_arch; 168 }; 169 170 struct fat_arch { 171 cpu_type_t cputype; 172 cpu_subtype_t cpusubtype; 173 uint32_t offset; 174 uint32_t size; 175 uint32_t align; 176 }; 177 178 struct mach_header_64 { 179 uint32_t magic; 180 181 cpu_type_t cputype; 182 183 cpu_subtype_t cpusubtype; 184 185 uint32_t filetype; 186 187 uint32_t ncmds; 188 189 uint32_t sizeofcmds; 190 191 uint32_t flags; 192 193 uint32_t reserved; 194 }; 195 196 struct symtab_command { 197 uint32_t cmd; 198 uint32_t cmdsize; 199 uint32_t nsyms; 200 uint32_t stroff; 201 uint32_t strsize; 202 uint32_t symoff; 203 }; 204 205 struct section_64 { 206 char sectname[16]; 207 208 char segname[16]; 209 210 uint64_t addr; 211 212 uint64_t size; 213 214 uint32_t offset; 215 216 uint32_t align; 217 218 uint32_t reloff; 219 220 uint32_t nreloc; 221 222 uint32_t flags; 223 224 uint32_t reserved1; 225 226 uint32_t reserved2; 227 228 uint32_t reserved3; 229 }; 230 231 struct segment_command_64 { 232 uint32_t cmd; 233 234 uint32_t cmdsize; 235 236 char segname[16]; 237 238 uint64_t vmaddr; 239 240 uint64_t vmsize; 241 242 uint64_t fileoff; 243 244 uint64_t filesize; 245 246 uint32_t maxprot; 247 248 uint32_t initprot; 249 250 uint32_t nsects; 251 252 uint32_t flags; 253 }; 254 255 struct nlist_64 { 256 uint32_t n_strx; 257 uint8_t n_type; 258 uint8_t n_sect; 259 uint16_t n_desc; 260 uint64_t n_value; 261 }; 262 263 enum SectionType : uint32_t { 264 S_REGULAR = 0x00u, 265 S_ZEROFILL = 0x01u, 266 S_CSTRING_LITERALS = 0x02u, 267 S_4BYTE_LITERALS = 0x03u, 268 S_8BYTE_LITERALS = 0x04u, 269 S_LITERAL_POINTERS = 0x05u, 270 S_NON_LAZY_SYMBOL_POINTERS = 0x06u, 271 S_LAZY_SYMBOL_POINTERS = 0x07u, 272 S_SYMBOL_STUBS = 0x08u, 273 S_MOD_INIT_FUNC_POINTERS = 0x09u, 274 S_MOD_TERM_FUNC_POINTERS = 0x0au, 275 S_COALESCED = 0x0bu, 276 S_GB_ZEROFILL = 0x0cu, 277 S_INTERPOSING = 0x0du, 278 S_16BYTE_LITERALS = 0x0eu, 279 S_DTRACE_DOF = 0x0fu, 280 S_LAZY_DYLIB_SYMBOL_POINTERS = 0x10u, 281 S_THREAD_LOCAL_REGULAR = 0x11u, 282 S_THREAD_LOCAL_ZEROFILL = 0x12u, 283 S_THREAD_LOCAL_VARIABLES = 0x13u, 284 S_THREAD_LOCAL_VARIABLE_POINTERS = 0x14u, 285 S_THREAD_LOCAL_INIT_FUNCTION_POINTERS = 0x15u, 286 S_INIT_FUNC_OFFSETS = 0x16u, 287 LAST_KNOWN_SECTION_TYPE = S_INIT_FUNC_OFFSETS 288 }; 289 290 enum : uint32_t { 291 SG_HIGHVM = 0x1u, 292 SG_FVMLIB = 0x2u, 293 SG_NORELOC = 0x4u, 294 SG_PROTECTED_VERSION_1 = 0x8u, 295 SG_READ_ONLY = 0x10u, 296 SECTION_TYPE = 0x000000ffu, 297 SECTION_ATTRIBUTES = 0xffffff00u, 298 SECTION_ATTRIBUTES_USR = 0xff000000u, 299 SECTION_ATTRIBUTES_SYS = 0x00ffff00u 300 }; 301 302 enum { 303 REFERENCE_TYPE = 0x7, 304 REFERENCE_FLAG_UNDEFINED_NON_LAZY = 0, 305 REFERENCE_FLAG_UNDEFINED_LAZY = 1, 306 REFERENCE_FLAG_DEFINED = 2, 307 REFERENCE_FLAG_PRIVATE_DEFINED = 3, 308 REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY = 4, 309 REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY = 5, 310 N_ARM_THUMB_DEF = 0x0008u, 311 REFERENCED_DYNAMICALLY = 0x0010u, 312 N_NO_DEAD_STRIP = 0x0020u, 313 N_WEAK_REF = 0x0040u, 314 N_WEAK_DEF = 0x0080u, 315 N_SYMBOL_RESOLVER = 0x0100u, 316 N_ALT_ENTRY = 0x0200u, 317 N_COLD_FUNC = 0x0400u, 318 SELF_LIBRARY_ORDINAL = 0x0, 319 MAX_LIBRARY_ORDINAL = 0xfd, 320 DYNAMIC_LOOKUP_ORDINAL = 0xfe, 321 EXECUTABLE_ORDINAL = 0xff 322 }; 323 #endif 324