LCOV - code coverage report
Current view: top level - src/elf - header.rs (source / functions) Coverage Total Hit
Test: lief.lcov Lines: 21.9 % 534 117
Test Date: 2025-06-24:00:00:00 Functions: 50.0 % 62 31

            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              : }
        

Generated by: LCOV version 2.1-1