summaryrefslogtreecommitdiffstats
path: root/vendor/object/tests/round_trip/section_flags.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/object/tests/round_trip/section_flags.rs')
-rw-r--r--vendor/object/tests/round_trip/section_flags.rs90
1 files changed, 90 insertions, 0 deletions
diff --git a/vendor/object/tests/round_trip/section_flags.rs b/vendor/object/tests/round_trip/section_flags.rs
new file mode 100644
index 000000000..b1ca398b4
--- /dev/null
+++ b/vendor/object/tests/round_trip/section_flags.rs
@@ -0,0 +1,90 @@
+#![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,
+ }
+ );
+}