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