Line data Source code
1 : use lief_ffi as ffi;
2 :
3 : use std::{fmt, marker::PhantomData};
4 :
5 : use crate::common::FromFFI;
6 :
7 : #[allow(non_camel_case_types)]
8 130 : #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
9 : /// The type of the underlying ELF file. This enum matches
10 : /// the semantic of `ET_NONE`, `ET_REL`, ...
11 : pub enum FileType {
12 : /// Can't be determined
13 : NONE,
14 :
15 : /// Relocatable file (or object file)
16 : REL,
17 :
18 : /// non-pie executable
19 : EXEC,
20 :
21 : /// Shared library **or** a pie-executable
22 : DYN,
23 :
24 : /// Core dump file
25 : CORE,
26 : UNKNOWN(u32),
27 : }
28 :
29 : impl From<u32> for FileType {
30 130 : fn from(value: u32) -> Self {
31 130 : match value {
32 0 : 0x00000000 => FileType::NONE,
33 26 : 0x00000001 => FileType::REL,
34 39 : 0x00000002 => FileType::EXEC,
35 52 : 0x00000003 => FileType::DYN,
36 13 : 0x00000004 => FileType::CORE,
37 0 : _ => FileType::UNKNOWN(value),
38 : }
39 130 : }
40 : }
41 :
42 : #[allow(non_camel_case_types)]
43 260 : #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
44 : /// Match the result of `Elfxx_Ehdr.e_version`
45 : pub enum Version {
46 : /// Invalid ELF version
47 : NONE,
48 :
49 : /// Current version (default)
50 : CURRENT,
51 : UNKNOWN(u32),
52 : }
53 :
54 : impl From<u32> for Version {
55 260 : fn from(value: u32) -> Self {
56 260 : match value {
57 0 : 0x00000000 => Version::NONE,
58 260 : 0x00000001 => Version::CURRENT,
59 0 : _ => Version::UNKNOWN(value),
60 : }
61 260 : }
62 : }
63 :
64 : #[allow(non_camel_case_types)]
65 130 : #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
66 : /// Match the result of `Elfxx_Ehdr.e_ident[EI_CLASS]`
67 : pub enum Class {
68 : /// Invalid class
69 : NONE,
70 :
71 : /// 32-bit objects
72 : ELF32,
73 :
74 : /// 64-bits objects
75 : ELF64,
76 : UNKNOWN(u32),
77 : }
78 :
79 : impl From<u32> for Class {
80 130 : fn from(value: u32) -> Self {
81 130 : match value {
82 0 : 0x00000000 => Class::NONE,
83 13 : 0x00000001 => Class::ELF32,
84 117 : 0x00000002 => Class::ELF64,
85 0 : _ => Class::UNKNOWN(value),
86 : }
87 130 : }
88 : }
89 :
90 : #[allow(non_camel_case_types)]
91 130 : #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
92 : /// Match the result `Elfxx_Ehdr.e_ident[EI_OSABI]`
93 : pub enum OsAbi {
94 : /// UNIX System V ABI
95 : SYSTEMV,
96 : /// HP-UX operating system
97 : HPUX,
98 : /// NetBSD
99 : NETBSD,
100 : /// GNU/Linux
101 : GNU,
102 : /// Historical alias for ELFOSABI_GNU.
103 : LINUX,
104 : /// GNU/Hurd
105 : HURD,
106 : /// Solaris
107 : SOLARIS,
108 : /// AIX
109 : AIX,
110 : /// IRIX
111 : IRIX,
112 : /// FreeBSD
113 : FREEBSD,
114 : /// TRU64 UNIX
115 : TRU64,
116 : /// Novell Modesto
117 : MODESTO,
118 : /// OpenBSD
119 : OPENBSD,
120 : /// OpenVMS
121 : OPENVMS,
122 : /// Hewlett-Packard Non-Stop Kernel
123 : NSK,
124 : /// AROS
125 : AROS,
126 : /// FenixOS
127 : FENIXOS,
128 : /// Nuxi CloudABI
129 : CLOUDABI,
130 : /// Bare-metal TMS320C6000
131 : C6000_ELFABI,
132 : /// AMD HSA runtime
133 : AMDGPU_HSA,
134 : /// Linux TMS320C6000
135 : C6000_LINUX,
136 : /// ARM
137 : ARM,
138 : /// Standalone (embedded) applicatio
139 : STANDALONE,
140 : UNKNOWN(u32),
141 : }
142 :
143 : impl From<u32> for OsAbi {
144 130 : fn from(value: u32) -> Self {
145 130 : match value {
146 117 : 0x00000000 => OsAbi::SYSTEMV,
147 0 : 0x00000001 => OsAbi::HPUX,
148 0 : 0x00000002 => OsAbi::NETBSD,
149 13 : 0x00000003 => OsAbi::LINUX,
150 0 : 0x00000004 => OsAbi::HURD,
151 0 : 0x00000006 => OsAbi::SOLARIS,
152 0 : 0x00000007 => OsAbi::AIX,
153 0 : 0x00000008 => OsAbi::IRIX,
154 0 : 0x00000009 => OsAbi::FREEBSD,
155 0 : 0x0000000a => OsAbi::TRU64,
156 0 : 0x0000000b => OsAbi::MODESTO,
157 0 : 0x0000000c => OsAbi::OPENBSD,
158 0 : 0x0000000d => OsAbi::OPENVMS,
159 0 : 0x0000000e => OsAbi::NSK,
160 0 : 0x0000000f => OsAbi::AROS,
161 0 : 0x00000010 => OsAbi::FENIXOS,
162 0 : 0x00000011 => OsAbi::CLOUDABI,
163 : /* 0x00000040 => OsAbi::C6000_ELFABI, */
164 0 : 0x00000040 => OsAbi::AMDGPU_HSA,
165 0 : 0x00000041 => OsAbi::C6000_LINUX,
166 0 : 0x00000061 => OsAbi::ARM,
167 0 : 0x000000ff => OsAbi::STANDALONE,
168 0 : _ => OsAbi::UNKNOWN(value),
169 : }
170 130 : }
171 : }
172 :
173 : impl From<OsAbi> for u32 {
174 0 : fn from(value: OsAbi) -> u32 {
175 0 : match value {
176 0 : OsAbi::SYSTEMV => 0x00000000,
177 0 : OsAbi::HPUX => 0x00000001,
178 0 : OsAbi::NETBSD => 0x00000002,
179 0 : OsAbi::GNU => 0x00000003,
180 0 : OsAbi::LINUX => 0x00000003,
181 0 : OsAbi::HURD => 0x00000004,
182 0 : OsAbi::SOLARIS => 0x00000006,
183 0 : OsAbi::AIX => 0x00000007,
184 0 : OsAbi::IRIX => 0x00000008,
185 0 : OsAbi::FREEBSD => 0x00000009,
186 0 : OsAbi::TRU64 => 0x0000000a,
187 0 : OsAbi::MODESTO => 0x0000000b,
188 0 : OsAbi::OPENBSD => 0x0000000c,
189 0 : OsAbi::OPENVMS => 0x0000000d,
190 0 : OsAbi::NSK => 0x0000000e,
191 0 : OsAbi::AROS => 0x0000000f,
192 0 : OsAbi::FENIXOS => 0x00000010,
193 0 : OsAbi::CLOUDABI => 0x00000011,
194 0 : OsAbi::C6000_ELFABI => 0x00000040,
195 0 : OsAbi::AMDGPU_HSA => 0x00000040,
196 0 : OsAbi::C6000_LINUX => 0x00000041,
197 0 : OsAbi::ARM => 0x00000061,
198 0 : OsAbi::STANDALONE => 0x000000ff,
199 0 : OsAbi::UNKNOWN(value) => value,
200 : }
201 0 : }
202 : }
203 :
204 : #[allow(non_camel_case_types)]
205 130 : #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
206 : /// Match the result `Elfxx_Ehdr.e_ident[EI_DATA]`
207 : pub enum ElfData {
208 : /// Invalid data encoding
209 : NONE,
210 : /// 2's complement, little endian
211 : LSB,
212 : /// 2's complement, big endian
213 : MSB,
214 : UNKNOWN(u32),
215 : }
216 :
217 : impl From<u32> for ElfData {
218 130 : fn from(value: u32) -> Self {
219 130 : match value {
220 0 : 0x00000000 => ElfData::NONE,
221 117 : 0x00000001 => ElfData::LSB,
222 13 : 0x00000002 => ElfData::MSB,
223 0 : _ => ElfData::UNKNOWN(value),
224 : }
225 130 : }
226 : }
227 :
228 : /// Class which represents the ELF's header. This class mirrors the raw
229 : /// ELF `Elfxx_Ehdr` structure
230 : pub struct Header<'a> {
231 : ptr: cxx::UniquePtr<ffi::ELF_Header>,
232 : _owner: PhantomData<&'a ffi::ELF_Binary>,
233 : }
234 :
235 : impl FromFFI<ffi::ELF_Header> for Header<'_> {
236 130 : fn from_ffi(hdr: cxx::UniquePtr<ffi::ELF_Header>) -> Self {
237 130 : Self {
238 130 : ptr: hdr,
239 130 : _owner: PhantomData,
240 130 : }
241 130 : }
242 : }
243 :
244 : impl Header<'_> {
245 : /// Executable entrypoint
246 130 : pub fn entrypoint(&self) -> u64 {
247 130 : self.ptr.entrypoint()
248 130 : }
249 :
250 : /// Define the object file type. (e.g. executable, library...)
251 130 : pub fn file_type(&self) -> FileType {
252 130 : FileType::from(self.ptr.file_type())
253 130 : }
254 :
255 : /// Version of the object file format
256 130 : pub fn object_file_version(&self) -> Version {
257 130 : Version::from(self.ptr.object_file_version())
258 130 : }
259 :
260 : /// Return the object's class. `ELF64` or `ELF32`
261 130 : pub fn identity_class(&self) -> Class {
262 130 : Class::from(self.ptr.identity_class())
263 130 : }
264 :
265 : /// Specify the data encoding
266 130 : pub fn identity_data(&self) -> ElfData {
267 130 : ElfData::from(self.ptr.identity_data())
268 130 : }
269 :
270 : /// See: [`Header::object_file_version`]
271 130 : pub fn identity_version(&self) -> Version {
272 130 : Version::from(self.ptr.identity_version())
273 130 : }
274 :
275 : /// Identifies the version of the ABI for which the object is prepared
276 130 : pub fn identity_os_abi(&self) -> OsAbi {
277 130 : OsAbi::from(self.ptr.identity_os_abi())
278 130 : }
279 :
280 : /// Target architecture
281 130 : pub fn machine_type(&self) -> Arch {
282 130 : Arch::from(self.ptr.machine_type())
283 130 : }
284 :
285 : /// Offset of the programs table (also known as segments table)
286 130 : pub fn program_headers_offset(&self) -> u64 {
287 130 : self.ptr.program_headers_offset()
288 130 : }
289 :
290 : /// Offset of the sections table
291 130 : pub fn section_headers_offset(&self) -> u64 {
292 130 : self.ptr.section_headers_offset()
293 130 : }
294 :
295 : /// Processor-specific flags
296 130 : pub fn processor_flag(&self) -> u32 {
297 130 : self.ptr.processor_flag()
298 130 : }
299 :
300 : /// Size of the current header (i.e. `sizeof(Elfxx_Ehdr)`)
301 : /// This size should be 64 for an `ELF64` binary and 52 for an `ELF32`.
302 130 : pub fn header_size(&self) -> u32 {
303 130 : self.ptr.header_size()
304 130 : }
305 :
306 : /// Return the size of a program header (i.e. `sizeof(Elfxx_Phdr)`)
307 : /// This size should be 56 for an `ELF64` binary and 32 for an `ELF32`.
308 130 : pub fn program_header_size(&self) -> u32 {
309 130 : self.ptr.program_header_size()
310 130 : }
311 :
312 : /// Return the number of segments
313 130 : pub fn numberof_segments(&self) -> u32 {
314 130 : self.ptr.numberof_segments()
315 130 : }
316 :
317 : /// Return the size of a section header (i.e. `sizeof(Elfxx_Shdr)`)
318 : /// This size should be 64 for an ``ELF64`` binary and 40 for an ``ELF32``.
319 130 : pub fn section_header_size(&self) -> u32 {
320 130 : self.ptr.section_header_size()
321 130 : }
322 :
323 : /// Return the number of sections
324 : ///
325 : /// <div class="warning">
326 : /// This value could differ from the real number of sections
327 : /// present in the binary. It must be taken as an <i>indication</i>
328 : /// </div>
329 130 : pub fn numberof_sections(&self) -> u32 {
330 130 : self.ptr.numberof_sections()
331 130 : }
332 :
333 : /// Return the section's index which contains sections' names
334 130 : pub fn section_name_table_idx(&self) -> u32 {
335 130 : self.ptr.section_name_table_idx()
336 130 : }
337 :
338 0 : pub fn set_osabi(&mut self, osabi: OsAbi) {
339 0 : self.ptr.pin_mut().set_osabi(osabi.into());
340 0 : }
341 : }
342 :
343 : impl fmt::Debug for Header<'_> {
344 130 : fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
345 130 : f.debug_struct("Header")
346 130 : .field("entrypoint", &self.entrypoint())
347 130 : .field("object_file_version", &self.object_file_version())
348 130 : .field("identity_class", &self.identity_class())
349 130 : .field("identity_os_abi", &self.identity_os_abi())
350 130 : .field("identity_data", &self.identity_data())
351 130 : .field("identity_version", &self.identity_version())
352 130 : .field("file_type", &self.file_type())
353 130 : .field("machine_type", &self.machine_type())
354 130 : .field("program_headers_offset", &self.program_headers_offset())
355 130 : .field("section_headers_offset", &self.section_headers_offset())
356 130 : .field("processor_flag", &self.processor_flag())
357 130 : .field("header_size", &self.header_size())
358 130 : .field("program_header_size", &self.program_header_size())
359 130 : .field("numberof_segments", &self.numberof_segments())
360 130 : .field("section_header_size", &self.section_header_size())
361 130 : .field("numberof_sections", &self.numberof_sections())
362 130 : .field("section_name_table_idx", &self.section_name_table_idx())
363 130 : .finish()
364 130 : }
365 : }
366 :
367 : #[allow(non_camel_case_types)]
368 130 : #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
369 : pub enum Arch {
370 : NONE,
371 : M32,
372 : SPARC,
373 : I386,
374 : M68K,
375 : M88K,
376 : IAMCU,
377 : I860,
378 : MIPS,
379 : S370,
380 : MIPS_RS3_LE,
381 : PARISC,
382 : VPP500,
383 : SPARC32PLUS,
384 : I60,
385 : PPC,
386 : PPC64,
387 : S390,
388 : SPU,
389 : V800,
390 : FR20,
391 : RH32,
392 : RCE,
393 : ARM,
394 : ALPHA,
395 : SH,
396 : SPARCV9,
397 : TRICORE,
398 : ARC,
399 : H8_300,
400 : H8_300H,
401 : H8S,
402 : H8_500,
403 : IA_64,
404 : MIPS_X,
405 : COLDFIRE,
406 : M68HC12,
407 : MMA,
408 : PCP,
409 : NCPU,
410 : NDR1,
411 : STARCORE,
412 : ME16,
413 : ST100,
414 : TINYJ,
415 : X86_64,
416 : PDSP,
417 : PDP10,
418 : PDP11,
419 : FX66,
420 : ST9PLUS,
421 : ST7,
422 : M68HC16,
423 : M68HC11,
424 : M68HC08,
425 : M68HC05,
426 : SVX,
427 : ST19,
428 : VAX,
429 : CRIS,
430 : JAVELIN,
431 : FIREPATH,
432 : ZSP,
433 : MMIX,
434 : HUANY,
435 : PRISM,
436 : AVR,
437 : FR30,
438 : D10V,
439 : D30V,
440 : V850,
441 : M32R,
442 : MN10300,
443 : MN10200,
444 : PJ,
445 : OPENRISC,
446 : ARC_COMPACT,
447 : XTENSA,
448 : VIDEOCORE,
449 : TMM_GPP,
450 : NS32K,
451 : TPC,
452 : SNP1K,
453 : ST200,
454 : IP2K,
455 : MAX,
456 : CR,
457 : F2MC16,
458 : MSP430,
459 : BLACKFIN,
460 : SE_C33,
461 : SEP,
462 : ARCA,
463 : UNICORE,
464 : EXCESS,
465 : DXP,
466 : ALTERA_NIOS2,
467 : CRX,
468 : XGATE,
469 : C166,
470 : M16C,
471 : DSPIC30F,
472 : CE,
473 : M32C,
474 : TSK3000,
475 : RS08,
476 : SHARC,
477 : ECOG2,
478 : SCORE7,
479 : DSP24,
480 : VIDEOCORE3,
481 : LATTICEMICO32,
482 : SE_C17,
483 : TI_C6000,
484 : TI_C2000,
485 : TI_C5500,
486 : MMDSP_PLUS,
487 : CYPRESS_M8C,
488 : R32C,
489 : TRIMEDIA,
490 : HEXAGON,
491 : M8051,
492 : STXP7X,
493 : NDS32,
494 : ECOG1,
495 : //ECOG1X,
496 : MAXQ30,
497 : XIMO16,
498 : MANIK,
499 : CRAYNV2,
500 : RX,
501 : METAG,
502 : MCST_ELBRUS,
503 : ECOG16,
504 : CR16,
505 : ETPU,
506 : SLE9X,
507 : L10M,
508 : K10M,
509 : AARCH64,
510 : AVR32,
511 : STM8,
512 : TILE64,
513 : TILEPRO,
514 : CUDA,
515 : TILEGX,
516 : CLOUDSHIELD,
517 : COREA_1ST,
518 : COREA_2ND,
519 : ARC_COMPACT2,
520 : OPEN8,
521 : RL78,
522 : VIDEOCORE5,
523 : M78KOR,
524 : M56800EX,
525 : BA1,
526 : BA2,
527 : XCORE,
528 : MCHP_PIC,
529 : INTEL205,
530 : INTEL206,
531 : INTEL207,
532 : INTEL208,
533 : INTEL209,
534 : KM32,
535 : KMX32,
536 : KMX16,
537 : KMX8,
538 : KVARC,
539 : CDP,
540 : COGE,
541 : COOL,
542 : NORC,
543 : CSR_KALIMBA,
544 : AMDGPU,
545 : RISCV,
546 : BPF,
547 : CSKY,
548 : LOONGARCH,
549 : ALPHA_ALT,
550 : UNKNOWN(u32),
551 : }
552 :
553 : impl From<u32> for Arch {
554 156 : fn from(value: u32) -> Self {
555 156 : match value {
556 0 : 0x00000000 => Arch::NONE,
557 0 : 0x00000001 => Arch::M32,
558 0 : 0x00000002 => Arch::SPARC,
559 0 : 0x00000003 => Arch::I386,
560 0 : 0x00000004 => Arch::M68K,
561 0 : 0x00000005 => Arch::M88K,
562 0 : 0x00000006 => Arch::IAMCU,
563 0 : 0x00000007 => Arch::I860,
564 13 : 0x00000008 => Arch::MIPS,
565 0 : 0x00000009 => Arch::S370,
566 0 : 0x0000000a => Arch::MIPS_RS3_LE,
567 0 : 0x0000000f => Arch::PARISC,
568 0 : 0x00000011 => Arch::VPP500,
569 0 : 0x00000012 => Arch::SPARC32PLUS,
570 0 : 0x00000013 => Arch::I60,
571 0 : 0x00000014 => Arch::PPC,
572 0 : 0x00000015 => Arch::PPC64,
573 0 : 0x00000016 => Arch::S390,
574 0 : 0x00000017 => Arch::SPU,
575 0 : 0x00000024 => Arch::V800,
576 0 : 0x00000025 => Arch::FR20,
577 0 : 0x00000026 => Arch::RH32,
578 0 : 0x00000027 => Arch::RCE,
579 13 : 0x00000028 => Arch::ARM,
580 0 : 0x00000029 => Arch::ALPHA,
581 0 : 0x0000002a => Arch::SH,
582 0 : 0x0000002b => Arch::SPARCV9,
583 0 : 0x0000002c => Arch::TRICORE,
584 0 : 0x0000002d => Arch::ARC,
585 0 : 0x0000002e => Arch::H8_300,
586 0 : 0x0000002f => Arch::H8_300H,
587 0 : 0x00000030 => Arch::H8S,
588 0 : 0x00000031 => Arch::H8_500,
589 0 : 0x00000032 => Arch::IA_64,
590 0 : 0x00000033 => Arch::MIPS_X,
591 0 : 0x00000034 => Arch::COLDFIRE,
592 0 : 0x00000035 => Arch::M68HC12,
593 0 : 0x00000036 => Arch::MMA,
594 0 : 0x00000037 => Arch::PCP,
595 0 : 0x00000038 => Arch::NCPU,
596 0 : 0x00000039 => Arch::NDR1,
597 0 : 0x0000003a => Arch::STARCORE,
598 0 : 0x0000003b => Arch::ME16,
599 0 : 0x0000003c => Arch::ST100,
600 0 : 0x0000003d => Arch::TINYJ,
601 91 : 0x0000003e => Arch::X86_64,
602 0 : 0x0000003f => Arch::PDSP,
603 0 : 0x00000040 => Arch::PDP10,
604 0 : 0x00000041 => Arch::PDP11,
605 0 : 0x00000042 => Arch::FX66,
606 0 : 0x00000043 => Arch::ST9PLUS,
607 0 : 0x00000044 => Arch::ST7,
608 0 : 0x00000045 => Arch::M68HC16,
609 0 : 0x00000046 => Arch::M68HC11,
610 0 : 0x00000047 => Arch::M68HC08,
611 0 : 0x00000048 => Arch::M68HC05,
612 0 : 0x00000049 => Arch::SVX,
613 0 : 0x0000004a => Arch::ST19,
614 0 : 0x0000004b => Arch::VAX,
615 0 : 0x0000004c => Arch::CRIS,
616 0 : 0x0000004d => Arch::JAVELIN,
617 0 : 0x0000004e => Arch::FIREPATH,
618 0 : 0x0000004f => Arch::ZSP,
619 0 : 0x00000050 => Arch::MMIX,
620 0 : 0x00000051 => Arch::HUANY,
621 0 : 0x00000052 => Arch::PRISM,
622 0 : 0x00000053 => Arch::AVR,
623 0 : 0x00000054 => Arch::FR30,
624 0 : 0x00000055 => Arch::D10V,
625 0 : 0x00000056 => Arch::D30V,
626 0 : 0x00000057 => Arch::V850,
627 0 : 0x00000058 => Arch::M32R,
628 0 : 0x00000059 => Arch::MN10300,
629 0 : 0x0000005a => Arch::MN10200,
630 0 : 0x0000005b => Arch::PJ,
631 0 : 0x0000005c => Arch::OPENRISC,
632 0 : 0x0000005d => Arch::ARC_COMPACT,
633 0 : 0x0000005e => Arch::XTENSA,
634 0 : 0x0000005f => Arch::VIDEOCORE,
635 0 : 0x00000060 => Arch::TMM_GPP,
636 0 : 0x00000061 => Arch::NS32K,
637 0 : 0x00000062 => Arch::TPC,
638 0 : 0x00000063 => Arch::SNP1K,
639 0 : 0x00000064 => Arch::ST200,
640 0 : 0x00000065 => Arch::IP2K,
641 0 : 0x00000066 => Arch::MAX,
642 0 : 0x00000067 => Arch::CR,
643 0 : 0x00000068 => Arch::F2MC16,
644 0 : 0x00000069 => Arch::MSP430,
645 0 : 0x0000006a => Arch::BLACKFIN,
646 0 : 0x0000006b => Arch::SE_C33,
647 0 : 0x0000006c => Arch::SEP,
648 0 : 0x0000006d => Arch::ARCA,
649 0 : 0x0000006e => Arch::UNICORE,
650 0 : 0x0000006f => Arch::EXCESS,
651 0 : 0x00000070 => Arch::DXP,
652 0 : 0x00000071 => Arch::ALTERA_NIOS2,
653 0 : 0x00000072 => Arch::CRX,
654 0 : 0x00000073 => Arch::XGATE,
655 0 : 0x00000074 => Arch::C166,
656 0 : 0x00000075 => Arch::M16C,
657 0 : 0x00000076 => Arch::DSPIC30F,
658 0 : 0x00000077 => Arch::CE,
659 0 : 0x00000078 => Arch::M32C,
660 0 : 0x00000083 => Arch::TSK3000,
661 0 : 0x00000084 => Arch::RS08,
662 0 : 0x00000085 => Arch::SHARC,
663 0 : 0x00000086 => Arch::ECOG2,
664 0 : 0x00000087 => Arch::SCORE7,
665 0 : 0x00000088 => Arch::DSP24,
666 0 : 0x00000089 => Arch::VIDEOCORE3,
667 0 : 0x0000008a => Arch::LATTICEMICO32,
668 0 : 0x0000008b => Arch::SE_C17,
669 0 : 0x0000008c => Arch::TI_C6000,
670 0 : 0x0000008d => Arch::TI_C2000,
671 0 : 0x0000008e => Arch::TI_C5500,
672 0 : 0x000000a0 => Arch::MMDSP_PLUS,
673 0 : 0x000000a1 => Arch::CYPRESS_M8C,
674 0 : 0x000000a2 => Arch::R32C,
675 0 : 0x000000a3 => Arch::TRIMEDIA,
676 0 : 0x000000a4 => Arch::HEXAGON,
677 0 : 0x000000a5 => Arch::M8051,
678 0 : 0x000000a6 => Arch::STXP7X,
679 0 : 0x000000a7 => Arch::NDS32,
680 0 : 0x000000a8 => Arch::ECOG1,
681 : /*0x000000a8 => Arch::ECOG1X,*/
682 0 : 0x000000a9 => Arch::MAXQ30,
683 0 : 0x000000aa => Arch::XIMO16,
684 0 : 0x000000ab => Arch::MANIK,
685 0 : 0x000000ac => Arch::CRAYNV2,
686 0 : 0x000000ad => Arch::RX,
687 0 : 0x000000ae => Arch::METAG,
688 0 : 0x000000af => Arch::MCST_ELBRUS,
689 0 : 0x000000b0 => Arch::ECOG16,
690 0 : 0x000000b1 => Arch::CR16,
691 0 : 0x000000b2 => Arch::ETPU,
692 0 : 0x000000b3 => Arch::SLE9X,
693 0 : 0x000000b4 => Arch::L10M,
694 0 : 0x000000b5 => Arch::K10M,
695 26 : 0x000000b7 => Arch::AARCH64,
696 0 : 0x000000b9 => Arch::AVR32,
697 0 : 0x000000ba => Arch::STM8,
698 0 : 0x000000bb => Arch::TILE64,
699 0 : 0x000000bc => Arch::TILEPRO,
700 0 : 0x000000be => Arch::CUDA,
701 0 : 0x000000bf => Arch::TILEGX,
702 0 : 0x000000c0 => Arch::CLOUDSHIELD,
703 0 : 0x000000c1 => Arch::COREA_1ST,
704 0 : 0x000000c2 => Arch::COREA_2ND,
705 0 : 0x000000c3 => Arch::ARC_COMPACT2,
706 0 : 0x000000c4 => Arch::OPEN8,
707 0 : 0x000000c5 => Arch::RL78,
708 0 : 0x000000c6 => Arch::VIDEOCORE5,
709 0 : 0x000000c7 => Arch::M78KOR,
710 0 : 0x000000c8 => Arch::M56800EX,
711 0 : 0x000000c9 => Arch::BA1,
712 0 : 0x000000ca => Arch::BA2,
713 0 : 0x000000cb => Arch::XCORE,
714 0 : 0x000000cc => Arch::MCHP_PIC,
715 0 : 0x000000cd => Arch::INTEL205,
716 0 : 0x000000ce => Arch::INTEL206,
717 0 : 0x000000cf => Arch::INTEL207,
718 0 : 0x000000d0 => Arch::INTEL208,
719 0 : 0x000000d1 => Arch::INTEL209,
720 0 : 0x000000d2 => Arch::KM32,
721 0 : 0x000000d3 => Arch::KMX32,
722 0 : 0x000000d4 => Arch::KMX16,
723 0 : 0x000000d5 => Arch::KMX8,
724 0 : 0x000000d6 => Arch::KVARC,
725 0 : 0x000000d7 => Arch::CDP,
726 0 : 0x000000d8 => Arch::COGE,
727 0 : 0x000000d9 => Arch::COOL,
728 0 : 0x000000da => Arch::NORC,
729 0 : 0x000000db => Arch::CSR_KALIMBA,
730 0 : 0x000000e0 => Arch::AMDGPU,
731 0 : 0x000000f3 => Arch::RISCV,
732 0 : 0x000000f7 => Arch::BPF,
733 0 : 0x000000fc => Arch::CSKY,
734 13 : 0x00000102 => Arch::LOONGARCH,
735 0 : 0x00009026 => Arch::ALPHA_ALT,
736 0 : _ => Arch::UNKNOWN(value),
737 : }
738 156 : }
739 : }
740 : impl From<Arch> for u32 {
741 0 : fn from(value: Arch) -> u32 {
742 0 : match value {
743 0 : Arch::NONE => 0x00000000,
744 0 : Arch::M32 => 0x00000001,
745 0 : Arch::SPARC => 0x00000002,
746 0 : Arch::I386 => 0x00000003,
747 0 : Arch::M68K => 0x00000004,
748 0 : Arch::M88K => 0x00000005,
749 0 : Arch::IAMCU => 0x00000006,
750 0 : Arch::I860 => 0x00000007,
751 0 : Arch::MIPS => 0x00000008,
752 0 : Arch::S370 => 0x00000009,
753 0 : Arch::MIPS_RS3_LE => 0x0000000a,
754 0 : Arch::PARISC => 0x0000000f,
755 0 : Arch::VPP500 => 0x00000011,
756 0 : Arch::SPARC32PLUS => 0x00000012,
757 0 : Arch::I60 => 0x00000013,
758 0 : Arch::PPC => 0x00000014,
759 0 : Arch::PPC64 => 0x00000015,
760 0 : Arch::S390 => 0x00000016,
761 0 : Arch::SPU => 0x00000017,
762 0 : Arch::V800 => 0x00000024,
763 0 : Arch::FR20 => 0x00000025,
764 0 : Arch::RH32 => 0x00000026,
765 0 : Arch::RCE => 0x00000027,
766 0 : Arch::ARM => 0x00000028,
767 0 : Arch::ALPHA => 0x00000029,
768 0 : Arch::SH => 0x0000002a,
769 0 : Arch::SPARCV9 => 0x0000002b,
770 0 : Arch::TRICORE => 0x0000002c,
771 0 : Arch::ARC => 0x0000002d,
772 0 : Arch::H8_300 => 0x0000002e,
773 0 : Arch::H8_300H => 0x0000002f,
774 0 : Arch::H8S => 0x00000030,
775 0 : Arch::H8_500 => 0x00000031,
776 0 : Arch::IA_64 => 0x00000032,
777 0 : Arch::MIPS_X => 0x00000033,
778 0 : Arch::COLDFIRE => 0x00000034,
779 0 : Arch::M68HC12 => 0x00000035,
780 0 : Arch::MMA => 0x00000036,
781 0 : Arch::PCP => 0x00000037,
782 0 : Arch::NCPU => 0x00000038,
783 0 : Arch::NDR1 => 0x00000039,
784 0 : Arch::STARCORE => 0x0000003a,
785 0 : Arch::ME16 => 0x0000003b,
786 0 : Arch::ST100 => 0x0000003c,
787 0 : Arch::TINYJ => 0x0000003d,
788 0 : Arch::X86_64 => 0x0000003e,
789 0 : Arch::PDSP => 0x0000003f,
790 0 : Arch::PDP10 => 0x00000040,
791 0 : Arch::PDP11 => 0x00000041,
792 0 : Arch::FX66 => 0x00000042,
793 0 : Arch::ST9PLUS => 0x00000043,
794 0 : Arch::ST7 => 0x00000044,
795 0 : Arch::M68HC16 => 0x00000045,
796 0 : Arch::M68HC11 => 0x00000046,
797 0 : Arch::M68HC08 => 0x00000047,
798 0 : Arch::M68HC05 => 0x00000048,
799 0 : Arch::SVX => 0x00000049,
800 0 : Arch::ST19 => 0x0000004a,
801 0 : Arch::VAX => 0x0000004b,
802 0 : Arch::CRIS => 0x0000004c,
803 0 : Arch::JAVELIN => 0x0000004d,
804 0 : Arch::FIREPATH => 0x0000004e,
805 0 : Arch::ZSP => 0x0000004f,
806 0 : Arch::MMIX => 0x00000050,
807 0 : Arch::HUANY => 0x00000051,
808 0 : Arch::PRISM => 0x00000052,
809 0 : Arch::AVR => 0x00000053,
810 0 : Arch::FR30 => 0x00000054,
811 0 : Arch::D10V => 0x00000055,
812 0 : Arch::D30V => 0x00000056,
813 0 : Arch::V850 => 0x00000057,
814 0 : Arch::M32R => 0x00000058,
815 0 : Arch::MN10300 => 0x00000059,
816 0 : Arch::MN10200 => 0x0000005a,
817 0 : Arch::PJ => 0x0000005b,
818 0 : Arch::OPENRISC => 0x0000005c,
819 0 : Arch::ARC_COMPACT => 0x0000005d,
820 0 : Arch::XTENSA => 0x0000005e,
821 0 : Arch::VIDEOCORE => 0x0000005f,
822 0 : Arch::TMM_GPP => 0x00000060,
823 0 : Arch::NS32K => 0x00000061,
824 0 : Arch::TPC => 0x00000062,
825 0 : Arch::SNP1K => 0x00000063,
826 0 : Arch::ST200 => 0x00000064,
827 0 : Arch::IP2K => 0x00000065,
828 0 : Arch::MAX => 0x00000066,
829 0 : Arch::CR => 0x00000067,
830 0 : Arch::F2MC16 => 0x00000068,
831 0 : Arch::MSP430 => 0x00000069,
832 0 : Arch::BLACKFIN => 0x0000006a,
833 0 : Arch::SE_C33 => 0x0000006b,
834 0 : Arch::SEP => 0x0000006c,
835 0 : Arch::ARCA => 0x0000006d,
836 0 : Arch::UNICORE => 0x0000006e,
837 0 : Arch::EXCESS => 0x0000006f,
838 0 : Arch::DXP => 0x00000070,
839 0 : Arch::ALTERA_NIOS2 => 0x00000071,
840 0 : Arch::CRX => 0x00000072,
841 0 : Arch::XGATE => 0x00000073,
842 0 : Arch::C166 => 0x00000074,
843 0 : Arch::M16C => 0x00000075,
844 0 : Arch::DSPIC30F => 0x00000076,
845 0 : Arch::CE => 0x00000077,
846 0 : Arch::M32C => 0x00000078,
847 0 : Arch::TSK3000 => 0x00000083,
848 0 : Arch::RS08 => 0x00000084,
849 0 : Arch::SHARC => 0x00000085,
850 0 : Arch::ECOG2 => 0x00000086,
851 0 : Arch::SCORE7 => 0x00000087,
852 0 : Arch::DSP24 => 0x00000088,
853 0 : Arch::VIDEOCORE3 => 0x00000089,
854 0 : Arch::LATTICEMICO32 => 0x0000008a,
855 0 : Arch::SE_C17 => 0x0000008b,
856 0 : Arch::TI_C6000 => 0x0000008c,
857 0 : Arch::TI_C2000 => 0x0000008d,
858 0 : Arch::TI_C5500 => 0x0000008e,
859 0 : Arch::MMDSP_PLUS => 0x000000a0,
860 0 : Arch::CYPRESS_M8C => 0x000000a1,
861 0 : Arch::R32C => 0x000000a2,
862 0 : Arch::TRIMEDIA => 0x000000a3,
863 0 : Arch::HEXAGON => 0x000000a4,
864 0 : Arch::M8051 => 0x000000a5,
865 0 : Arch::STXP7X => 0x000000a6,
866 0 : Arch::NDS32 => 0x000000a7,
867 0 : Arch::ECOG1 => 0x000000a8,
868 : /*Arch::ECOG1X => 0x000000a8,*/
869 0 : Arch::MAXQ30 => 0x000000a9,
870 0 : Arch::XIMO16 => 0x000000aa,
871 0 : Arch::MANIK => 0x000000ab,
872 0 : Arch::CRAYNV2 => 0x000000ac,
873 0 : Arch::RX => 0x000000ad,
874 0 : Arch::METAG => 0x000000ae,
875 0 : Arch::MCST_ELBRUS => 0x000000af,
876 0 : Arch::ECOG16 => 0x000000b0,
877 0 : Arch::CR16 => 0x000000b1,
878 0 : Arch::ETPU => 0x000000b2,
879 0 : Arch::SLE9X => 0x000000b3,
880 0 : Arch::L10M => 0x000000b4,
881 0 : Arch::K10M => 0x000000b5,
882 0 : Arch::AARCH64 => 0x000000b7,
883 0 : Arch::AVR32 => 0x000000b9,
884 0 : Arch::STM8 => 0x000000ba,
885 0 : Arch::TILE64 => 0x000000bb,
886 0 : Arch::TILEPRO => 0x000000bc,
887 0 : Arch::CUDA => 0x000000be,
888 0 : Arch::TILEGX => 0x000000bf,
889 0 : Arch::CLOUDSHIELD => 0x000000c0,
890 0 : Arch::COREA_1ST => 0x000000c1,
891 0 : Arch::COREA_2ND => 0x000000c2,
892 0 : Arch::ARC_COMPACT2 => 0x000000c3,
893 0 : Arch::OPEN8 => 0x000000c4,
894 0 : Arch::RL78 => 0x000000c5,
895 0 : Arch::VIDEOCORE5 => 0x000000c6,
896 0 : Arch::M78KOR => 0x000000c7,
897 0 : Arch::M56800EX => 0x000000c8,
898 0 : Arch::BA1 => 0x000000c9,
899 0 : Arch::BA2 => 0x000000ca,
900 0 : Arch::XCORE => 0x000000cb,
901 0 : Arch::MCHP_PIC => 0x000000cc,
902 0 : Arch::INTEL205 => 0x000000cd,
903 0 : Arch::INTEL206 => 0x000000ce,
904 0 : Arch::INTEL207 => 0x000000cf,
905 0 : Arch::INTEL208 => 0x000000d0,
906 0 : Arch::INTEL209 => 0x000000d1,
907 0 : Arch::KM32 => 0x000000d2,
908 0 : Arch::KMX32 => 0x000000d3,
909 0 : Arch::KMX16 => 0x000000d4,
910 0 : Arch::KMX8 => 0x000000d5,
911 0 : Arch::KVARC => 0x000000d6,
912 0 : Arch::CDP => 0x000000d7,
913 0 : Arch::COGE => 0x000000d8,
914 0 : Arch::COOL => 0x000000d9,
915 0 : Arch::NORC => 0x000000da,
916 0 : Arch::CSR_KALIMBA => 0x000000db,
917 0 : Arch::AMDGPU => 0x000000e0,
918 0 : Arch::RISCV => 0x000000f3,
919 0 : Arch::BPF => 0x000000f7,
920 0 : Arch::CSKY => 0x000000fc,
921 0 : Arch::LOONGARCH => 0x00000102,
922 0 : Arch::ALPHA_ALT => 0x00009026,
923 0 : Arch::UNKNOWN(value) => value,
924 : }
925 0 : }
926 : }
|