@@ -21,12 +21,16 @@ use bitflags::bitflags;
2121use xmas_elf:: dynamic:: * ;
2222use xmas_elf:: program:: ProgramIter ;
2323
24- pub use xmas_elf:: header:: Machine ;
24+ pub use xmas_elf:: header:: { Header , Machine } ;
2525pub use xmas_elf:: program:: { Flags , ProgramHeader , ProgramHeader64 } ;
2626pub use xmas_elf:: sections:: { Rel , Rela } ;
2727pub use xmas_elf:: symbol_table:: { Entry , Entry64 } ;
2828pub use xmas_elf:: { P32 , P64 } ;
2929
30+ /// Required alignment for zero-copy reads provided to xmas_elf by the
31+ /// zero crate.
32+ pub ( crate ) const ALIGNMENT : usize = core:: mem:: align_of :: < Header > ( ) ;
33+
3034/// An iterator over [`ProgramHeader`] whose type is `LOAD`.
3135pub type LoadableHeaders < ' a , ' b > = Filter < ProgramIter < ' a , ' b > , fn ( & ProgramHeader ) -> bool > ;
3236pub type PAddr = u64 ;
@@ -47,6 +51,7 @@ pub struct RelocationEntry {
4751pub enum ElfLoaderErr {
4852 ElfParser { source : & ' static str } ,
4953 OutOfMemory ,
54+ UnalignedMemory ,
5055 SymbolTableNotFound ,
5156 UnsupportedElfFormat ,
5257 UnsupportedElfVersion ,
@@ -69,6 +74,7 @@ impl fmt::Display for ElfLoaderErr {
6974 match self {
7075 ElfLoaderErr :: ElfParser { source } => write ! ( f, "Error in ELF parser: {}" , source) ,
7176 ElfLoaderErr :: OutOfMemory => write ! ( f, "Out of memory" ) ,
77+ ElfLoaderErr :: UnalignedMemory => write ! ( f, "Data must be aligned to {:?}" , ALIGNMENT ) ,
7278 ElfLoaderErr :: SymbolTableNotFound => write ! ( f, "No symbol table in the ELF file" ) ,
7379 ElfLoaderErr :: UnsupportedElfFormat => write ! ( f, "ELF format not supported" ) ,
7480 ElfLoaderErr :: UnsupportedElfVersion => write ! ( f, "ELF version not supported" ) ,
@@ -166,6 +172,15 @@ pub trait ElfLoader {
166172 }
167173}
168174
175+ /// Utility function to verify alignment.
176+ ///
177+ /// Note: this may be stabilized in the future as:
178+ ///
179+ /// [core::ptr::is_aligned_to](https://doc.rust-lang.org/core/primitive.pointer.html#method.is_aligned_to)
180+ pub ( crate ) fn is_aligned_to ( ptr : usize , align : usize ) -> bool {
181+ ptr & ( align - 1 ) == 0
182+ }
183+
169184#[ cfg( doctest) ]
170185mod test_readme {
171186 macro_rules! external_doc_test {
0 commit comments