Object file support for s390x (#2872)
Add support for s390x binary format object files. In particular, add support for s390x ELF relocation types (currently only S390xPCRel32Dbl).
This commit is contained in:
@@ -120,6 +120,7 @@ fn ensure_supported_elf_format(bytes: &mut Vec<u8>) -> Result<Endianness, Error>
|
||||
|
||||
match header.e_machine.get(e) {
|
||||
EM_X86_64 => (),
|
||||
EM_S390 => (),
|
||||
machine => {
|
||||
bail!("Unsupported ELF target machine: {:x}", machine);
|
||||
}
|
||||
|
||||
@@ -111,6 +111,19 @@ fn apply_reloc(
|
||||
);
|
||||
write_unaligned(reloc_address as *mut u32, reloc_delta_u64 as u32);
|
||||
},
|
||||
#[cfg(target_pointer_width = "64")]
|
||||
(RelocationKind::Relative, RelocationEncoding::S390xDbl, 32) => unsafe {
|
||||
let reloc_address = body.add(offset as usize) as usize;
|
||||
let reloc_addend = r.addend() as isize;
|
||||
let reloc_delta_u64 = (target_func_address as u64)
|
||||
.wrapping_sub(reloc_address as u64)
|
||||
.wrapping_add(reloc_addend as u64);
|
||||
assert!(
|
||||
(reloc_delta_u64 as isize) >> 1 <= i32::max_value() as isize,
|
||||
"relocation too large to fit in i32"
|
||||
);
|
||||
write_unaligned(reloc_address as *mut u32, (reloc_delta_u64 >> 1) as u32);
|
||||
},
|
||||
(RelocationKind::Elf(elf::R_AARCH64_CALL26), RelocationEncoding::Generic, 32) => unsafe {
|
||||
let reloc_address = body.add(offset as usize) as usize;
|
||||
let reloc_addend = r.addend() as isize;
|
||||
|
||||
@@ -80,6 +80,7 @@ fn to_object_relocations<'a>(
|
||||
RelocationEncoding::Generic,
|
||||
32,
|
||||
),
|
||||
Reloc::S390xPCRel32Dbl => (RelocationKind::Relative, RelocationEncoding::S390xDbl, 32),
|
||||
other => unimplemented!("Unimplemented relocation {:?}", other),
|
||||
};
|
||||
Some(ObjectRelocation {
|
||||
@@ -102,6 +103,7 @@ fn to_object_architecture(
|
||||
X86_64 => Architecture::X86_64,
|
||||
Arm(_) => Architecture::Arm,
|
||||
Aarch64(_) => Architecture::Aarch64,
|
||||
S390x => Architecture::S390x,
|
||||
architecture => {
|
||||
anyhow::bail!("target architecture {:?} is unsupported", architecture,);
|
||||
}
|
||||
|
||||
@@ -241,6 +241,7 @@ impl State {
|
||||
Architecture::X86_32(_) => elf::EM_386 as u32,
|
||||
Architecture::Arm(_) => elf::EM_ARM as u32,
|
||||
Architecture::Aarch64(_) => elf::EM_AARCH64 as u32,
|
||||
Architecture::S390x => elf::EM_S390 as u32,
|
||||
_ => unimplemented!("unrecognized architecture"),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user