Revision control
Copy as Markdown
Other Tools
use object::read::{Object, ObjectSection};
use object::{read, write};
use object::{
Architecture, BinaryFormat, Endianness, RelocationEncoding, RelocationFlags, RelocationKind,
SymbolFlags, SymbolKind, SymbolScope,
};
#[test]
fn reloc_overflow() {
let mut object =
write::Object::new(BinaryFormat::Coff, Architecture::X86_64, Endianness::Little);
let text = object.section_id(write::StandardSection::Text);
object.append_section_data(text, &[0; 4], 4);
let symbol = object.add_symbol(write::Symbol {
name: b"f".to_vec(),
value: 0,
size: 4,
kind: SymbolKind::Text,
scope: SymbolScope::Linkage,
weak: false,
section: write::SymbolSection::Section(text),
flags: SymbolFlags::None,
});
for i in 0..0x10000 {
object
.add_relocation(
text,
write::Relocation {
offset: i,
symbol,
addend: 0,
flags: RelocationFlags::Generic {
kind: RelocationKind::Absolute,
encoding: RelocationEncoding::Generic,
size: 64,
},
},
)
.unwrap();
}
let bytes = object.write().unwrap();
//std::fs::write(&"reloc_overflow.o", &bytes).unwrap();
let object = read::File::parse(&*bytes).unwrap();
assert_eq!(object.format(), BinaryFormat::Coff);
assert_eq!(object.architecture(), Architecture::X86_64);
let section = object.sections().next().unwrap();
assert_eq!(section.name(), Ok(".text"));
let mut i = 0;
for (offset, _relocation) in section.relocations() {
assert_eq!(offset, i);
i += 1;
}
assert_eq!(i, 0x10000);
}