1 use core::fmt; 2 use core::str::FromStr; 3 #[cfg(feature = "enable-serde")] 4 use serde_derive::{Deserialize, Serialize}; 5 6 /// A well-known symbol. 7 #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] 8 #[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] 9 pub enum KnownSymbol { 10 /// ELF well-known linker symbol _GLOBAL_OFFSET_TABLE_ 11 ElfGlobalOffsetTable, 12 /// TLS index symbol for the current thread. 13 /// Used in COFF/PE file formats. 14 CoffTlsIndex, 15 } 16 17 impl fmt::Display for KnownSymbol { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result18 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 19 fmt::Debug::fmt(self, f) 20 } 21 } 22 23 impl FromStr for KnownSymbol { 24 type Err = (); 25 from_str(s: &str) -> Result<Self, Self::Err>26 fn from_str(s: &str) -> Result<Self, Self::Err> { 27 match s { 28 "ElfGlobalOffsetTable" => Ok(Self::ElfGlobalOffsetTable), 29 "CoffTlsIndex" => Ok(Self::CoffTlsIndex), 30 _ => Err(()), 31 } 32 } 33 } 34 35 #[cfg(test)] 36 mod tests { 37 use super::*; 38 39 #[test] parsing()40 fn parsing() { 41 assert_eq!( 42 "ElfGlobalOffsetTable".parse(), 43 Ok(KnownSymbol::ElfGlobalOffsetTable) 44 ); 45 assert_eq!("CoffTlsIndex".parse(), Ok(KnownSymbol::CoffTlsIndex)); 46 } 47 } 48