#![cfg(all(feature = "read", feature = "write"))] use object::read::{Object, ObjectSection}; use object::{read, write}; use object::{Architecture, BinaryFormat, Endianness, SectionFlags, SectionKind}; #[test] fn coff_x86_64_section_flags() { let mut object = write::Object::new(BinaryFormat::Coff, Architecture::X86_64, Endianness::Little); let section = object.add_section(Vec::new(), b".text".to_vec(), SectionKind::Text); object.section_mut(section).flags = SectionFlags::Coff { characteristics: object::pe::IMAGE_SCN_MEM_WRITE, }; let bytes = object.write().unwrap(); let object = read::File::parse(&*bytes).unwrap(); assert_eq!(object.format(), BinaryFormat::Coff); assert_eq!(object.architecture(), Architecture::X86_64); let mut sections = object.sections(); let section = sections.next().unwrap(); assert_eq!(section.name(), Ok(".text")); assert_eq!( section.flags(), SectionFlags::Coff { characteristics: object::pe::IMAGE_SCN_MEM_WRITE | object::pe::IMAGE_SCN_ALIGN_1BYTES, } ); } #[test] fn elf_x86_64_section_flags() { let mut object = write::Object::new(BinaryFormat::Elf, Architecture::X86_64, Endianness::Little); let section = object.add_section(Vec::new(), b".text".to_vec(), SectionKind::Text); object.section_mut(section).flags = SectionFlags::Elf { sh_flags: object::elf::SHF_WRITE.into(), }; let bytes = object.write().unwrap(); let object = read::File::parse(&*bytes).unwrap(); assert_eq!(object.format(), BinaryFormat::Elf); assert_eq!(object.architecture(), Architecture::X86_64); let mut sections = object.sections(); sections.next().unwrap(); let section = sections.next().unwrap(); assert_eq!(section.name(), Ok(".text")); assert_eq!( section.flags(), SectionFlags::Elf { sh_flags: object::elf::SHF_WRITE.into(), } ); } #[test] fn macho_x86_64_section_flags() { let mut object = write::Object::new( BinaryFormat::MachO, Architecture::X86_64, Endianness::Little, ); let section = object.add_section(Vec::new(), b".text".to_vec(), SectionKind::Text); object.section_mut(section).flags = SectionFlags::MachO { flags: object::macho::S_ATTR_SELF_MODIFYING_CODE, }; let bytes = object.write().unwrap(); let object = read::File::parse(&*bytes).unwrap(); assert_eq!(object.format(), BinaryFormat::MachO); assert_eq!(object.architecture(), Architecture::X86_64); let mut sections = object.sections(); let section = sections.next().unwrap(); assert_eq!(section.name(), Ok(".text")); assert_eq!( section.flags(), SectionFlags::MachO { flags: object::macho::S_ATTR_SELF_MODIFYING_CODE, } ); }