LCOV - code coverage report
Current view: top level - src/elf - header.rs (source / functions) Coverage Total Hit
Test: lief.lcov Lines: 22.1 % 534 118
Test Date: 2026-04-12:00:00:00 Functions: 51.6 % 62 32

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

Generated by: LCOV version 2.1-1