| 195 | |
| 196 | pub trait Elf64Writable { |
| 197 | fn write_header( |
| 198 | &mut self, |
| 199 | dump_state: &DumpState, |
| 200 | ) -> std::result::Result<(), GuestDebuggableError> { |
| 201 | let e_ident = [ |
| 202 | elf::ELFMAG0 as u8, // magic |
| 203 | elf::ELFMAG1, |
| 204 | elf::ELFMAG2, |
| 205 | elf::ELFMAG3, |
| 206 | ELFCLASS64, // class |
| 207 | elf::ELFDATA2LSB as u8, //data |
| 208 | EV_CURRENT, // version |
| 209 | 0, // os_abi |
| 210 | 0, // abi_version |
| 211 | 0, // padding |
| 212 | 0, |
| 213 | 0, |
| 214 | 0, |
| 215 | 0, |
| 216 | 0, |
| 217 | 0, |
| 218 | ]; |
| 219 | let elf64_ehdr_size = std::mem::size_of::<elf::Elf64_Ehdr>(); |
| 220 | let elf64_phdr_size = std::mem::size_of::<elf::Elf64_Phdr>(); |
| 221 | let mut elf64_ehdr = elf::Elf64_Ehdr { |
| 222 | e_ident, |
| 223 | e_type: ET_CORE, |
| 224 | e_machine: EM_X86_64, |
| 225 | e_version: EV_CURRENT as u32, |
| 226 | e_entry: 0, |
| 227 | e_phoff: elf64_ehdr_size as u64, |
| 228 | e_shoff: 0, |
| 229 | e_flags: 0, |
| 230 | e_ehsize: 0, |
| 231 | e_phentsize: elf64_phdr_size as u16, |
| 232 | e_phnum: dump_state.elf_phdr_num, |
| 233 | e_shentsize: 0, |
| 234 | e_shnum: 0, |
| 235 | e_shstrndx: 0, |
| 236 | }; |
| 237 | elf64_ehdr.e_ehsize = std::mem::size_of_val(&elf64_ehdr) as u16; |
| 238 | |
| 239 | let mut coredump_file = dump_state.file.as_ref().unwrap(); |
| 240 | let bytes: &[u8] = elf64_ehdr.as_slice(); |
| 241 | coredump_file |
| 242 | .write(bytes) |
| 243 | .map_err(GuestDebuggableError::CoredumpFile)?; |
| 244 | |
| 245 | Ok(()) |
| 246 | } |
| 247 | |
| 248 | fn write_note( |
| 249 | &mut self, |