diff options
Diffstat (limited to 'vendor/object/tests')
-rw-r--r-- | vendor/object/tests/round_trip/macho.rs | 43 | ||||
-rw-r--r-- | vendor/object/tests/round_trip/mod.rs | 1 |
2 files changed, 42 insertions, 2 deletions
diff --git a/vendor/object/tests/round_trip/macho.rs b/vendor/object/tests/round_trip/macho.rs index ca3ad5ca2..f45d3db12 100644 --- a/vendor/object/tests/round_trip/macho.rs +++ b/vendor/object/tests/round_trip/macho.rs @@ -1,8 +1,9 @@ use object::read::macho::MachHeader; -use object::{macho, write, Architecture, BinaryFormat, Endianness}; +use object::read::{Object, ObjectSection}; +use object::{macho, read, write, Architecture, BinaryFormat, Endianness}; -#[test] // Test that segment size is valid when the first section needs alignment. +#[test] fn issue_286_segment_file_size() { let mut object = write::Object::new( BinaryFormat::MachO, @@ -22,3 +23,41 @@ fn issue_286_segment_file_size() { assert_eq!(segment.vmsize.get(endian), 30); assert_eq!(segment.filesize.get(endian), 30); } + +// We were emitting section file alignment padding that didn't match the address alignment padding. +#[test] +fn issue_552_section_file_alignment() { + let mut object = write::Object::new( + BinaryFormat::MachO, + Architecture::X86_64, + Endianness::Little, + ); + + // Odd number of sections ensures that the starting file offset is not a multiple of 32. + // Length of 32 ensures that the file offset of the end of this section is still not a + // multiple of 32. + let section = object.add_section(vec![], vec![], object::SectionKind::ReadOnlyDataWithRel); + object.append_section_data(section, &vec![0u8; 32], 1); + + // Address is already aligned correctly, so there must not any padding, + // even though file offset is not aligned. + let section = object.add_section(vec![], vec![], object::SectionKind::ReadOnlyData); + object.append_section_data(section, &vec![0u8; 1], 32); + + let section = object.add_section(vec![], vec![], object::SectionKind::Text); + object.append_section_data(section, &vec![0u8; 1], 1); + + let bytes = &*object.write().unwrap(); + let object = read::File::parse(bytes).unwrap(); + let mut sections = object.sections(); + + let section = sections.next().unwrap(); + assert_eq!(section.file_range(), Some((368, 32))); + assert_eq!(section.address(), 0); + assert_eq!(section.size(), 32); + + let section = sections.next().unwrap(); + assert_eq!(section.file_range(), Some((400, 1))); + assert_eq!(section.address(), 32); + assert_eq!(section.size(), 1); +} diff --git a/vendor/object/tests/round_trip/mod.rs b/vendor/object/tests/round_trip/mod.rs index 8f8dd79c9..cd696f608 100644 --- a/vendor/object/tests/round_trip/mod.rs +++ b/vendor/object/tests/round_trip/mod.rs @@ -235,6 +235,7 @@ fn elf_any() { (Architecture::Arm, Endianness::Little), (Architecture::Avr, Endianness::Little), (Architecture::Bpf, Endianness::Little), + (Architecture::Csky, Endianness::Little), (Architecture::I386, Endianness::Little), (Architecture::X86_64, Endianness::Little), (Architecture::X86_64_X32, Endianness::Little), |