1 //! Example that uses the lower level read API.
3 use object
::read
::archive
::ArchiveFile
;
4 use object
::read
::macho
::{FatArch, FatHeader}
;
5 use object
::Endianness
;
6 use std
::convert
::TryInto
;
8 use std
::{env, fmt, fs, io, process, str}
;
11 let arg_len
= env
::args().len();
13 eprintln
!("Usage: {} <file> ...", env
::args().next().unwrap());
17 for file_path
in env
::args().skip(1) {
20 println
!("{}:", file_path
);
23 let file
= match fs
::File
::open(&file_path
) {
26 println
!("Failed to open file '{}': {}", file_path
, err
);
30 let file
= match unsafe { memmap2::Mmap::map(&file) }
{
33 println
!("Failed to map file '{}': {}", file_path
, err
);
38 let stdout
= io
::stdout();
39 let mut printer
= Printer
::new(stdout
.lock());
40 print_object(&mut printer
, &*file
);
44 struct Printer
<W
: Write
> {
49 impl<W
: Write
> Printer
<W
> {
50 fn new(w
: W
) -> Self {
55 writeln
!(self.w
).unwrap();
58 fn print_indent(&mut self) {
60 write
!(self.w
, "{:-1$}", " ", self.indent
* 4).unwrap();
64 fn print_string(&mut self, s
: &[u8]) {
65 if let Ok(s
) = str::from_utf8(s
) {
66 write
!(self.w
, "\"{}\"", s
).unwrap();
68 write
!(self.w
, "{:X?}", s
).unwrap();
72 fn indent
<F
: FnOnce(&mut Self)>(&mut self, f
: F
) {
78 fn group
<F
: FnOnce(&mut Self)>(&mut self, name
: &str, f
: F
) {
80 writeln
!(self.w
, "{} {{", name
).unwrap();
83 writeln
!(self.w
, "}}").unwrap();
86 fn field_name(&mut self, name
: &str) {
89 write
!(self.w
, "{}: ", name
).unwrap();
93 fn field
<T
: fmt
::Display
>(&mut self, name
: &str, value
: T
) {
94 self.field_name(name
);
95 writeln
!(self.w
, "{}", value
).unwrap();
98 fn field_hex
<T
: fmt
::UpperHex
>(&mut self, name
: &str, value
: T
) {
99 self.field_name(name
);
100 writeln
!(self.w
, "0x{:X}", value
).unwrap();
103 fn field_bytes(&mut self, name
: &str, value
: &[u8]) {
104 self.field_name(name
);
105 writeln
!(self.w
, "{:X?}", value
).unwrap();
108 fn field_string
<T
: fmt
::UpperHex
>(&mut self, name
: &str, value
: T
, s
: Option
<&[u8]>) {
110 self.field_name(name
);
111 self.print_string(s
);
112 writeln
!(self.w
, " (0x{:X})", value
).unwrap();
114 self.field_hex(name
, value
);
118 fn field_inline_string(&mut self, name
: &str, s
: &[u8]) {
119 self.field_name(name
);
120 self.print_string(s
);
121 writeln
!(self.w
).unwrap();
124 fn field_enum
<T
: Eq
+ fmt
::UpperHex
>(&mut self, name
: &str, value
: T
, flags
: &[Flag
<T
>]) {
126 if value
== flag
.value
{
127 self.field_name(name
);
128 writeln
!(self.w
, "{} (0x{:X})", flag
.name
, value
).unwrap();
132 self.field_hex(name
, value
);
135 fn field_enums
<T
: Eq
+ fmt
::UpperHex
>(&mut self, name
: &str, value
: T
, enums
: &[&[Flag
<T
>]]) {
138 if value
== flag
.value
{
139 self.field_name(name
);
140 writeln
!(self.w
, "{} (0x{:X})", flag
.name
, value
).unwrap();
145 self.field_hex(name
, value
);
148 fn flags
<T
: Into
<u64>, U
: Copy
+ Into
<u64>>(&mut self, value
: T
, mask
: U
, flags
: &[Flag
<U
>]) {
149 let value
= value
.into();
150 let mask
= mask
.into();
154 if value
& mask
== flag
.value
.into() {
156 writeln
!(p
.w
, "{} (0x{:X})", flag
.name
, flag
.value
.into()).unwrap();
161 writeln
!(p
.w
, "<unknown> (0x{:X})", value
& mask
).unwrap();
164 if value
& flag
.value
.into() == flag
.value
.into() {
166 writeln
!(p
.w
, "{} (0x{:X})", flag
.name
, flag
.value
.into()).unwrap();
169 // TODO: display unknown flags (need to display all flags at once for this)
181 ($
($name
:ident
),+ $
(,)?
) => ( [ $
(Flag { value: $name, name: stringify!($name), }
),+ ] )
184 fn print_object(p
: &mut Printer
<impl Write
>, data
: &[u8]) {
185 let kind
= match object
::FileKind
::parse(data
) {
188 println
!("Failed to parse file: {}", err
);
193 object
::FileKind
::Archive
=> print_archive(p
, data
),
194 object
::FileKind
::Coff
=> pe
::print_coff(p
, data
),
195 object
::FileKind
::DyldCache
=> macho
::print_dyld_cache(p
, data
),
196 object
::FileKind
::Elf32
=> elf
::print_elf32(p
, data
),
197 object
::FileKind
::Elf64
=> elf
::print_elf64(p
, data
),
198 object
::FileKind
::MachO32
=> macho
::print_macho32(p
, data
, 0),
199 object
::FileKind
::MachO64
=> macho
::print_macho64(p
, data
, 0),
200 object
::FileKind
::MachOFat32
=> macho
::print_macho_fat32(p
, data
),
201 object
::FileKind
::MachOFat64
=> macho
::print_macho_fat64(p
, data
),
202 object
::FileKind
::Pe32
=> pe
::print_pe32(p
, data
),
203 object
::FileKind
::Pe64
=> pe
::print_pe64(p
, data
),
209 fn print_object_at(p
: &mut Printer
<impl Write
>, data
: &[u8], offset
: u64) {
210 let kind
= match object
::FileKind
::parse_at(data
, offset
) {
213 println
!("Failed to parse file: {}", err
);
218 object
::FileKind
::MachO32
=> macho
::print_macho32(p
, data
, offset
),
219 object
::FileKind
::MachO64
=> macho
::print_macho64(p
, data
, offset
),
225 fn print_archive(p
: &mut Printer
<impl Write
>, data
: &[u8]) {
226 if let Ok(archive
) = ArchiveFile
::parse(data
) {
227 p
.field("Format", format
!("Archive ({:?})", archive
.kind()));
228 for member
in archive
.members() {
229 if let Ok(member
) = member
{
231 p
.field("Member", String
::from_utf8_lossy(member
.name()));
232 if let Ok(data
) = member
.data(data
) {
233 print_object(p
, data
);
243 use object
::read
::elf
::*;
245 pub(super) fn print_elf32(p
: &mut Printer
<impl Write
>, data
: &[u8]) {
246 if let Ok(elf
) = FileHeader32
::<Endianness
>::parse(data
) {
247 println
!("Format: ELF 32-bit");
248 print_elf(p
, elf
, data
);
252 pub(super) fn print_elf64(p
: &mut Printer
<impl Write
>, data
: &[u8]) {
253 if let Ok(elf
) = FileHeader64
::<Endianness
>::parse(data
) {
254 println
!("Format: ELF 64-bit");
255 print_elf(p
, elf
, data
);
259 fn print_elf
<Elf
: FileHeader
<Endian
= Endianness
>>(
260 p
: &mut Printer
<impl Write
>,
264 if let Ok(endian
) = elf
.endian() {
265 print_file_header(p
, endian
, elf
);
266 if let Ok(segments
) = elf
.program_headers(endian
, data
) {
267 print_program_headers(p
, endian
, data
, elf
, segments
);
269 if let Ok(sections
) = elf
.sections(endian
, data
) {
270 print_section_headers(p
, endian
, data
, elf
, §ions
);
275 fn print_file_header
<Elf
: FileHeader
>(
276 p
: &mut Printer
<impl Write
>,
280 p
.group("FileHeader", |p
| {
281 p
.group("Ident", |p
| print_ident(p
, elf
.e_ident()));
282 p
.field_enum("Type", elf
.e_type(endian
), &FLAGS_ET
);
283 p
.field_enum("Machine", elf
.e_machine(endian
), &FLAGS_EM
);
284 let version
= elf
.e_version(endian
);
286 p
.field_enum("Version", version
as u8, &FLAGS_EV
);
288 p
.field_hex("Version", version
);
290 p
.field_enum("Type", elf
.e_type(endian
), &FLAGS_ET
);
291 p
.field_hex("Entry", elf
.e_entry(endian
).into());
292 p
.field_hex("ProgramHeaderOffset", elf
.e_phoff(endian
).into());
293 p
.field_hex("SectionHeaderOffset", elf
.e_shoff(endian
).into());
294 let flags
= elf
.e_flags(endian
);
295 p
.field_hex("Flags", flags
);
296 match elf
.e_machine(endian
) {
297 EM_SPARC
=> p
.flags(flags
, 0, &FLAGS_EF_SPARC
),
298 EM_SPARCV9
=> p
.flags(flags
, 0, &FLAGS_EF_SPARCV9
),
300 p
.flags(flags
, 0, &FLAGS_EF_MIPS
);
301 p
.flags(flags
, EF_MIPS_ARCH
, &FLAGS_EF_MIPS_ARCH
);
304 p
.flags(flags
, 0, &FLAGS_EF_PARISC
);
305 p
.flags(flags
, EF_PARISC_ARCH
, &FLAGS_EF_PARISC_ARCH
);
307 EM_ALPHA
=> p
.flags(flags
, 0, &FLAGS_EF_ALPHA
),
308 EM_PPC
=> p
.flags(flags
, 0, &FLAGS_EF_PPC
),
309 EM_PPC64
=> p
.flags(flags
, 0, &FLAGS_EF_PPC64
),
311 p
.flags(flags
, 0, &FLAGS_EF_ARM
);
312 p
.flags(flags
, EF_ARM_EABIMASK
, &FLAGS_EF_ARM_EABI
);
314 EM_CSKY
=> p
.flags(flags
, EF_CSKY_ABIMASK
, &FLAGS_EF_CSKY_ABI
),
315 EM_IA_64
=> p
.flags(flags
, 0, &FLAGS_EF_IA_64
),
316 EM_SH
=> p
.flags(flags
, EF_SH_MACH_MASK
, &FLAGS_EF_SH_MACH
),
317 EM_S390
=> p
.flags(flags
, 0, &FLAGS_EF_S390
),
319 p
.flags(flags
, 0, &FLAGS_EF_RISCV
);
320 p
.flags(flags
, EF_RISCV_FLOAT_ABI
, &FLAGS_EF_RISCV_FLOAT_ABI
);
324 p
.field_hex("HeaderSize", elf
.e_ehsize(endian
));
325 p
.field_hex("ProgramHeaderEntrySize", elf
.e_phentsize(endian
));
326 p
.field("ProgramHeaderCount", elf
.e_phnum(endian
));
327 p
.field_hex("SectionHeaderEntrySize", elf
.e_shentsize(endian
));
328 p
.field("SectionHeaderCount", elf
.e_shnum(endian
));
329 p
.field("SectionHeaderStringTableIndex", elf
.e_shstrndx(endian
));
333 fn print_ident(p
: &mut Printer
<impl Write
>, ident
: &Ident
) {
334 p
.field("Magic", format
!("{:X?}", ident
.magic
));
335 p
.field_enum("Class", ident
.class
, &FLAGS_EI_CLASS
);
336 p
.field_enum("Data", ident
.data
, &FLAGS_EI_DATA
);
337 p
.field_enum("Version", ident
.version
, &FLAGS_EV
);
338 p
.field_enum("OsAbi", ident
.os_abi
, &FLAGS_EI_OSABI
);
339 p
.field_hex("AbiVersion", ident
.abi_version
);
340 p
.field("Unused", format
!("{:X?}", ident
.padding
));
343 fn print_program_headers
<Elf
: FileHeader
>(
344 p
: &mut Printer
<impl Write
>,
348 segments
: &[Elf
::ProgramHeader
],
350 for segment
in segments
{
351 p
.group("ProgramHeader", |p
| {
352 let proc
= match elf
.e_machine(endian
) {
353 EM_MIPS
=> FLAGS_PT_MIPS
,
354 EM_PARISC
=> FLAGS_PT_PARISC
,
355 EM_ARM
=> FLAGS_PT_ARM
,
356 EM_IA_64
=> FLAGS_PT_IA_64
,
359 let os
= match elf
.e_ident().os_abi
{
360 ELFOSABI_HPUX
=> FLAGS_PT_HP
,
363 p
.field_enums("Type", segment
.p_type(endian
), &[FLAGS_PT
, proc
, os
]);
365 p
.field_hex("Offset", segment
.p_offset(endian
).into());
366 p
.field_hex("VirtualAddress", segment
.p_vaddr(endian
).into());
367 p
.field_hex("PhysicalAddress", segment
.p_paddr(endian
).into());
368 p
.field_hex("FileSize", segment
.p_filesz(endian
).into());
369 p
.field_hex("MemorySize", segment
.p_memsz(endian
).into());
371 let flags
= segment
.p_flags(endian
);
372 p
.field_hex("Flags", flags
);
373 p
.flags(flags
, 0, FLAGS_PF
);
374 match elf
.e_ident().os_abi
{
375 ELFOSABI_HPUX
=> p
.flags(flags
, 0, FLAGS_PF_HP
),
378 match elf
.e_machine(endian
) {
379 EM_MIPS
=> p
.flags(flags
, 0, FLAGS_PF_MIPS
),
380 EM_PARISC
=> p
.flags(flags
, 0, FLAGS_PF_PARISC
),
381 EM_ARM
=> p
.flags(flags
, 0, FLAGS_PF_ARM
),
382 EM_IA_64
=> p
.flags(flags
, 0, FLAGS_PF_IA_64
),
386 p
.field_hex("Align", segment
.p_align(endian
).into());
388 match segment
.p_type(endian
) {
389 PT_NOTE
=> print_segment_notes(p
, endian
, data
, elf
, segment
),
390 PT_DYNAMIC
=> print_segment_dynamic(p
, endian
, data
, elf
, segments
, segment
),
405 fn print_segment_notes
<Elf
: FileHeader
>(
406 p
: &mut Printer
<impl Write
>,
410 segment
: &Elf
::ProgramHeader
,
412 if let Ok(Some(notes
)) = segment
.notes(endian
, data
) {
413 print_notes(p
, endian
, notes
);
417 fn print_segment_dynamic
<Elf
: FileHeader
>(
418 p
: &mut Printer
<impl Write
>,
422 segments
: &[Elf
::ProgramHeader
],
423 segment
: &Elf
::ProgramHeader
,
425 if let Ok(Some(dynamic
)) = segment
.dynamic(endian
, data
) {
426 // TODO: add a helper API for this and the other mandatory tags?
430 let tag
= d
.d_tag(endian
).into();
431 if tag
== DT_STRTAB
.into() {
432 strtab
= d
.d_val(endian
).into();
433 } else if tag
== DT_STRSZ
.into() {
434 strsz
= d
.d_val(endian
).into();
437 let mut dynstr
= object
::StringTable
::default();
439 if let Ok(Some(data
)) = s
.data_range(endian
, data
, strtab
, strsz
) {
440 dynstr
= object
::StringTable
::new(data
, 0, data
.len() as u64);
445 let proc
= match elf
.e_machine(endian
) {
446 EM_SPARC
=> FLAGS_DT_SPARC
,
447 EM_MIPS
=> FLAGS_DT_MIPS
,
448 EM_ALPHA
=> FLAGS_DT_ALPHA
,
449 EM_PPC
=> FLAGS_DT_PPC
,
450 EM_PPC64
=> FLAGS_DT_PPC64
,
451 EM_IA_64
=> FLAGS_DT_IA_64
,
452 EM_ALTERA_NIOS2
=> FLAGS_DT_NIOS2
,
456 let tag
= d
.d_tag(endian
).into();
457 let val
= d
.d_val(endian
).into();
458 p
.group("Dynamic", |p
| {
459 if let Ok(tag
) = tag
.try_into() {
460 p
.field_enums("Tag", tag
, &[FLAGS_DT
, proc
]);
461 if tag
== DT_NEEDED
{
465 val
.try_into().ok().and_then(|val
| dynstr
.get(val
).ok()),
468 p
.field_hex("Value", val
);
470 p
.flags(val
, 0, FLAGS_DF
);
471 } else if tag
== DT_FLAGS_1
{
472 p
.flags(val
, 0, FLAGS_DF_1
);
476 p
.field_hex("Tag", tag
);
477 p
.field_hex("Value", val
);
480 if tag
== DT_NULL
.into() {
487 fn print_section_headers
<Elf
: FileHeader
>(
488 p
: &mut Printer
<impl Write
>,
492 sections
: &SectionTable
<Elf
>,
494 for (index
, section
) in sections
.iter().enumerate() {
495 p
.group("SectionHeader", |p
| {
496 p
.field("Index", index
);
499 section
.sh_name(endian
),
500 sections
.section_name(endian
, section
).ok(),
503 let proc
= match elf
.e_machine(endian
) {
504 EM_MIPS
=> FLAGS_SHT_MIPS
,
505 EM_PARISC
=> FLAGS_SHT_PARISC
,
506 EM_ALPHA
=> FLAGS_SHT_ALPHA
,
507 EM_ARM
=> FLAGS_SHT_ARM
,
508 EM_CSKY
=> FLAGS_SHT_CSKY
,
509 EM_IA_64
=> FLAGS_SHT_IA_64
,
510 EM_X86_64
=> FLAGS_SHT_X86_64
,
513 p
.field_enums("Type", section
.sh_type(endian
), &[FLAGS_SHT
, proc
]);
515 let flags
= section
.sh_flags(endian
).into();
516 p
.field_hex("Flags", flags
);
517 p
.flags(flags
, 0, FLAGS_SHF
);
518 match elf
.e_machine(endian
) {
519 EM_MIPS
=> p
.flags(flags
, 0, FLAGS_SHF_MIPS
),
520 EM_PARISC
=> p
.flags(flags
, 0, FLAGS_SHF_PARISC
),
521 EM_ALPHA
=> p
.flags(flags
, 0, FLAGS_SHF_ALPHA
),
522 EM_ARM
=> p
.flags(flags
, 0, FLAGS_SHF_ARM
),
523 EM_IA_64
=> p
.flags(flags
, 0, FLAGS_SHF_IA_64
),
527 p
.field_hex("Address", section
.sh_addr(endian
).into());
528 p
.field_hex("Offset", section
.sh_offset(endian
).into());
529 p
.field_hex("Size", section
.sh_size(endian
).into());
530 p
.field("Link", section
.sh_link(endian
));
531 p
.field("Info", section
.sh_info(endian
));
532 p
.field_hex("AddressAlign", section
.sh_addralign(endian
).into());
533 p
.field_hex("EntrySize", section
.sh_entsize(endian
).into());
535 match section
.sh_type(endian
) {
536 SHT_SYMTAB
| SHT_DYNSYM
=> {
537 print_section_symbols(p
, endian
, data
, elf
, sections
, index
, section
)
539 SHT_REL
=> print_section_rel(p
, endian
, data
, elf
, sections
, section
),
540 SHT_RELA
=> print_section_rela(p
, endian
, data
, elf
, sections
, section
),
541 SHT_NOTE
=> print_section_notes(p
, endian
, data
, elf
, section
),
542 SHT_GROUP
=> print_section_group(p
, endian
, data
, elf
, sections
, section
),
543 SHT_HASH
=> print_hash(p
, endian
, data
, elf
, sections
, section
),
544 SHT_GNU_HASH
=> print_gnu_hash(p
, endian
, data
, elf
, sections
, section
),
545 SHT_GNU_VERDEF
=> print_gnu_verdef(p
, endian
, data
, elf
, sections
, section
),
546 SHT_GNU_VERNEED
=> print_gnu_verneed(p
, endian
, data
, elf
, sections
, section
),
547 SHT_GNU_VERSYM
=> print_gnu_versym(p
, endian
, data
, elf
, sections
, section
),
553 //SHT_PREINIT_ARRAY =>
560 fn print_section_symbols
<Elf
: FileHeader
>(
561 p
: &mut Printer
<impl Write
>,
565 sections
: &SectionTable
<Elf
>,
566 section_index
: usize,
567 section
: &Elf
::SectionHeader
,
569 if let Ok(Some(symbols
)) = section
.symbols(endian
, data
, sections
, section_index
) {
570 let os_stt
= match elf
.e_ident().os_abi
{
571 ELFOSABI_GNU
=> FLAGS_STT_GNU
,
572 ELFOSABI_HPUX
=> FLAGS_STT_HP
,
575 let proc_stt
= match elf
.e_machine(endian
) {
576 EM_SPARC
=> FLAGS_STT_SPARC
,
577 EM_PARISC
=> FLAGS_STT_PARISC
,
578 EM_ARM
=> FLAGS_STT_ARM
,
581 let os_stb
= match elf
.e_ident().os_abi
{
582 ELFOSABI_GNU
=> FLAGS_STB_GNU
,
585 let proc_stb
= match elf
.e_machine(endian
) {
586 EM_MIPS
=> FLAGS_STB_MIPS
,
589 let proc_shn
= match elf
.e_machine(endian
) {
590 EM_MIPS
=> FLAGS_SHN_MIPS
,
591 EM_PARISC
=> FLAGS_SHN_PARISC
,
594 for (index
, symbol
) in symbols
.iter().enumerate() {
595 p
.group("Symbol", |p
| {
596 p
.field("Index", index
);
599 symbol
.st_name(endian
),
600 symbol
.name(endian
, symbols
.strings()).ok(),
602 p
.field_hex("Value", symbol
.st_value(endian
).into());
603 p
.field_hex("Size", symbol
.st_size(endian
).into());
604 p
.field_enums("Type", symbol
.st_type(), &[FLAGS_STT
, os_stt
, proc_stt
]);
605 p
.field_enums("Bind", symbol
.st_bind(), &[FLAGS_STB
, os_stb
, proc_stb
]);
607 let other
= symbol
.st_other();
608 if other
& !0x3 == 0 {
609 p
.field_enum("Other", other
, FLAGS_STV
);
611 p
.field_hex("Other", other
);
612 p
.flags(other
, 0x3, FLAGS_STV
);
613 match elf
.e_machine(endian
) {
614 EM_MIPS
=> p
.flags(other
, 0, FLAGS_STO_MIPS
),
615 EM_ALPHA
=> p
.flags(other
, 0, FLAGS_STO_ALPHA
),
616 EM_PPC64
=> p
.field_hex(
618 (other
& STO_PPC64_LOCAL_MASK
) >> STO_PPC64_LOCAL_BIT
,
624 let shndx
= symbol
.st_shndx(endian
);
625 if shndx
== SHN_UNDEF
|| shndx
>= SHN_LORESERVE
{
626 p
.field_enums("SectionIndex", shndx
, &[FLAGS_SHN
, proc_shn
]);
628 p
.field("SectionIndex", shndx
);
630 if let Some(shndx
) = symbols
.shndx(index
) {
631 p
.field("ExtendedSectionIndex", shndx
);
638 fn print_section_rel
<Elf
: FileHeader
>(
639 p
: &mut Printer
<impl Write
>,
643 sections
: &SectionTable
<Elf
>,
644 section
: &Elf
::SectionHeader
,
646 if let Ok(Some(relocations
)) = section
.rel(endian
, data
) {
647 let symbols
= section
.relocation_symbols(endian
, data
, sections
).ok();
648 let proc
= rel_flag_type(endian
, elf
);
649 for relocation
in relocations
{
650 p
.group("Relocation", |p
| {
651 p
.field_hex("Offset", relocation
.r_offset(endian
).into());
652 p
.field_enum("Type", relocation
.r_type(endian
), proc
);
653 let sym
= relocation
.r_sym(endian
);
654 p
.field_string("Symbol", sym
, rel_symbol(endian
, symbols
, sym
as usize));
660 fn print_section_rela
<Elf
: FileHeader
>(
661 p
: &mut Printer
<impl Write
>,
665 sections
: &SectionTable
<Elf
>,
666 section
: &Elf
::SectionHeader
,
668 if let Ok(Some(relocations
)) = section
.rela(endian
, data
) {
669 let symbols
= section
.relocation_symbols(endian
, data
, sections
).ok();
670 let proc
= rel_flag_type(endian
, elf
);
671 for relocation
in relocations
{
672 p
.group("Relocation", |p
| {
673 p
.field_hex("Offset", relocation
.r_offset(endian
).into());
676 relocation
.r_type(endian
, elf
.is_mips64el(endian
)),
679 let sym
= relocation
.r_sym(endian
, elf
.is_mips64el(endian
));
680 p
.field_string("Symbol", sym
, rel_symbol(endian
, symbols
, sym
as usize));
681 let addend
= relocation
.r_addend(endian
).into() as u64;
683 p
.field_hex("Addend", addend
);
690 fn rel_symbol
<'data
, Elf
: FileHeader
>(
692 symbols
: Option
<SymbolTable
<'data
, Elf
>>,
694 ) -> Option
<&'data
[u8]> {
695 let symbols
= symbols?
;
696 let symbol
= symbols
.symbol(sym
as usize).ok()?
;
697 symbol
.name(endian
, symbols
.strings()).ok()
700 fn rel_flag_type
<Elf
: FileHeader
>(endian
: Elf
::Endian
, elf
: &Elf
) -> &'
static [Flag
<u32>] {
701 match elf
.e_machine(endian
) {
702 EM_68K
=> FLAGS_R_68K
,
703 EM_386
=> FLAGS_R_386
,
704 EM_SPARC
=> FLAGS_R_SPARC
,
705 EM_MIPS
=> FLAGS_R_MIPS
,
706 EM_PARISC
=> FLAGS_R_PARISC
,
707 EM_ALPHA
=> FLAGS_R_ALPHA
,
708 EM_PPC
=> FLAGS_R_PPC
,
709 EM_PPC64
=> FLAGS_R_PPC64
,
710 EM_AARCH64
=> FLAGS_R_AARCH64
,
711 EM_ARM
=> FLAGS_R_ARM
,
712 EM_CSKY
=> FLAGS_R_CKCORE
,
713 EM_IA_64
=> FLAGS_R_IA64
,
715 EM_S390
=> FLAGS_R_390
,
716 EM_CRIS
=> FLAGS_R_CRIS
,
717 EM_X86_64
=> FLAGS_R_X86_64
,
718 EM_MN10300
=> FLAGS_R_MN10300
,
719 EM_M32R
=> FLAGS_R_M32R
,
720 EM_MICROBLAZE
=> FLAGS_R_MICROBLAZE
,
721 EM_ALTERA_NIOS2
=> FLAGS_R_NIOS2
,
722 EM_TILEPRO
=> FLAGS_R_TILEPRO
,
723 EM_TILEGX
=> FLAGS_R_TILEGX
,
724 EM_RISCV
=> FLAGS_R_RISCV
,
725 EM_BPF
=> FLAGS_R_BPF
,
726 EM_METAG
=> FLAGS_R_METAG
,
727 EM_NDS32
=> FLAGS_R_NDS32
,
732 fn print_section_notes
<Elf
: FileHeader
>(
733 p
: &mut Printer
<impl Write
>,
737 section
: &Elf
::SectionHeader
,
739 if let Ok(Some(notes
)) = section
.notes(endian
, data
) {
740 print_notes(p
, endian
, notes
);
744 fn print_section_group
<Elf
: FileHeader
>(
745 p
: &mut Printer
<impl Write
>,
749 sections
: &SectionTable
<Elf
>,
750 section
: &Elf
::SectionHeader
,
752 if let Ok(Some((flag
, members
))) = section
.group(endian
, data
) {
753 p
.field_enum("GroupFlag", flag
, FLAGS_GRP
);
754 p
.group("GroupSections", |p
| {
755 for member
in members
{
756 let index
= member
.get(endian
);
758 if let Ok(section
) = sections
.section(index
as usize) {
759 if let Ok(name
) = sections
.section_name(endian
, section
) {
760 p
.print_string(name
);
761 writeln
!(p
.w
, " ({})", index
).unwrap();
763 writeln
!(p
.w
, "{}", index
).unwrap();
766 writeln
!(p
.w
, "{}", index
).unwrap();
773 fn print_notes
<Elf
: FileHeader
>(
774 p
: &mut Printer
<impl Write
>,
776 mut notes
: NoteIterator
<Elf
>,
778 while let Ok(Some(note
)) = notes
.next() {
779 p
.group("Note", |p
| {
780 let name
= note
.name();
781 p
.field_string("Name", note
.n_namesz(endian
), Some(name
));
782 let flags
= if name
== ELF_NOTE_CORE
|| name
== ELF_NOTE_LINUX
{
784 } else if name
== ELF_NOTE_SOLARIS
{
786 } else if name
== ELF_NOTE_GNU
{
792 p
.field_enum("Type", note
.n_type(endian
), flags
);
793 // TODO: interpret desc
794 p
.field_bytes("Desc", note
.desc());
799 fn print_hash
<Elf
: FileHeader
>(
800 p
: &mut Printer
<impl Write
>,
804 _sections
: &SectionTable
<Elf
>,
805 section
: &Elf
::SectionHeader
,
807 if let Ok(Some(hash
)) = section
.hash_header(endian
, data
) {
808 p
.group("Hash", |p
| {
809 p
.field("BucketCount", hash
.bucket_count
.get(endian
));
810 p
.field("ChainCount", hash
.chain_count
.get(endian
));
813 /* TODO: add this in a test somewhere
814 if let Ok(Some(hash_table)) = section.hash(endian, data) {
815 if let Ok(symbols) = _sections.symbols(endian, data, SHT_DYNSYM) {
816 for symbol in symbols.symbols() {
817 let name = symbols.symbol_name(endian, symbol).unwrap();
818 if !symbol.is_definition(endian) {
821 let hash = hash(name);
822 let hash_symbol = hash_table.find(endian, name, hash, &symbols).unwrap();
823 let hash_name = symbols.symbol_name(endian, hash_symbol).unwrap();
824 assert_eq!(name, hash_name);
831 fn print_gnu_hash
<Elf
: FileHeader
>(
832 p
: &mut Printer
<impl Write
>,
836 _sections
: &SectionTable
<Elf
>,
837 section
: &Elf
::SectionHeader
,
839 if let Ok(Some(hash
)) = section
.gnu_hash_header(endian
, data
) {
840 p
.group("GnuHash", |p
| {
841 p
.field("BucketCount", hash
.bucket_count
.get(endian
));
842 p
.field("SymbolBase", hash
.symbol_base
.get(endian
));
843 p
.field("BloomCount", hash
.bloom_count
.get(endian
));
844 p
.field("BloomShift", hash
.bloom_shift
.get(endian
));
847 /* TODO: add this in a test somewhere
848 if let Ok(Some(hash_table)) = section.gnu_hash(endian, data) {
849 if let Ok(symbols) = _sections.symbols(endian, data, SHT_DYNSYM) {
850 for symbol in &symbols.symbols()[hash_table.symbol_base() as usize..] {
851 let name = symbols.symbol_name(endian, symbol).unwrap();
852 let hash = gnu_hash(name);
853 let hash_symbol = hash_table.find(endian, name, hash, &symbols).unwrap();
854 let hash_name = symbols.symbol_name(endian, hash_symbol).unwrap();
855 assert_eq!(name, hash_name);
862 fn print_gnu_verdef
<Elf
: FileHeader
>(
863 p
: &mut Printer
<impl Write
>,
867 _sections
: &SectionTable
<Elf
>,
868 section
: &Elf
::SectionHeader
,
870 if let Ok(Some(mut verdefs
)) = section
.gnu_verdef(endian
, data
) {
871 while let Ok(Some((verdef
, mut verdauxs
))) = verdefs
.next() {
872 p
.group("VersionDefinition", |p
| {
874 p
.field("Version", verdef
.vd_version
.get(endian
));
875 p
.field_hex("Flags", verdef
.vd_flags
.get(endian
));
876 p
.flags(verdef
.vd_flags
.get(endian
), 0, FLAGS_VER_FLG
);
877 p
.field("Index", verdef
.vd_ndx
.get(endian
) & !VER_NDX_HIDDEN
);
878 p
.flags(verdef
.vd_ndx
.get(endian
), 0, FLAGS_VER_NDX
);
879 p
.field("AuxCount", verdef
.vd_cnt
.get(endian
));
880 p
.field_hex("Hash", verdef
.vd_hash
.get(endian
));
881 p
.field("AuxOffset", verdef
.vd_aux
.get(endian
));
882 p
.field("NextOffset", verdef
.vd_next
.get(endian
));
883 while let Ok(Some(verdaux
)) = verdauxs
.next() {
885 p
.field_hex("Name", verdaux
.vda_name
.get(endian
));
886 p
.field("NextOffset", verdaux
.vda_next
.get(endian
));
894 fn print_gnu_verneed
<Elf
: FileHeader
>(
895 p
: &mut Printer
<impl Write
>,
899 _sections
: &SectionTable
<Elf
>,
900 section
: &Elf
::SectionHeader
,
902 if let Ok(Some(mut verneeds
)) = section
.gnu_verneed(endian
, data
) {
903 while let Ok(Some((verneed
, mut vernauxs
))) = verneeds
.next() {
904 p
.group("VersionNeed", |p
| {
906 p
.field("Version", verneed
.vn_version
.get(endian
));
907 p
.field("AuxCount", verneed
.vn_cnt
.get(endian
));
908 p
.field_hex("Filename", verneed
.vn_file
.get(endian
));
909 p
.field("AuxOffset", verneed
.vn_aux
.get(endian
));
910 p
.field("NextOffset", verneed
.vn_next
.get(endian
));
911 while let Ok(Some(vernaux
)) = vernauxs
.next() {
913 p
.field_hex("Hash", vernaux
.vna_hash
.get(endian
));
914 p
.field_hex("Flags", vernaux
.vna_flags
.get(endian
));
915 p
.flags(vernaux
.vna_flags
.get(endian
), 0, FLAGS_VER_FLG
);
916 p
.field("Index", vernaux
.vna_other
.get(endian
) & !VER_NDX_HIDDEN
);
917 p
.flags(vernaux
.vna_other
.get(endian
), 0, FLAGS_VER_NDX
);
918 p
.field_hex("Name", vernaux
.vna_name
.get(endian
));
919 p
.field("NextOffset", vernaux
.vna_next
.get(endian
));
927 fn print_gnu_versym
<Elf
: FileHeader
>(
928 p
: &mut Printer
<impl Write
>,
932 _sections
: &SectionTable
<Elf
>,
933 section
: &Elf
::SectionHeader
,
935 if let Ok(Some(syms
)) = section
.gnu_versym(endian
, data
) {
937 p
.group("VersionSymbol", |p
| {
938 p
.field("Version", sym
.0.get(endian
) & !VER_NDX_HIDDEN
);
939 p
.flags(sym
.0.get(endian
), 0, FLAGS_VER_NDX
);
940 // TODO: version name
946 static FLAGS_EI_CLASS
: &[Flag
<u8>] = &flags
!(ELFCLASSNONE
, ELFCLASS32
, ELFCLASS64
);
947 static FLAGS_EI_DATA
: &[Flag
<u8>] = &flags
!(ELFDATANONE
, ELFDATA2LSB
, ELFDATA2MSB
);
948 static FLAGS_EV
: &[Flag
<u8>] = &flags
!(EV_NONE
, EV_CURRENT
);
949 static FLAGS_EI_OSABI
: &[Flag
<u8>] = &flags
!(
965 static FLAGS_ET
: &[Flag
<u16>] = &flags
!(ET_NONE
, ET_REL
, ET_EXEC
, ET_DYN
, ET_CORE
);
966 static FLAGS_EM
: &[Flag
<u16>] = &flags
!(
1148 static FLAGS_EF_SPARC
: &[Flag
<u32>] = &flags
!(
1156 static FLAGS_EF_SPARCV9
: &[Flag
<u32>] = &flags
!(
1162 static FLAGS_EF_MIPS
: &[Flag
<u32>] = &flags
!(
1167 EF_MIPS_64BIT_WHIRL
,
1173 static FLAGS_EF_MIPS_ARCH
: &[Flag
<u32>] = &flags
!(
1184 static FLAGS_EF_PARISC
: &[Flag
<u32>] = &flags
!(
1192 static FLAGS_EF_PARISC_ARCH
: &[Flag
<u32>] =
1193 &flags
!(EFA_PARISC_1_0
, EFA_PARISC_1_1
, EFA_PARISC_2_0
);
1194 static FLAGS_EF_ALPHA
: &[Flag
<u32>] = &flags
!(EF_ALPHA_32BIT
, EF_ALPHA_CANRELAX
);
1195 static FLAGS_EF_PPC
: &[Flag
<u32>] =
1196 &flags
!(EF_PPC_EMB
, EF_PPC_RELOCATABLE
, EF_PPC_RELOCATABLE_LIB
);
1197 static FLAGS_EF_PPC64
: &[Flag
<u32>] = &flags
!(EF_PPC64_ABI
);
1198 static FLAGS_EF_ARM
: &[Flag
<u32>] = &flags
!(
1210 EF_ARM_MAVERICK_FLOAT
,
1214 static FLAGS_EF_ARM_EABI
: &[Flag
<u32>] = &flags
!(
1215 EF_ARM_EABI_UNKNOWN
,
1222 static FLAGS_EF_CSKY_ABI
: &[Flag
<u32>] = &flags
!(EF_CSKY_ABIV1
, EF_CSKY_ABIV2
);
1223 static FLAGS_EF_IA_64
: &[Flag
<u32>] = &flags
!(EF_IA_64_ABI64
);
1224 static FLAGS_EF_SH_MACH
: &[Flag
<u32>] = &flags
!(
1247 static FLAGS_EF_S390
: &[Flag
<u32>] = &flags
!(EF_S390_HIGH_GPRS
);
1248 static FLAGS_EF_RISCV
: &[Flag
<u32>] = &flags
!(EF_RISCV_RVC
);
1249 static FLAGS_EF_RISCV_FLOAT_ABI
: &[Flag
<u32>] = &flags
!(
1250 EF_RISCV_FLOAT_ABI_SOFT
,
1251 EF_RISCV_FLOAT_ABI_SINGLE
,
1252 EF_RISCV_FLOAT_ABI_DOUBLE
,
1253 EF_RISCV_FLOAT_ABI_QUAD
,
1255 static FLAGS_PT
: &[Flag
<u32>] = &flags
!(
1269 static FLAGS_PT_HP
: &[Flag
<u32>] = &flags
!(
1276 PT_HP_CORE_LOADABLE
,
1286 static FLAGS_PT_MIPS
: &[Flag
<u32>] = &flags
!(
1292 static FLAGS_PT_PARISC
: &[Flag
<u32>] = &flags
!(PT_PARISC_ARCHEXT
, PT_PARISC_UNWIND
);
1293 static FLAGS_PT_ARM
: &[Flag
<u32>] = &flags
!(PT_ARM_EXIDX
);
1294 static FLAGS_PT_IA_64
: &[Flag
<u32>] = &flags
!(PT_IA_64_ARCHEXT
, PT_IA_64_UNWIND
);
1295 static FLAGS_PF
: &[Flag
<u32>] = &flags
!(PF_X
, PF_W
, PF_R
);
1296 static FLAGS_PF_HP
: &[Flag
<u32>] = &flags
!(
1305 static FLAGS_PF_MIPS
: &[Flag
<u32>] = &flags
!(PF_MIPS_LOCAL
);
1306 static FLAGS_PF_PARISC
: &[Flag
<u32>] = &flags
!(PF_PARISC_SBP
);
1307 static FLAGS_PF_ARM
: &[Flag
<u32>] = &flags
!(PF_ARM_SB
, PF_ARM_PI
, PF_ARM_ABS
);
1308 static FLAGS_PF_IA_64
: &[Flag
<u32>] = &flags
!(PF_IA_64_NORECOV
);
1309 static FLAGS_SHT
: &[Flag
<u32>] = &flags
!(
1338 static FLAGS_SHT_MIPS
: &[Flag
<u32>] = &flags
!(
1365 SHT_MIPS_DELTACLASS
,
1368 SHT_MIPS_SYMBOL_LIB
,
1373 SHT_MIPS_XLATE_DEBUG
,
1377 SHT_MIPS_PDR_EXCEPTION
,
1379 static FLAGS_SHT_PARISC
: &[Flag
<u32>] =
1380 &flags
!(SHT_PARISC_EXT
, SHT_PARISC_UNWIND
, SHT_PARISC_DOC
);
1381 static FLAGS_SHT_ALPHA
: &[Flag
<u32>] = &flags
!(SHT_ALPHA_DEBUG
, SHT_ALPHA_REGINFO
);
1382 static FLAGS_SHT_ARM
: &[Flag
<u32>] =
1383 &flags
!(SHT_ARM_EXIDX
, SHT_ARM_PREEMPTMAP
, SHT_ARM_ATTRIBUTES
);
1384 static FLAGS_SHT_CSKY
: &[Flag
<u32>] = &flags
!(SHT_CSKY_ATTRIBUTES
);
1385 static FLAGS_SHT_IA_64
: &[Flag
<u32>] = &flags
!(SHT_IA_64_EXT
, SHT_IA_64_UNWIND
);
1386 static FLAGS_SHT_X86_64
: &[Flag
<u32>] = &flags
!(SHT_X86_64_UNWIND
);
1387 static FLAGS_SHF
: &[Flag
<u32>] = &flags
!(
1395 SHF_OS_NONCONFORMING
,
1400 static FLAGS_SHF_MIPS
: &[Flag
<u32>] = &flags
!(
1410 static FLAGS_SHF_PARISC
: &[Flag
<u32>] =
1411 &flags
!(SHF_PARISC_SHORT
, SHF_PARISC_HUGE
, SHF_PARISC_SBP
);
1412 static FLAGS_SHF_ALPHA
: &[Flag
<u32>] = &flags
!(SHF_ALPHA_GPREL
);
1413 static FLAGS_SHF_ARM
: &[Flag
<u32>] = &flags
!(SHF_ARM_ENTRYSECT
, SHF_ARM_COMDEF
);
1414 static FLAGS_SHF_IA_64
: &[Flag
<u32>] = &flags
!(SHF_IA_64_SHORT
, SHF_IA_64_NORECOV
);
1415 static FLAGS_STT
: &[Flag
<u8>] = &flags
!(
1424 static FLAGS_STT_GNU
: &[Flag
<u8>] = &flags
!(STT_GNU_IFUNC
);
1425 static FLAGS_STT_HP
: &[Flag
<u8>] = &flags
!(STT_HP_OPAQUE
, STT_HP_STUB
);
1426 static FLAGS_STT_SPARC
: &[Flag
<u8>] = &flags
!(STT_SPARC_REGISTER
);
1427 static FLAGS_STT_PARISC
: &[Flag
<u8>] = &flags
!(STT_PARISC_MILLICODE
);
1428 static FLAGS_STT_ARM
: &[Flag
<u8>] = &flags
!(STT_ARM_TFUNC
, STT_ARM_16BIT
);
1429 static FLAGS_STB
: &[Flag
<u8>] = &flags
!(STB_LOCAL
, STB_GLOBAL
, STB_WEAK
);
1430 static FLAGS_STB_GNU
: &[Flag
<u8>] = &flags
!(STB_GNU_UNIQUE
);
1431 static FLAGS_STB_MIPS
: &[Flag
<u8>] = &flags
!(STB_MIPS_SPLIT_COMMON
);
1432 static FLAGS_STV
: &[Flag
<u8>] = &flags
!(STV_DEFAULT
, STV_INTERNAL
, STV_HIDDEN
, STV_PROTECTED
);
1433 static FLAGS_STO_MIPS
: &[Flag
<u8>] = &flags
!(STO_MIPS_PLT
);
1434 static FLAGS_STO_ALPHA
: &[Flag
<u8>] = &flags
!(STO_ALPHA_NOPV
, STO_ALPHA_STD_GPLOAD
);
1435 static FLAGS_SHN
: &[Flag
<u16>] = &flags
!(SHN_UNDEF
, SHN_ABS
, SHN_COMMON
, SHN_XINDEX
);
1436 static FLAGS_SHN_MIPS
: &[Flag
<u16>] = &flags
!(
1441 SHN_MIPS_SUNDEFINED
,
1443 static FLAGS_SHN_PARISC
: &[Flag
<u16>] = &flags
!(SHN_PARISC_ANSI_COMMON
, SHN_PARISC_HUGE_COMMON
);
1444 static FLAGS_R_68K
: &[Flag
<u32>] = &flags
!(
1487 static FLAGS_R_386
: &[Flag
<u32>] = &flags
!(
1526 R_386_TLS_DESC_CALL
,
1531 static FLAGS_R_SPARC
: &[Flag
<u32>] = &flags
!(
1588 R_SPARC_TLS_GD_HI22
,
1589 R_SPARC_TLS_GD_LO10
,
1591 R_SPARC_TLS_GD_CALL
,
1592 R_SPARC_TLS_LDM_HI22
,
1593 R_SPARC_TLS_LDM_LO10
,
1594 R_SPARC_TLS_LDM_ADD
,
1595 R_SPARC_TLS_LDM_CALL
,
1596 R_SPARC_TLS_LDO_HIX22
,
1597 R_SPARC_TLS_LDO_LOX10
,
1598 R_SPARC_TLS_LDO_ADD
,
1599 R_SPARC_TLS_IE_HI22
,
1600 R_SPARC_TLS_IE_LO10
,
1604 R_SPARC_TLS_LE_HIX22
,
1605 R_SPARC_TLS_LE_LOX10
,
1606 R_SPARC_TLS_DTPMOD32
,
1607 R_SPARC_TLS_DTPMOD64
,
1608 R_SPARC_TLS_DTPOFF32
,
1609 R_SPARC_TLS_DTPOFF64
,
1610 R_SPARC_TLS_TPOFF32
,
1611 R_SPARC_TLS_TPOFF64
,
1612 R_SPARC_GOTDATA_HIX22
,
1613 R_SPARC_GOTDATA_LOX10
,
1614 R_SPARC_GOTDATA_OP_HIX22
,
1615 R_SPARC_GOTDATA_OP_LOX10
,
1623 R_SPARC_GNU_VTINHERIT
,
1624 R_SPARC_GNU_VTENTRY
,
1627 static FLAGS_R_MIPS
: &[Flag
<u32>] = &flags
!(
1659 R_MIPS_ADD_IMMEDIATE
,
1663 R_MIPS_TLS_DTPMOD32
,
1664 R_MIPS_TLS_DTPREL32
,
1665 R_MIPS_TLS_DTPMOD64
,
1666 R_MIPS_TLS_DTPREL64
,
1669 R_MIPS_TLS_DTPREL_HI16
,
1670 R_MIPS_TLS_DTPREL_LO16
,
1671 R_MIPS_TLS_GOTTPREL
,
1674 R_MIPS_TLS_TPREL_HI16
,
1675 R_MIPS_TLS_TPREL_LO16
,
1680 static FLAGS_R_PARISC
: &[Flag
<u32>] = &flags
!(
1703 R_PARISC_LTOFF_FPTR32
,
1704 R_PARISC_LTOFF_FPTR21L
,
1705 R_PARISC_LTOFF_FPTR14R
,
1737 R_PARISC_PLTOFF14WR
,
1738 R_PARISC_PLTOFF14DR
,
1740 R_PARISC_PLTOFF16WF
,
1741 R_PARISC_PLTOFF16DF
,
1742 R_PARISC_LTOFF_FPTR64
,
1743 R_PARISC_LTOFF_FPTR14WR
,
1744 R_PARISC_LTOFF_FPTR14DR
,
1745 R_PARISC_LTOFF_FPTR16F
,
1746 R_PARISC_LTOFF_FPTR16WF
,
1747 R_PARISC_LTOFF_FPTR16DF
,
1754 R_PARISC_LTOFF_TP21L
,
1755 R_PARISC_LTOFF_TP14R
,
1756 R_PARISC_LTOFF_TP14F
,
1763 R_PARISC_LTOFF_TP64
,
1764 R_PARISC_LTOFF_TP14WR
,
1765 R_PARISC_LTOFF_TP14DR
,
1766 R_PARISC_LTOFF_TP16F
,
1767 R_PARISC_LTOFF_TP16WF
,
1768 R_PARISC_LTOFF_TP16DF
,
1769 R_PARISC_GNU_VTENTRY
,
1770 R_PARISC_GNU_VTINHERIT
,
1773 R_PARISC_TLS_GDCALL
,
1774 R_PARISC_TLS_LDM21L
,
1775 R_PARISC_TLS_LDM14R
,
1776 R_PARISC_TLS_LDMCALL
,
1777 R_PARISC_TLS_LDO21L
,
1778 R_PARISC_TLS_LDO14R
,
1779 R_PARISC_TLS_DTPMOD32
,
1780 R_PARISC_TLS_DTPMOD64
,
1781 R_PARISC_TLS_DTPOFF32
,
1782 R_PARISC_TLS_DTPOFF64
,
1787 R_PARISC_TLS_TPREL32
,
1788 R_PARISC_TLS_TPREL64
,
1790 static FLAGS_R_ALPHA
: &[Flag
<u32>] = &flags
!(
1825 static FLAGS_R_PPC
: &[Flag
<u32>] = &flags
!(
1834 R_PPC_ADDR14_BRTAKEN
,
1835 R_PPC_ADDR14_BRNTAKEN
,
1838 R_PPC_REL14_BRTAKEN
,
1839 R_PPC_REL14_BRNTAKEN
,
1876 R_PPC_GOT_TLSGD16_LO
,
1877 R_PPC_GOT_TLSGD16_HI
,
1878 R_PPC_GOT_TLSGD16_HA
,
1880 R_PPC_GOT_TLSLD16_LO
,
1881 R_PPC_GOT_TLSLD16_HI
,
1882 R_PPC_GOT_TLSLD16_HA
,
1884 R_PPC_GOT_TPREL16_LO
,
1885 R_PPC_GOT_TPREL16_HI
,
1886 R_PPC_GOT_TPREL16_HA
,
1888 R_PPC_GOT_DTPREL16_LO
,
1889 R_PPC_GOT_DTPREL16_HI
,
1890 R_PPC_GOT_DTPREL16_HA
,
1895 R_PPC_EMB_NADDR16_LO
,
1896 R_PPC_EMB_NADDR16_HI
,
1897 R_PPC_EMB_NADDR16_HA
,
1909 R_PPC_DIAB_SDA21_LO
,
1910 R_PPC_DIAB_SDA21_HI
,
1911 R_PPC_DIAB_SDA21_HA
,
1912 R_PPC_DIAB_RELSDA_LO
,
1913 R_PPC_DIAB_RELSDA_HI
,
1914 R_PPC_DIAB_RELSDA_HA
,
1922 static FLAGS_R_PPC64
: &[Flag
<u32>] = &flags
!(
1931 R_PPC64_ADDR14_BRTAKEN
,
1932 R_PPC64_ADDR14_BRNTAKEN
,
1935 R_PPC64_REL14_BRTAKEN
,
1936 R_PPC64_REL14_BRNTAKEN
,
1959 R_PPC64_ADDR16_HIGHER
,
1960 R_PPC64_ADDR16_HIGHERA
,
1961 R_PPC64_ADDR16_HIGHEST
,
1962 R_PPC64_ADDR16_HIGHESTA
,
1973 R_PPC64_PLTGOT16_LO
,
1974 R_PPC64_PLTGOT16_HI
,
1975 R_PPC64_PLTGOT16_HA
,
1977 R_PPC64_ADDR16_LO_DS
,
1979 R_PPC64_GOT16_LO_DS
,
1980 R_PPC64_PLT16_LO_DS
,
1982 R_PPC64_SECTOFF_LO_DS
,
1984 R_PPC64_TOC16_LO_DS
,
1985 R_PPC64_PLTGOT16_DS
,
1986 R_PPC64_PLTGOT16_LO_DS
,
1995 R_PPC64_DTPREL16_LO
,
1996 R_PPC64_DTPREL16_HI
,
1997 R_PPC64_DTPREL16_HA
,
1999 R_PPC64_GOT_TLSGD16
,
2000 R_PPC64_GOT_TLSGD16_LO
,
2001 R_PPC64_GOT_TLSGD16_HI
,
2002 R_PPC64_GOT_TLSGD16_HA
,
2003 R_PPC64_GOT_TLSLD16
,
2004 R_PPC64_GOT_TLSLD16_LO
,
2005 R_PPC64_GOT_TLSLD16_HI
,
2006 R_PPC64_GOT_TLSLD16_HA
,
2007 R_PPC64_GOT_TPREL16_DS
,
2008 R_PPC64_GOT_TPREL16_LO_DS
,
2009 R_PPC64_GOT_TPREL16_HI
,
2010 R_PPC64_GOT_TPREL16_HA
,
2011 R_PPC64_GOT_DTPREL16_DS
,
2012 R_PPC64_GOT_DTPREL16_LO_DS
,
2013 R_PPC64_GOT_DTPREL16_HI
,
2014 R_PPC64_GOT_DTPREL16_HA
,
2016 R_PPC64_TPREL16_LO_DS
,
2017 R_PPC64_TPREL16_HIGHER
,
2018 R_PPC64_TPREL16_HIGHERA
,
2019 R_PPC64_TPREL16_HIGHEST
,
2020 R_PPC64_TPREL16_HIGHESTA
,
2021 R_PPC64_DTPREL16_DS
,
2022 R_PPC64_DTPREL16_LO_DS
,
2023 R_PPC64_DTPREL16_HIGHER
,
2024 R_PPC64_DTPREL16_HIGHERA
,
2025 R_PPC64_DTPREL16_HIGHEST
,
2026 R_PPC64_DTPREL16_HIGHESTA
,
2030 R_PPC64_ADDR16_HIGH
,
2031 R_PPC64_ADDR16_HIGHA
,
2032 R_PPC64_TPREL16_HIGH
,
2033 R_PPC64_TPREL16_HIGHA
,
2034 R_PPC64_DTPREL16_HIGH
,
2035 R_PPC64_DTPREL16_HIGHA
,
2043 static FLAGS_R_AARCH64
: &[Flag
<u32>] = &flags
!(
2045 R_AARCH64_P32_ABS32
,
2047 R_AARCH64_P32_GLOB_DAT
,
2048 R_AARCH64_P32_JUMP_SLOT
,
2049 R_AARCH64_P32_RELATIVE
,
2050 R_AARCH64_P32_TLS_DTPMOD
,
2051 R_AARCH64_P32_TLS_DTPREL
,
2052 R_AARCH64_P32_TLS_TPREL
,
2053 R_AARCH64_P32_TLSDESC
,
2054 R_AARCH64_P32_IRELATIVE
,
2061 R_AARCH64_MOVW_UABS_G0
,
2062 R_AARCH64_MOVW_UABS_G0_NC
,
2063 R_AARCH64_MOVW_UABS_G1
,
2064 R_AARCH64_MOVW_UABS_G1_NC
,
2065 R_AARCH64_MOVW_UABS_G2
,
2066 R_AARCH64_MOVW_UABS_G2_NC
,
2067 R_AARCH64_MOVW_UABS_G3
,
2068 R_AARCH64_MOVW_SABS_G0
,
2069 R_AARCH64_MOVW_SABS_G1
,
2070 R_AARCH64_MOVW_SABS_G2
,
2071 R_AARCH64_LD_PREL_LO19
,
2072 R_AARCH64_ADR_PREL_LO21
,
2073 R_AARCH64_ADR_PREL_PG_HI21
,
2074 R_AARCH64_ADR_PREL_PG_HI21_NC
,
2075 R_AARCH64_ADD_ABS_LO12_NC
,
2076 R_AARCH64_LDST8_ABS_LO12_NC
,
2081 R_AARCH64_LDST16_ABS_LO12_NC
,
2082 R_AARCH64_LDST32_ABS_LO12_NC
,
2083 R_AARCH64_LDST64_ABS_LO12_NC
,
2084 R_AARCH64_MOVW_PREL_G0
,
2085 R_AARCH64_MOVW_PREL_G0_NC
,
2086 R_AARCH64_MOVW_PREL_G1
,
2087 R_AARCH64_MOVW_PREL_G1_NC
,
2088 R_AARCH64_MOVW_PREL_G2
,
2089 R_AARCH64_MOVW_PREL_G2_NC
,
2090 R_AARCH64_MOVW_PREL_G3
,
2091 R_AARCH64_LDST128_ABS_LO12_NC
,
2092 R_AARCH64_MOVW_GOTOFF_G0
,
2093 R_AARCH64_MOVW_GOTOFF_G0_NC
,
2094 R_AARCH64_MOVW_GOTOFF_G1
,
2095 R_AARCH64_MOVW_GOTOFF_G1_NC
,
2096 R_AARCH64_MOVW_GOTOFF_G2
,
2097 R_AARCH64_MOVW_GOTOFF_G2_NC
,
2098 R_AARCH64_MOVW_GOTOFF_G3
,
2101 R_AARCH64_GOT_LD_PREL19
,
2102 R_AARCH64_LD64_GOTOFF_LO15
,
2103 R_AARCH64_ADR_GOT_PAGE
,
2104 R_AARCH64_LD64_GOT_LO12_NC
,
2105 R_AARCH64_LD64_GOTPAGE_LO15
,
2106 R_AARCH64_TLSGD_ADR_PREL21
,
2107 R_AARCH64_TLSGD_ADR_PAGE21
,
2108 R_AARCH64_TLSGD_ADD_LO12_NC
,
2109 R_AARCH64_TLSGD_MOVW_G1
,
2110 R_AARCH64_TLSGD_MOVW_G0_NC
,
2111 R_AARCH64_TLSLD_ADR_PREL21
,
2112 R_AARCH64_TLSLD_ADR_PAGE21
,
2113 R_AARCH64_TLSLD_ADD_LO12_NC
,
2114 R_AARCH64_TLSLD_MOVW_G1
,
2115 R_AARCH64_TLSLD_MOVW_G0_NC
,
2116 R_AARCH64_TLSLD_LD_PREL19
,
2117 R_AARCH64_TLSLD_MOVW_DTPREL_G2
,
2118 R_AARCH64_TLSLD_MOVW_DTPREL_G1
,
2119 R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC
,
2120 R_AARCH64_TLSLD_MOVW_DTPREL_G0
,
2121 R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC
,
2122 R_AARCH64_TLSLD_ADD_DTPREL_HI12
,
2123 R_AARCH64_TLSLD_ADD_DTPREL_LO12
,
2124 R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC
,
2125 R_AARCH64_TLSLD_LDST8_DTPREL_LO12
,
2126 R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC
,
2127 R_AARCH64_TLSLD_LDST16_DTPREL_LO12
,
2128 R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC
,
2129 R_AARCH64_TLSLD_LDST32_DTPREL_LO12
,
2130 R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC
,
2131 R_AARCH64_TLSLD_LDST64_DTPREL_LO12
,
2132 R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC
,
2133 R_AARCH64_TLSIE_MOVW_GOTTPREL_G1
,
2134 R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC
,
2135 R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21
,
2136 R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC
,
2137 R_AARCH64_TLSIE_LD_GOTTPREL_PREL19
,
2138 R_AARCH64_TLSLE_MOVW_TPREL_G2
,
2139 R_AARCH64_TLSLE_MOVW_TPREL_G1
,
2140 R_AARCH64_TLSLE_MOVW_TPREL_G1_NC
,
2141 R_AARCH64_TLSLE_MOVW_TPREL_G0
,
2142 R_AARCH64_TLSLE_MOVW_TPREL_G0_NC
,
2143 R_AARCH64_TLSLE_ADD_TPREL_HI12
,
2144 R_AARCH64_TLSLE_ADD_TPREL_LO12
,
2145 R_AARCH64_TLSLE_ADD_TPREL_LO12_NC
,
2146 R_AARCH64_TLSLE_LDST8_TPREL_LO12
,
2147 R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC
,
2148 R_AARCH64_TLSLE_LDST16_TPREL_LO12
,
2149 R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC
,
2150 R_AARCH64_TLSLE_LDST32_TPREL_LO12
,
2151 R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC
,
2152 R_AARCH64_TLSLE_LDST64_TPREL_LO12
,
2153 R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC
,
2154 R_AARCH64_TLSDESC_LD_PREL19
,
2155 R_AARCH64_TLSDESC_ADR_PREL21
,
2156 R_AARCH64_TLSDESC_ADR_PAGE21
,
2157 R_AARCH64_TLSDESC_LD64_LO12
,
2158 R_AARCH64_TLSDESC_ADD_LO12
,
2159 R_AARCH64_TLSDESC_OFF_G1
,
2160 R_AARCH64_TLSDESC_OFF_G0_NC
,
2161 R_AARCH64_TLSDESC_LDR
,
2162 R_AARCH64_TLSDESC_ADD
,
2163 R_AARCH64_TLSDESC_CALL
,
2164 R_AARCH64_TLSLE_LDST128_TPREL_LO12
,
2165 R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC
,
2166 R_AARCH64_TLSLD_LDST128_DTPREL_LO12
,
2167 R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC
,
2170 R_AARCH64_JUMP_SLOT
,
2172 R_AARCH64_TLS_DTPMOD
,
2173 R_AARCH64_TLS_DTPREL
,
2174 R_AARCH64_TLS_TPREL
,
2176 R_AARCH64_IRELATIVE
,
2178 static FLAGS_R_ARM
: &[Flag
<u32>] = &flags
!(
2212 R_ARM_ALU_PCREL_7_0
,
2213 R_ARM_ALU_PCREL_15_8
,
2214 R_ARM_ALU_PCREL_23_15
,
2215 R_ARM_LDR_SBREL_11_0
,
2216 R_ARM_ALU_SBREL_19_12
,
2217 R_ARM_ALU_SBREL_27_20
,
2227 R_ARM_THM_MOVW_ABS_NC
,
2229 R_ARM_THM_MOVW_PREL_NC
,
2230 R_ARM_THM_MOVT_PREL
,
2233 R_ARM_THM_ALU_PREL_11_0
,
2267 R_ARM_THM_MOVW_BREL_NC
,
2268 R_ARM_THM_MOVT_BREL
,
2269 R_ARM_THM_MOVW_BREL
,
2281 R_ARM_GNU_VTINHERIT
,
2293 R_ARM_THM_TLS_DESCSEQ
,
2294 R_ARM_THM_TLS_DESCSEQ16
,
2295 R_ARM_THM_TLS_DESCSEQ32
,
2296 R_ARM_THM_GOT_BREL12
,
2306 static FLAGS_R_CKCORE
: &[Flag
<u32>] = &flags
!(
2309 R_CKCORE_PCRELIMM8BY4
,
2310 R_CKCORE_PCRELIMM11BY2
,
2312 R_CKCORE_PCRELJSR_IMM11BY2
,
2323 R_CKCORE_PCREL_IMM26BY2
,
2324 R_CKCORE_PCREL_IMM16BY2
,
2325 R_CKCORE_PCREL_IMM16BY4
,
2326 R_CKCORE_PCREL_IMM10BY2
,
2327 R_CKCORE_PCREL_IMM10BY4
,
2330 R_CKCORE_GOTPC_HI16
,
2331 R_CKCORE_GOTPC_LO16
,
2332 R_CKCORE_GOTOFF_HI16
,
2333 R_CKCORE_GOTOFF_LO16
,
2340 R_CKCORE_ADDRGOT_HI16
,
2341 R_CKCORE_ADDRGOT_LO16
,
2342 R_CKCORE_ADDRPLT_HI16
,
2343 R_CKCORE_ADDRPLT_LO16
,
2344 R_CKCORE_PCREL_JSR_IMM26BY2
,
2345 R_CKCORE_TOFFSET_LO16
,
2346 R_CKCORE_DOFFSET_LO16
,
2347 R_CKCORE_PCREL_IMM18BY2
,
2348 R_CKCORE_DOFFSET_IMM18
,
2349 R_CKCORE_DOFFSET_IMM18BY2
,
2350 R_CKCORE_DOFFSET_IMM18BY4
,
2351 R_CKCORE_GOT_IMM18BY4
,
2352 R_CKCORE_PLT_IMM18BY4
,
2353 R_CKCORE_PCREL_IMM7BY4
,
2359 R_CKCORE_TLS_DTPMOD32
,
2360 R_CKCORE_TLS_DTPOFF32
,
2361 R_CKCORE_TLS_TPOFF32
,
2363 static FLAGS_R_IA64
: &[Flag
<u32>] = &flags
!(
2397 R_IA64_LTOFF_FPTR22
,
2398 R_IA64_LTOFF_FPTR64I
,
2399 R_IA64_LTOFF_FPTR32MSB
,
2400 R_IA64_LTOFF_FPTR32LSB
,
2401 R_IA64_LTOFF_FPTR64MSB
,
2402 R_IA64_LTOFF_FPTR64LSB
,
2433 R_IA64_LTOFF_TPREL22
,
2436 R_IA64_LTOFF_DTPMOD22
,
2444 R_IA64_LTOFF_DTPREL22
,
2446 static FLAGS_R_SH
: &[Flag
<u32>] = &flags
!(
2485 static FLAGS_R_390
: &[Flag
<u32>] = &flags
!(
2549 static FLAGS_R_CRIS
: &[Flag
<u32>] = &flags
!(
2557 R_CRIS_GNU_VTINHERIT
,
2568 R_CRIS_32_PLT_GOTREL
,
2569 R_CRIS_32_PLT_PCREL
,
2571 static FLAGS_R_X86_64
: &[Flag
<u32>] = &flags
!(
2600 R_X86_64_GOTPCREL64
,
2606 R_X86_64_GOTPC32_TLSDESC
,
2607 R_X86_64_TLSDESC_CALL
,
2610 R_X86_64_RELATIVE64
,
2612 R_X86_64_REX_GOTPCRELX
,
2614 static FLAGS_R_MN10300
: &[Flag
<u32>] = &flags
!(
2622 R_MN10300_GNU_VTINHERIT
,
2623 R_MN10300_GNU_VTENTRY
,
2642 R_MN10300_TLS_GOTIE
,
2645 R_MN10300_TLS_DTPMOD
,
2646 R_MN10300_TLS_DTPOFF
,
2647 R_MN10300_TLS_TPOFF
,
2651 static FLAGS_R_M32R
: &[Flag
<u32>] = &flags
!(
2663 R_M32R_GNU_VTINHERIT
,
2668 R_M32R_10_PCREL_RELA
,
2669 R_M32R_18_PCREL_RELA
,
2670 R_M32R_26_PCREL_RELA
,
2671 R_M32R_HI16_ULO_RELA
,
2672 R_M32R_HI16_SLO_RELA
,
2675 R_M32R_RELA_GNU_VTINHERIT
,
2676 R_M32R_RELA_GNU_VTENTRY
,
2686 R_M32R_GOT16_HI_ULO
,
2687 R_M32R_GOT16_HI_SLO
,
2689 R_M32R_GOTPC_HI_ULO
,
2690 R_M32R_GOTPC_HI_SLO
,
2692 R_M32R_GOTOFF_HI_ULO
,
2693 R_M32R_GOTOFF_HI_SLO
,
2697 static FLAGS_R_MICROBLAZE
: &[Flag
<u32>] = &flags
!(
2700 R_MICROBLAZE_32_PCREL
,
2701 R_MICROBLAZE_64_PCREL
,
2702 R_MICROBLAZE_32_PCREL_LO
,
2707 R_MICROBLAZE_64_NONE
,
2708 R_MICROBLAZE_32_SYM_OP_SYM
,
2709 R_MICROBLAZE_GNU_VTINHERIT
,
2710 R_MICROBLAZE_GNU_VTENTRY
,
2711 R_MICROBLAZE_GOTPC_64
,
2712 R_MICROBLAZE_GOT_64
,
2713 R_MICROBLAZE_PLT_64
,
2715 R_MICROBLAZE_JUMP_SLOT
,
2716 R_MICROBLAZE_GLOB_DAT
,
2717 R_MICROBLAZE_GOTOFF_64
,
2718 R_MICROBLAZE_GOTOFF_32
,
2723 R_MICROBLAZE_TLSDTPMOD32
,
2724 R_MICROBLAZE_TLSDTPREL32
,
2725 R_MICROBLAZE_TLSDTPREL64
,
2726 R_MICROBLAZE_TLSGOTTPREL32
,
2727 R_MICROBLAZE_TLSTPREL32
,
2729 static FLAGS_R_NIOS2
: &[Flag
<u32>] = &flags
!(
2742 R_NIOS2_BFD_RELOC_32
,
2743 R_NIOS2_BFD_RELOC_16
,
2744 R_NIOS2_BFD_RELOC_8
,
2746 R_NIOS2_GNU_VTINHERIT
,
2747 R_NIOS2_GNU_VTENTRY
,
2771 R_NIOS2_CALL26_NOAT
,
2777 static FLAGS_R_TILEPRO
: &[Flag
<u32>] = &flags
!(
2793 R_TILEPRO_JOFFLONG_X1
,
2794 R_TILEPRO_JOFFLONG_X1_PLT
,
2799 R_TILEPRO_MT_IMM15_X1
,
2800 R_TILEPRO_MF_IMM15_X1
,
2803 R_TILEPRO_IMM16_X0_LO
,
2804 R_TILEPRO_IMM16_X1_LO
,
2805 R_TILEPRO_IMM16_X0_HI
,
2806 R_TILEPRO_IMM16_X1_HI
,
2807 R_TILEPRO_IMM16_X0_HA
,
2808 R_TILEPRO_IMM16_X1_HA
,
2809 R_TILEPRO_IMM16_X0_PCREL
,
2810 R_TILEPRO_IMM16_X1_PCREL
,
2811 R_TILEPRO_IMM16_X0_LO_PCREL
,
2812 R_TILEPRO_IMM16_X1_LO_PCREL
,
2813 R_TILEPRO_IMM16_X0_HI_PCREL
,
2814 R_TILEPRO_IMM16_X1_HI_PCREL
,
2815 R_TILEPRO_IMM16_X0_HA_PCREL
,
2816 R_TILEPRO_IMM16_X1_HA_PCREL
,
2817 R_TILEPRO_IMM16_X0_GOT
,
2818 R_TILEPRO_IMM16_X1_GOT
,
2819 R_TILEPRO_IMM16_X0_GOT_LO
,
2820 R_TILEPRO_IMM16_X1_GOT_LO
,
2821 R_TILEPRO_IMM16_X0_GOT_HI
,
2822 R_TILEPRO_IMM16_X1_GOT_HI
,
2823 R_TILEPRO_IMM16_X0_GOT_HA
,
2824 R_TILEPRO_IMM16_X1_GOT_HA
,
2825 R_TILEPRO_MMSTART_X0
,
2827 R_TILEPRO_MMSTART_X1
,
2833 R_TILEPRO_DEST_IMM8_X1
,
2834 R_TILEPRO_TLS_GD_CALL
,
2835 R_TILEPRO_IMM8_X0_TLS_GD_ADD
,
2836 R_TILEPRO_IMM8_X1_TLS_GD_ADD
,
2837 R_TILEPRO_IMM8_Y0_TLS_GD_ADD
,
2838 R_TILEPRO_IMM8_Y1_TLS_GD_ADD
,
2839 R_TILEPRO_TLS_IE_LOAD
,
2840 R_TILEPRO_IMM16_X0_TLS_GD
,
2841 R_TILEPRO_IMM16_X1_TLS_GD
,
2842 R_TILEPRO_IMM16_X0_TLS_GD_LO
,
2843 R_TILEPRO_IMM16_X1_TLS_GD_LO
,
2844 R_TILEPRO_IMM16_X0_TLS_GD_HI
,
2845 R_TILEPRO_IMM16_X1_TLS_GD_HI
,
2846 R_TILEPRO_IMM16_X0_TLS_GD_HA
,
2847 R_TILEPRO_IMM16_X1_TLS_GD_HA
,
2848 R_TILEPRO_IMM16_X0_TLS_IE
,
2849 R_TILEPRO_IMM16_X1_TLS_IE
,
2850 R_TILEPRO_IMM16_X0_TLS_IE_LO
,
2851 R_TILEPRO_IMM16_X1_TLS_IE_LO
,
2852 R_TILEPRO_IMM16_X0_TLS_IE_HI
,
2853 R_TILEPRO_IMM16_X1_TLS_IE_HI
,
2854 R_TILEPRO_IMM16_X0_TLS_IE_HA
,
2855 R_TILEPRO_IMM16_X1_TLS_IE_HA
,
2856 R_TILEPRO_TLS_DTPMOD32
,
2857 R_TILEPRO_TLS_DTPOFF32
,
2858 R_TILEPRO_TLS_TPOFF32
,
2859 R_TILEPRO_IMM16_X0_TLS_LE
,
2860 R_TILEPRO_IMM16_X1_TLS_LE
,
2861 R_TILEPRO_IMM16_X0_TLS_LE_LO
,
2862 R_TILEPRO_IMM16_X1_TLS_LE_LO
,
2863 R_TILEPRO_IMM16_X0_TLS_LE_HI
,
2864 R_TILEPRO_IMM16_X1_TLS_LE_HI
,
2865 R_TILEPRO_IMM16_X0_TLS_LE_HA
,
2866 R_TILEPRO_IMM16_X1_TLS_LE_HA
,
2867 R_TILEPRO_GNU_VTINHERIT
,
2868 R_TILEPRO_GNU_VTENTRY
,
2870 static FLAGS_R_TILEGX
: &[Flag
<u32>] = &flags
!(
2892 R_TILEGX_JUMPOFF_X1
,
2893 R_TILEGX_JUMPOFF_X1_PLT
,
2898 R_TILEGX_DEST_IMM8_X1
,
2899 R_TILEGX_MT_IMM14_X1
,
2900 R_TILEGX_MF_IMM14_X1
,
2901 R_TILEGX_MMSTART_X0
,
2907 R_TILEGX_IMM16_X0_HW0
,
2908 R_TILEGX_IMM16_X1_HW0
,
2909 R_TILEGX_IMM16_X0_HW1
,
2910 R_TILEGX_IMM16_X1_HW1
,
2911 R_TILEGX_IMM16_X0_HW2
,
2912 R_TILEGX_IMM16_X1_HW2
,
2913 R_TILEGX_IMM16_X0_HW3
,
2914 R_TILEGX_IMM16_X1_HW3
,
2915 R_TILEGX_IMM16_X0_HW0_LAST
,
2916 R_TILEGX_IMM16_X1_HW0_LAST
,
2917 R_TILEGX_IMM16_X0_HW1_LAST
,
2918 R_TILEGX_IMM16_X1_HW1_LAST
,
2919 R_TILEGX_IMM16_X0_HW2_LAST
,
2920 R_TILEGX_IMM16_X1_HW2_LAST
,
2921 R_TILEGX_IMM16_X0_HW0_PCREL
,
2922 R_TILEGX_IMM16_X1_HW0_PCREL
,
2923 R_TILEGX_IMM16_X0_HW1_PCREL
,
2924 R_TILEGX_IMM16_X1_HW1_PCREL
,
2925 R_TILEGX_IMM16_X0_HW2_PCREL
,
2926 R_TILEGX_IMM16_X1_HW2_PCREL
,
2927 R_TILEGX_IMM16_X0_HW3_PCREL
,
2928 R_TILEGX_IMM16_X1_HW3_PCREL
,
2929 R_TILEGX_IMM16_X0_HW0_LAST_PCREL
,
2930 R_TILEGX_IMM16_X1_HW0_LAST_PCREL
,
2931 R_TILEGX_IMM16_X0_HW1_LAST_PCREL
,
2932 R_TILEGX_IMM16_X1_HW1_LAST_PCREL
,
2933 R_TILEGX_IMM16_X0_HW2_LAST_PCREL
,
2934 R_TILEGX_IMM16_X1_HW2_LAST_PCREL
,
2935 R_TILEGX_IMM16_X0_HW0_GOT
,
2936 R_TILEGX_IMM16_X1_HW0_GOT
,
2937 R_TILEGX_IMM16_X0_HW0_PLT_PCREL
,
2938 R_TILEGX_IMM16_X1_HW0_PLT_PCREL
,
2939 R_TILEGX_IMM16_X0_HW1_PLT_PCREL
,
2940 R_TILEGX_IMM16_X1_HW1_PLT_PCREL
,
2941 R_TILEGX_IMM16_X0_HW2_PLT_PCREL
,
2942 R_TILEGX_IMM16_X1_HW2_PLT_PCREL
,
2943 R_TILEGX_IMM16_X0_HW0_LAST_GOT
,
2944 R_TILEGX_IMM16_X1_HW0_LAST_GOT
,
2945 R_TILEGX_IMM16_X0_HW1_LAST_GOT
,
2946 R_TILEGX_IMM16_X1_HW1_LAST_GOT
,
2947 R_TILEGX_IMM16_X0_HW3_PLT_PCREL
,
2948 R_TILEGX_IMM16_X1_HW3_PLT_PCREL
,
2949 R_TILEGX_IMM16_X0_HW0_TLS_GD
,
2950 R_TILEGX_IMM16_X1_HW0_TLS_GD
,
2951 R_TILEGX_IMM16_X0_HW0_TLS_LE
,
2952 R_TILEGX_IMM16_X1_HW0_TLS_LE
,
2953 R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
,
2954 R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
,
2955 R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
,
2956 R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE
,
2957 R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD
,
2958 R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD
,
2959 R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD
,
2960 R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD
,
2961 R_TILEGX_IMM16_X0_HW0_TLS_IE
,
2962 R_TILEGX_IMM16_X1_HW0_TLS_IE
,
2963 R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL
,
2964 R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL
,
2965 R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL
,
2966 R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL
,
2967 R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL
,
2968 R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL
,
2969 R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE
,
2970 R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE
,
2971 R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE
,
2972 R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE
,
2973 R_TILEGX_TLS_DTPMOD64
,
2974 R_TILEGX_TLS_DTPOFF64
,
2975 R_TILEGX_TLS_TPOFF64
,
2976 R_TILEGX_TLS_DTPMOD32
,
2977 R_TILEGX_TLS_DTPOFF32
,
2978 R_TILEGX_TLS_TPOFF32
,
2979 R_TILEGX_TLS_GD_CALL
,
2980 R_TILEGX_IMM8_X0_TLS_GD_ADD
,
2981 R_TILEGX_IMM8_X1_TLS_GD_ADD
,
2982 R_TILEGX_IMM8_Y0_TLS_GD_ADD
,
2983 R_TILEGX_IMM8_Y1_TLS_GD_ADD
,
2984 R_TILEGX_TLS_IE_LOAD
,
2985 R_TILEGX_IMM8_X0_TLS_ADD
,
2986 R_TILEGX_IMM8_X1_TLS_ADD
,
2987 R_TILEGX_IMM8_Y0_TLS_ADD
,
2988 R_TILEGX_IMM8_Y1_TLS_ADD
,
2989 R_TILEGX_GNU_VTINHERIT
,
2990 R_TILEGX_GNU_VTENTRY
,
2992 static FLAGS_R_RISCV
: &[Flag
<u32>] = &flags
!(
2999 R_RISCV_TLS_DTPMOD32
,
3000 R_RISCV_TLS_DTPMOD64
,
3001 R_RISCV_TLS_DTPREL32
,
3002 R_RISCV_TLS_DTPREL64
,
3003 R_RISCV_TLS_TPREL32
,
3004 R_RISCV_TLS_TPREL64
,
3010 R_RISCV_TLS_GOT_HI20
,
3011 R_RISCV_TLS_GD_HI20
,
3013 R_RISCV_PCREL_LO12_I
,
3014 R_RISCV_PCREL_LO12_S
,
3019 R_RISCV_TPREL_LO12_I
,
3020 R_RISCV_TPREL_LO12_S
,
3030 R_RISCV_GNU_VTINHERIT
,
3031 R_RISCV_GNU_VTENTRY
,
3048 static FLAGS_R_BPF
: &[Flag
<u32>] = &flags
!(R_BPF_NONE
, R_BPF_64_64
, R_BPF_64_32
);
3049 static FLAGS_R_METAG
: &[Flag
<u32>] = &flags
!(
3067 R_METAG_GNU_VTINHERIT
,
3068 R_METAG_GNU_VTENTRY
,
3069 R_METAG_HI16_GOTOFF
,
3070 R_METAG_LO16_GOTOFF
,
3071 R_METAG_GETSET_GOTOFF
,
3077 R_METAG_RELBRANCH_PLT
,
3086 R_METAG_TLS_LDO_HI16
,
3087 R_METAG_TLS_LDO_LO16
,
3090 R_METAG_TLS_IENONPIC
,
3091 R_METAG_TLS_IENONPIC_HI16
,
3092 R_METAG_TLS_IENONPIC_LO16
,
3097 R_METAG_TLS_LE_HI16
,
3098 R_METAG_TLS_LE_LO16
,
3100 static FLAGS_R_NDS32
: &[Flag
<u32>] = &flags
!(
3110 static FLAGS_NT_CORE
: &[Flag
<u32>] = &flags
!(
3158 NT_S390_SYSTEM_CALL
,
3175 static FLAGS_NT_SOLARIS
: &[Flag
<u32>] = &flags
!(NT_SOLARIS_PAGESIZE_HINT
);
3176 static FLAGS_NT_GNU
: &[Flag
<u32>] = &flags
!(
3180 NT_GNU_GOLD_VERSION
,
3181 NT_GNU_PROPERTY_TYPE_0
,
3183 static FLAGS_GRP
: &[Flag
<u32>] = &flags
!(GRP_COMDAT
);
3184 static FLAGS_DT
: &[Flag
<u32>] = &flags
!(
3252 static FLAGS_DT_SPARC
: &[Flag
<u32>] = &flags
!(DT_SPARC_REGISTER
);
3253 static FLAGS_DT_MIPS
: &[Flag
<u32>] = &flags
!(
3254 DT_MIPS_RLD_VERSION
,
3259 DT_MIPS_BASE_ADDRESS
,
3263 DT_MIPS_LOCAL_GOTNO
,
3271 DT_MIPS_DELTA_CLASS
,
3272 DT_MIPS_DELTA_CLASS_NO
,
3273 DT_MIPS_DELTA_INSTANCE
,
3274 DT_MIPS_DELTA_INSTANCE_NO
,
3275 DT_MIPS_DELTA_RELOC
,
3276 DT_MIPS_DELTA_RELOC_NO
,
3278 DT_MIPS_DELTA_SYM_NO
,
3279 DT_MIPS_DELTA_CLASSSYM
,
3280 DT_MIPS_DELTA_CLASSSYM_NO
,
3284 DT_MIPS_LOCALPAGE_GOTIDX
,
3285 DT_MIPS_LOCAL_GOTIDX
,
3286 DT_MIPS_HIDDEN_GOTIDX
,
3287 DT_MIPS_PROTECTED_GOTIDX
,
3290 DT_MIPS_DYNSTR_ALIGN
,
3291 DT_MIPS_INTERFACE_SIZE
,
3292 DT_MIPS_RLD_TEXT_RESOLVE_ADDR
,
3293 DT_MIPS_PERF_SUFFIX
,
3294 DT_MIPS_COMPACT_SIZE
,
3296 DT_MIPS_AUX_DYNAMIC
,
3299 DT_MIPS_RLD_MAP_REL
,
3301 static FLAGS_DT_ALPHA
: &[Flag
<u32>] = &flags
!(DT_ALPHA_PLTRO
);
3302 static FLAGS_DT_PPC
: &[Flag
<u32>] = &flags
!(DT_PPC_GOT
, DT_PPC_OPT
);
3303 static FLAGS_DT_PPC64
: &[Flag
<u32>] =
3304 &flags
!(DT_PPC64_GLINK
, DT_PPC64_OPD
, DT_PPC64_OPDSZ
, DT_PPC64_OPT
);
3305 static FLAGS_DT_IA_64
: &[Flag
<u32>] = &flags
!(DT_IA_64_PLT_RESERVE
);
3306 static FLAGS_DT_NIOS2
: &[Flag
<u32>] = &flags
!(DT_NIOS2_GP
);
3307 static FLAGS_DF
: &[Flag
<u32>] = &flags
!(
3314 static FLAGS_DF_1
: &[Flag
<u32>] = &flags
!(
3344 static FLAGS_VER_FLG
: &[Flag
<u16>] = &flags
!(VER_FLG_BASE
, VER_FLG_WEAK
);
3345 static FLAGS_VER_NDX
: &[Flag
<u16>] = &flags
!(VER_NDX_HIDDEN
);
3350 use object
::macho
::*;
3351 use object
::read
::macho
::*;
3352 use object
::BigEndian
;
3354 pub(super) fn print_dyld_cache(p
: &mut Printer
<impl Write
>, data
: &[u8]) {
3355 if let Ok(header
) = DyldCacheHeader
::<Endianness
>::parse(data
) {
3356 if let Ok((_
, endian
)) = header
.parse_magic() {
3357 print_dyld_cache_header(p
, endian
, header
);
3358 let mappings
= header
.mappings(endian
, data
).ok();
3359 if let Some(mappings
) = mappings
{
3360 print_dyld_cache_mappings(p
, endian
, mappings
);
3362 if let Ok(images
) = header
.images(endian
, data
) {
3363 print_dyld_cache_images(p
, endian
, data
, mappings
, images
);
3369 pub(super) fn print_dyld_cache_header(
3370 p
: &mut Printer
<impl Write
>,
3372 header
: &DyldCacheHeader
<Endianness
>,
3374 p
.group("DyldCacheHeader", |p
| {
3375 p
.field_bytes("Magic", &header
.magic
);
3376 p
.field_hex("MappingOffset", header
.mapping_offset
.get(endian
));
3377 p
.field("MappingCount", header
.mapping_count
.get(endian
));
3378 p
.field_hex("ImagesOffset", header
.images_offset
.get(endian
));
3379 p
.field("ImagesCount", header
.images_count
.get(endian
));
3380 p
.field_hex("DyldBaseAddress", header
.dyld_base_address
.get(endian
));
3384 pub(super) fn print_dyld_cache_mappings(
3385 p
: &mut Printer
<impl Write
>,
3387 mappings
: &[DyldCacheMappingInfo
<Endianness
>],
3389 for mapping
in mappings
{
3390 p
.group("DyldCacheMappingInfo", |p
| {
3391 p
.field_hex("Address", mapping
.address
.get(endian
));
3392 p
.field_hex("Size", mapping
.size
.get(endian
));
3393 p
.field_hex("FileOffset", mapping
.file_offset
.get(endian
));
3394 p
.field_hex("MaxProt", mapping
.max_prot
.get(endian
));
3395 p
.flags(mapping
.max_prot
.get(endian
), 0, FLAGS_VM
);
3396 p
.field_hex("InitProt", mapping
.init_prot
.get(endian
));
3397 p
.flags(mapping
.init_prot
.get(endian
), 0, FLAGS_VM
);
3402 pub(super) fn print_dyld_cache_images(
3403 p
: &mut Printer
<impl Write
>,
3406 mappings
: Option
<&[DyldCacheMappingInfo
<Endianness
>]>,
3407 images
: &[DyldCacheImageInfo
<Endianness
>],
3409 for image
in images
{
3410 p
.group("DyldCacheImageInfo", |p
| {
3411 p
.field_hex("Address", image
.address
.get(endian
));
3412 p
.field_hex("ModTime", image
.mod_time
.get(endian
));
3413 p
.field_hex("Inode", image
.inode
.get(endian
));
3416 image
.path_file_offset
.get(endian
),
3417 image
.path(endian
, data
).ok(),
3419 p
.field_hex("Pad", image
.pad
.get(endian
));
3421 if let Some(offset
) =
3422 mappings
.and_then(|mappings
| image
.file_offset(endian
, mappings
).ok())
3425 print_object_at(p
, data
, offset
);
3431 pub(super) fn print_macho_fat32(p
: &mut Printer
<impl Write
>, data
: &[u8]) {
3432 if let Ok(arches
) = FatHeader
::parse_arch32(data
) {
3433 println
!("Format: Mach-O Fat 32-bit");
3434 print_fat_header(p
, data
);
3435 for arch
in arches
{
3436 print_fat_arch(p
, arch
);
3438 for arch
in arches
{
3439 if let Ok(data
) = arch
.data(data
) {
3441 print_object(p
, data
);
3447 pub(super) fn print_macho_fat64(p
: &mut Printer
<impl Write
>, data
: &[u8]) {
3448 if let Ok(arches
) = FatHeader
::parse_arch64(data
) {
3449 println
!("Format: Mach-O Fat 64-bit");
3450 print_fat_header(p
, data
);
3451 for arch
in arches
{
3452 print_fat_arch(p
, arch
);
3454 for arch
in arches
{
3455 if let Ok(data
) = arch
.data(data
) {
3457 print_object(p
, data
);
3463 pub(super) fn print_fat_header(p
: &mut Printer
<impl Write
>, data
: &[u8]) {
3464 if let Ok(header
) = FatHeader
::parse(data
) {
3465 p
.group("FatHeader", |p
| {
3466 p
.field_hex("Magic", header
.magic
.get(BigEndian
));
3467 p
.field("NumberOfFatArch", header
.nfat_arch
.get(BigEndian
));
3472 pub(super) fn print_fat_arch
<Arch
: FatArch
>(p
: &mut Printer
<impl Write
>, arch
: &Arch
) {
3473 p
.group("FatArch", |p
| {
3474 print_cputype(p
, arch
.cputype(), arch
.cpusubtype());
3475 p
.field_hex("Offset", arch
.offset().into());
3476 p
.field_hex("Size", arch
.size().into());
3477 p
.field("Align", arch
.align());
3481 pub(super) fn print_macho32(p
: &mut Printer
<impl Write
>, data
: &[u8], offset
: u64) {
3482 if let Ok(header
) = MachHeader32
::parse(data
, offset
) {
3483 println
!("Format: Mach-O 32-bit");
3484 print_macho(p
, header
, data
, offset
);
3488 pub(super) fn print_macho64(p
: &mut Printer
<impl Write
>, data
: &[u8], offset
: u64) {
3489 if let Ok(header
) = MachHeader64
::parse(data
, offset
) {
3490 println
!("Format: Mach-O 64-bit");
3491 print_macho(p
, header
, data
, offset
);
3497 section_index
: usize,
3500 fn print_macho
<Mach
: MachHeader
<Endian
= Endianness
>>(
3501 p
: &mut Printer
<impl Write
>,
3506 if let Ok(endian
) = header
.endian() {
3507 let mut state
= MachState
::default();
3508 print_mach_header(p
, endian
, header
);
3509 if let Ok(mut commands
) = header
.load_commands(endian
, data
, offset
) {
3510 while let Ok(Some(command
)) = commands
.next() {
3511 print_load_command(p
, endian
, data
, header
, command
, &mut state
);
3517 fn print_mach_header
<Mach
: MachHeader
>(
3518 p
: &mut Printer
<impl Write
>,
3519 endian
: Mach
::Endian
,
3522 p
.group("MachHeader", |p
| {
3523 p
.field_hex("Magic", header
.magic().to_be());
3524 print_cputype(p
, header
.cputype(endian
), header
.cpusubtype(endian
));
3525 p
.field_enum("FileType", header
.filetype(endian
), FLAGS_MH_FILETYPE
);
3526 p
.field("NumberOfCmds", header
.ncmds(endian
));
3527 p
.field_hex("SizeOfCmds", header
.sizeofcmds(endian
));
3528 p
.field_enum("Flags", header
.flags(endian
), FLAGS_MH
);
3532 fn print_load_command
<Mach
: MachHeader
>(
3533 p
: &mut Printer
<impl Write
>,
3534 endian
: Mach
::Endian
,
3537 command
: LoadCommandData
<Mach
::Endian
>,
3538 state
: &mut MachState
,
3540 if let Ok(variant
) = command
.variant() {
3542 LoadCommandVariant
::Segment32(segment
, section_data
) => {
3547 header
.cputype(endian
),
3553 LoadCommandVariant
::Segment64(segment
, section_data
) => {
3558 header
.cputype(endian
),
3564 LoadCommandVariant
::Symtab(symtab
) => {
3565 print_symtab
::<Mach
, _
>(p
, endian
, data
, symtab
);
3567 LoadCommandVariant
::Thread(x
, _thread_data
) => {
3568 p
.group("ThreadCommand", |p
| {
3569 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3570 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3571 // TODO: thread_data
3574 LoadCommandVariant
::Dysymtab(x
) => {
3575 p
.group("DysymtabCommand", |p
| {
3576 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3577 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3578 // TODO: dump the tables these are all pointing to
3579 p
.field("IndexOfLocalSymbols", x
.ilocalsym
.get(endian
));
3580 p
.field("NumberOfLocalSymbols", x
.nlocalsym
.get(endian
));
3581 p
.field("IndexOfExternallyDefinedSymbols", x
.iextdefsym
.get(endian
));
3582 p
.field("NumberOfExternallyDefinedSymbols", x
.nextdefsym
.get(endian
));
3583 p
.field("IndexOfUndefinedSymbols", x
.iundefsym
.get(endian
));
3584 p
.field("NumberOfUndefinedSymbols", x
.nundefsym
.get(endian
));
3585 p
.field_hex("TocOffset", x
.tocoff
.get(endian
));
3586 p
.field("NumberOfTocEntries", x
.ntoc
.get(endian
));
3587 p
.field_hex("ModuleTableOffset", x
.modtaboff
.get(endian
));
3588 p
.field("NumberOfModuleTableEntries", x
.nmodtab
.get(endian
));
3589 p
.field_hex("ExternalRefSymbolOffset", x
.extrefsymoff
.get(endian
));
3590 p
.field("NumberOfExternalRefSymbols", x
.nextrefsyms
.get(endian
));
3591 p
.field_hex("IndirectSymbolOffset", x
.indirectsymoff
.get(endian
));
3592 p
.field("NumberOfIndirectSymbols", x
.nindirectsyms
.get(endian
));
3593 p
.field_hex("ExternalRelocationOffset", x
.extreloff
.get(endian
));
3594 p
.field("NumberOfExternalRelocations", x
.nextrel
.get(endian
));
3595 p
.field_hex("LocalRelocationOffset", x
.locreloff
.get(endian
));
3596 p
.field("NumberOfLocalRelocations", x
.nlocrel
.get(endian
));
3599 LoadCommandVariant
::Dylib(x
) | LoadCommandVariant
::IdDylib(x
) => {
3600 p
.group("DylibCommand", |p
| {
3601 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3602 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3603 p
.group("Dylib", |p
| {
3606 x
.dylib
.name
.offset
.get(endian
),
3607 command
.string(endian
, x
.dylib
.name
).ok(),
3609 p
.field("Timestamp", x
.dylib
.timestamp
.get(endian
));
3610 p
.field_hex("CurrentVersion", x
.dylib
.current_version
.get(endian
));
3612 "CompatibilityVersion",
3613 x
.dylib
.compatibility_version
.get(endian
),
3618 LoadCommandVariant
::LoadDylinker(x
)
3619 | LoadCommandVariant
::IdDylinker(x
)
3620 | LoadCommandVariant
::DyldEnvironment(x
) => {
3621 p
.group("DylinkerCommand", |p
| {
3622 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3623 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3626 x
.name
.offset
.get(endian
),
3627 command
.string(endian
, x
.name
).ok(),
3631 LoadCommandVariant
::PreboundDylib(x
) => {
3632 p
.group("PreboundDylibCommand", |p
| {
3633 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3634 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3637 x
.name
.offset
.get(endian
),
3638 command
.string(endian
, x
.name
).ok(),
3640 p
.field("NumberOfModules", x
.nmodules
.get(endian
));
3641 // TODO: display bit vector
3642 p
.field_hex("LinkedModules", x
.linked_modules
.offset
.get(endian
));
3645 LoadCommandVariant
::Routines32(x
) => {
3646 p
.group("RoutinesCommand32", |p
| {
3647 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3648 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3649 p
.field_hex("InitAddress", x
.init_address
.get(endian
));
3650 p
.field_hex("InitModule", x
.init_module
.get(endian
));
3651 p
.field_hex("Reserved1", x
.reserved1
.get(endian
));
3652 p
.field_hex("Reserved2", x
.reserved2
.get(endian
));
3653 p
.field_hex("Reserved3", x
.reserved3
.get(endian
));
3654 p
.field_hex("Reserved4", x
.reserved4
.get(endian
));
3655 p
.field_hex("Reserved5", x
.reserved5
.get(endian
));
3656 p
.field_hex("Reserved6", x
.reserved6
.get(endian
));
3659 LoadCommandVariant
::Routines64(x
) => {
3660 p
.group("RoutinesCommand64", |p
| {
3661 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3662 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3663 p
.field_hex("InitAddress", x
.init_address
.get(endian
));
3664 p
.field_hex("InitModule", x
.init_module
.get(endian
));
3665 p
.field_hex("Reserved1", x
.reserved1
.get(endian
));
3666 p
.field_hex("Reserved2", x
.reserved2
.get(endian
));
3667 p
.field_hex("Reserved3", x
.reserved3
.get(endian
));
3668 p
.field_hex("Reserved4", x
.reserved4
.get(endian
));
3669 p
.field_hex("Reserved5", x
.reserved5
.get(endian
));
3670 p
.field_hex("Reserved6", x
.reserved6
.get(endian
));
3673 LoadCommandVariant
::SubFramework(x
) => {
3674 p
.group("SubFrameworkCommand", |p
| {
3675 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3676 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3679 x
.umbrella
.offset
.get(endian
),
3680 command
.string(endian
, x
.umbrella
).ok(),
3684 LoadCommandVariant
::SubUmbrella(x
) => {
3685 p
.group("SubUmbrellaCommand", |p
| {
3686 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3687 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3690 x
.sub_umbrella
.offset
.get(endian
),
3691 command
.string(endian
, x
.sub_umbrella
).ok(),
3695 LoadCommandVariant
::SubClient(x
) => {
3696 p
.group("SubClientCommand", |p
| {
3697 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3698 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3701 x
.client
.offset
.get(endian
),
3702 command
.string(endian
, x
.client
).ok(),
3706 LoadCommandVariant
::SubLibrary(x
) => {
3707 p
.group("SubLibraryCommand", |p
| {
3708 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3709 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3712 x
.sub_library
.offset
.get(endian
),
3713 command
.string(endian
, x
.sub_library
).ok(),
3717 LoadCommandVariant
::TwolevelHints(x
) => {
3718 p
.group("TwolevelHintsCommand", |p
| {
3719 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3720 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3721 p
.field_hex("Offset", x
.offset
.get(endian
));
3722 p
.field_hex("NumberOfHints", x
.nhints
.get(endian
));
3723 // TODO: display hints
3726 LoadCommandVariant
::PrebindCksum(x
) => {
3727 p
.group("PrebindCksumCommand", |p
| {
3728 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3729 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3730 p
.field_hex("Cksum", x
.cksum
.get(endian
));
3733 LoadCommandVariant
::Uuid(x
) => {
3734 p
.group("UuidCommand", |p
| {
3735 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3736 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3737 p
.field("Uuid", format
!("{:X?}", x
.uuid
));
3740 LoadCommandVariant
::Rpath(x
) => {
3741 p
.group("RpathCommand", |p
| {
3742 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3743 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3746 x
.path
.offset
.get(endian
),
3747 command
.string(endian
, x
.path
).ok(),
3751 LoadCommandVariant
::LinkeditData(x
) => {
3752 p
.group("LinkeditDataCommand", |p
| {
3753 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3754 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3755 p
.field_hex("DataOffset", x
.dataoff
.get(endian
));
3756 p
.field_hex("DataSize", x
.datasize
.get(endian
));
3759 LoadCommandVariant
::EncryptionInfo32(x
) => {
3760 p
.group("EncryptionInfoCommand32", |p
| {
3761 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3762 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3763 p
.field_hex("CryptOffset", x
.cryptoff
.get(endian
));
3764 p
.field_hex("CryptSize", x
.cryptsize
.get(endian
));
3765 p
.field_hex("CryptId", x
.cryptid
.get(endian
));
3768 LoadCommandVariant
::EncryptionInfo64(x
) => {
3769 p
.group("EncryptionInfoCommand64", |p
| {
3770 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3771 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3772 p
.field_hex("CryptOffset", x
.cryptoff
.get(endian
));
3773 p
.field_hex("CryptSize", x
.cryptsize
.get(endian
));
3774 p
.field_hex("CryptId", x
.cryptid
.get(endian
));
3775 p
.field_hex("Pad", x
.pad
.get(endian
));
3778 LoadCommandVariant
::DyldInfo(x
) => {
3779 p
.group("DyldInfoCommand", |p
| {
3780 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3781 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3782 // TODO: dump the tables these are all pointing to
3783 p
.field_hex("RebaseOffset", x
.rebase_off
.get(endian
));
3784 p
.field_hex("RebaseSize", x
.rebase_size
.get(endian
));
3785 p
.field_hex("BindOffset", x
.bind_off
.get(endian
));
3786 p
.field_hex("BindSize", x
.bind_size
.get(endian
));
3787 p
.field_hex("WeakBindOffset", x
.weak_bind_off
.get(endian
));
3788 p
.field_hex("WeakBindSize", x
.weak_bind_size
.get(endian
));
3789 p
.field_hex("LazyBindOffset", x
.lazy_bind_off
.get(endian
));
3790 p
.field_hex("LazyBindSize", x
.lazy_bind_size
.get(endian
));
3791 p
.field_hex("ExportOffset", x
.export_off
.get(endian
));
3792 p
.field_hex("ExportSize", x
.export_size
.get(endian
));
3795 LoadCommandVariant
::VersionMin(x
) => {
3796 p
.group("VersionMinCommand", |p
| {
3797 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3798 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3799 p
.field_hex("Version", x
.version
.get(endian
));
3800 p
.field_hex("Sdk", x
.sdk
.get(endian
));
3803 LoadCommandVariant
::EntryPoint(x
) => {
3804 p
.group("EntryPointCommand", |p
| {
3805 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3806 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3807 p
.field_hex("EntryOffset", x
.entryoff
.get(endian
));
3808 p
.field_hex("StackSize", x
.stacksize
.get(endian
));
3811 LoadCommandVariant
::SourceVersion(x
) => {
3812 p
.group("SourceVersionCommand", |p
| {
3813 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3814 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3815 p
.field_hex("Version", x
.version
.get(endian
));
3818 LoadCommandVariant
::LinkerOption(x
) => {
3819 p
.group("LinkerOptionCommand", |p
| {
3820 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3821 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3822 p
.field_hex("Count", x
.count
.get(endian
));
3823 // TODO: dump strings
3826 LoadCommandVariant
::Note(x
) => {
3827 p
.group("NoteCommand", |p
| {
3828 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3829 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3831 p
.field("DataOwner", format
!("{:X?}", x
.data_owner
));
3832 p
.field_hex("Offset", x
.offset
.get(endian
));
3833 p
.field_hex("Size", x
.size
.get(endian
));
3836 LoadCommandVariant
::BuildVersion(x
) => {
3837 p
.group("BuildVersionCommand", |p
| {
3838 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3839 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3840 p
.field_enum("Platform", x
.platform
.get(endian
), FLAGS_PLATFORM
);
3841 p
.field_hex("MinOs", x
.minos
.get(endian
));
3842 p
.field_hex("Sdk", x
.sdk
.get(endian
));
3843 p
.field_hex("NumberOfTools", x
.ntools
.get(endian
));
3847 LoadCommandVariant
::FilesetEntry(x
) => {
3848 p
.group("FilesetEntryCommand", |p
| {
3849 p
.field_enum("Cmd", x
.cmd
.get(endian
), FLAGS_LC
);
3850 p
.field_hex("CmdSize", x
.cmdsize
.get(endian
));
3851 p
.field_hex("VmAddress", x
.vmaddr
.get(endian
));
3852 p
.field_hex("FileOffset", x
.fileoff
.get(endian
));
3855 x
.entry_id
.offset
.get(endian
),
3856 command
.string(endian
, x
.entry_id
).ok(),
3858 p
.field_hex("Reserved", x
.reserved
.get(endian
));
3862 p
.group("LoadCommand", |p
| {
3863 p
.field_enum("Cmd", command
.cmd(), FLAGS_LC
);
3864 p
.field_hex("CmdSize", command
.cmdsize());
3869 p
.group("LoadCommand", |p
| {
3870 p
.field_enum("Cmd", command
.cmd(), FLAGS_LC
);
3871 p
.field_hex("CmdSize", command
.cmdsize());
3876 fn print_segment
<S
: Segment
>(
3877 p
: &mut Printer
<impl Write
>,
3882 section_data
: &[u8],
3883 state
: &mut MachState
,
3885 p
.group("SegmentCommand", |p
| {
3886 p
.field_enum("Cmd", segment
.cmd(endian
), FLAGS_LC
);
3887 p
.field_hex("CmdSize", segment
.cmdsize(endian
));
3888 p
.field_inline_string("SegmentName", segment
.name());
3889 p
.field_hex("VmAddress", segment
.vmaddr(endian
).into());
3890 p
.field_hex("VmSize", segment
.vmsize(endian
).into());
3891 p
.field_hex("FileOffset", segment
.fileoff(endian
).into());
3892 p
.field_hex("FileSize", segment
.filesize(endian
).into());
3893 p
.field_hex("MaxProt", segment
.maxprot(endian
));
3894 p
.flags(segment
.maxprot(endian
), 0, FLAGS_VM
);
3895 p
.field_hex("InitProt", segment
.initprot(endian
));
3896 p
.flags(segment
.initprot(endian
), 0, FLAGS_VM
);
3897 p
.field("NumberOfSections", segment
.nsects(endian
));
3898 p
.field_hex("Flags", segment
.flags(endian
));
3899 p
.flags(segment
.flags(endian
), 0, FLAGS_SG
);
3900 if let Ok(sections
) = segment
.sections(endian
, section_data
) {
3901 for section
in sections
{
3902 print_section(p
, endian
, data
, cputype
, section
, state
);
3908 fn print_section
<S
: Section
>(
3909 p
: &mut Printer
<impl Write
>,
3914 state
: &mut MachState
,
3916 p
.group("Section", |p
| {
3917 p
.field("Index", state
.section_index
);
3918 state
.section_index
+= 1;
3919 p
.field_inline_string("SectionName", section
.name());
3920 p
.field_inline_string("SegmentName", section
.segment_name());
3921 p
.field_hex("Address", section
.addr(endian
).into());
3922 p
.field_hex("Size", section
.size(endian
).into());
3923 p
.field_hex("Offset", section
.offset(endian
));
3924 p
.field_hex("Align", section
.align(endian
));
3925 p
.field_hex("RelocationOffset", section
.reloff(endian
));
3926 p
.field_hex("NumberOfRelocations", section
.nreloc(endian
));
3927 let flags
= section
.flags(endian
);
3928 if flags
& SECTION_TYPE
== flags
{
3929 p
.field_enum("Flags", flags
, FLAGS_S_TYPE
);
3931 p
.field_hex("Flags", section
.flags(endian
));
3932 p
.flags(flags
, SECTION_TYPE
, FLAGS_S_TYPE
);
3933 p
.flags(flags
, 0, FLAGS_S_ATTR
);
3935 if let Ok(relocations
) = section
.relocations(endian
, data
) {
3936 let proc
= match cputype
{
3937 CPU_TYPE_X86
=> FLAGS_GENERIC_RELOC
,
3938 CPU_TYPE_X86_64
=> FLAGS_X86_64_RELOC
,
3939 CPU_TYPE_ARM
=> FLAGS_ARM_RELOC
,
3940 CPU_TYPE_ARM64
| CPU_TYPE_ARM64_32
=> FLAGS_ARM64_RELOC
,
3941 CPU_TYPE_POWERPC
| CPU_TYPE_POWERPC64
=> FLAGS_PPC_RELOC
,
3944 for relocation
in relocations
{
3945 if relocation
.r_scattered(endian
, cputype
) {
3946 let info
= relocation
.scattered_info(endian
);
3947 p
.group("ScatteredRelocationInfo", |p
| {
3948 p
.field_hex("Address", info
.r_address
);
3949 p
.field("PcRel", if info
.r_pcrel { "yes" }
else { "no" }
);
3950 p
.field("Length", info
.r_length
);
3951 p
.field_enum("Type", info
.r_type
, proc
);
3952 p
.field_hex("Value", info
.r_value
);
3955 let info
= relocation
.info(endian
);
3956 p
.group("RelocationInfo", |p
| {
3957 p
.field_hex("Address", info
.r_address
);
3959 // TODO: symbol name
3960 p
.field("Symbol", info
.r_symbolnum
);
3962 p
.field("Section", info
.r_symbolnum
);
3964 p
.field("PcRel", if info
.r_pcrel { "yes" }
else { "no" }
);
3965 p
.field("Length", info
.r_length
);
3966 p
.field("Extern", if info
.r_extern { "yes" }
else { "no" }
);
3967 p
.field_enum("Type", info
.r_type
, proc
);
3975 fn print_symtab
<Mach
: MachHeader
, W
: Write
>(
3977 endian
: Mach
::Endian
,
3979 symtab
: &SymtabCommand
<Mach
::Endian
>,
3981 p
.group("SymtabCommand", |p
| {
3982 p
.field_enum("Cmd", symtab
.cmd
.get(endian
), FLAGS_LC
);
3983 p
.field_hex("CmdSize", symtab
.cmdsize
.get(endian
));
3984 p
.field_hex("SymbolOffset", symtab
.symoff
.get(endian
));
3985 p
.field_hex("NumberOfSymbols", symtab
.nsyms
.get(endian
));
3986 p
.field_hex("StringOffset", symtab
.stroff
.get(endian
));
3987 p
.field_hex("StringSize", symtab
.strsize
.get(endian
));
3988 if let Ok(symbols
) = symtab
.symbols
::<Mach
, _
>(endian
, data
) {
3989 for (index
, nlist
) in symbols
.iter().enumerate() {
3990 p
.group("Nlist", |p
| {
3991 p
.field("Index", index
);
3994 nlist
.n_strx(endian
),
3995 nlist
.name(endian
, symbols
.strings()).ok(),
3997 let n_type
= nlist
.n_type();
3998 if nlist
.is_stab() {
3999 p
.field_enum("Type", n_type
, FLAGS_N_STAB
);
4000 } else if n_type
& N_TYPE
== n_type
{
4001 // Avoid an extra line if no flags.
4002 p
.field_enum("Type", n_type
, FLAGS_N_TYPE
);
4004 p
.field_hex("Type", n_type
);
4005 p
.flags(n_type
, N_TYPE
, FLAGS_N_TYPE
);
4006 p
.flags(n_type
, 0, FLAGS_N_EXT
);
4008 p
.field("Section", nlist
.n_sect());
4009 let n_desc
= nlist
.n_desc(endian
);
4010 p
.field_hex("Desc", n_desc
);
4011 if nlist
.is_undefined() {
4012 p
.flags(n_desc
, REFERENCE_TYPE
, FLAGS_REFERENCE
);
4014 if !nlist
.is_stab() {
4015 p
.flags(n_desc
, 0, FLAGS_N_DESC
);
4017 p
.field_hex("Value", nlist
.n_value(endian
).into());
4024 fn print_cputype(p
: &mut Printer
<impl Write
>, cputype
: u32, cpusubtype
: u32) {
4025 let proc
= match cputype
{
4026 CPU_TYPE_ANY
=> FLAGS_CPU_SUBTYPE_ANY
,
4027 CPU_TYPE_VAX
=> FLAGS_CPU_SUBTYPE_VAX
,
4028 CPU_TYPE_MC680X0
=> FLAGS_CPU_SUBTYPE_MC680X0
,
4029 CPU_TYPE_X86
=> FLAGS_CPU_SUBTYPE_X86
,
4030 CPU_TYPE_X86_64
=> FLAGS_CPU_SUBTYPE_X86_64
,
4031 CPU_TYPE_MIPS
=> FLAGS_CPU_SUBTYPE_MIPS
,
4032 CPU_TYPE_MC98000
=> FLAGS_CPU_SUBTYPE_MC98000
,
4033 CPU_TYPE_HPPA
=> FLAGS_CPU_SUBTYPE_HPPA
,
4034 CPU_TYPE_ARM
=> FLAGS_CPU_SUBTYPE_ARM
,
4035 CPU_TYPE_ARM64
=> FLAGS_CPU_SUBTYPE_ARM64
,
4036 CPU_TYPE_ARM64_32
=> FLAGS_CPU_SUBTYPE_ARM64_32
,
4037 CPU_TYPE_MC88000
=> FLAGS_CPU_SUBTYPE_MC88000
,
4038 CPU_TYPE_SPARC
=> FLAGS_CPU_SUBTYPE_SPARC
,
4039 CPU_TYPE_I860
=> FLAGS_CPU_SUBTYPE_I860
,
4040 CPU_TYPE_POWERPC
| CPU_TYPE_POWERPC64
=> FLAGS_CPU_SUBTYPE_POWERPC
,
4043 p
.field_enum("CpuType", cputype
, FLAGS_CPU_TYPE
);
4044 p
.field_hex("CpuSubtype", cpusubtype
);
4045 p
.flags(cpusubtype
, !CPU_SUBTYPE_MASK
, proc
);
4046 p
.flags(cpusubtype
, 0, FLAGS_CPU_SUBTYPE
);
4049 static FLAGS_CPU_TYPE
: &[Flag
<u32>] = &flags
!(
4068 static FLAGS_CPU_SUBTYPE
: &[Flag
<u32>] = &flags
!(CPU_SUBTYPE_LIB64
);
4069 static FLAGS_CPU_SUBTYPE_ANY
: &[Flag
<u32>] = &flags
!(
4070 CPU_SUBTYPE_MULTIPLE
,
4071 CPU_SUBTYPE_LITTLE_ENDIAN
,
4072 CPU_SUBTYPE_BIG_ENDIAN
,
4074 static FLAGS_CPU_SUBTYPE_VAX
: &[Flag
<u32>] = &flags
!(
4075 CPU_SUBTYPE_VAX_ALL
,
4082 CPU_SUBTYPE_VAX8200
,
4083 CPU_SUBTYPE_VAX8500
,
4084 CPU_SUBTYPE_VAX8600
,
4085 CPU_SUBTYPE_VAX8650
,
4086 CPU_SUBTYPE_VAX8800
,
4087 CPU_SUBTYPE_UVAXIII
,
4089 static FLAGS_CPU_SUBTYPE_MC680X0
: &[Flag
<u32>] = &flags
!(
4090 CPU_SUBTYPE_MC680X0_ALL
,
4091 CPU_SUBTYPE_MC68040
,
4092 CPU_SUBTYPE_MC68030_ONLY
,
4094 static FLAGS_CPU_SUBTYPE_X86
: &[Flag
<u32>] = &flags
!(
4095 CPU_SUBTYPE_I386_ALL
,
4101 CPU_SUBTYPE_PENTPRO
,
4102 CPU_SUBTYPE_PENTII_M3
,
4103 CPU_SUBTYPE_PENTII_M5
,
4104 CPU_SUBTYPE_CELERON
,
4105 CPU_SUBTYPE_CELERON_MOBILE
,
4106 CPU_SUBTYPE_PENTIUM_3
,
4107 CPU_SUBTYPE_PENTIUM_3_M
,
4108 CPU_SUBTYPE_PENTIUM_3_XEON
,
4109 CPU_SUBTYPE_PENTIUM_M
,
4110 CPU_SUBTYPE_PENTIUM_4
,
4111 CPU_SUBTYPE_PENTIUM_4_M
,
4112 CPU_SUBTYPE_ITANIUM
,
4113 CPU_SUBTYPE_ITANIUM_2
,
4115 CPU_SUBTYPE_XEON_MP
,
4117 static FLAGS_CPU_SUBTYPE_X86_64
: &[Flag
<u32>] = &flags
!(
4118 CPU_SUBTYPE_X86_64_ALL
,
4119 CPU_SUBTYPE_X86_ARCH1
,
4120 CPU_SUBTYPE_X86_64_H
,
4122 static FLAGS_CPU_SUBTYPE_MIPS
: &[Flag
<u32>] = &flags
!(
4123 CPU_SUBTYPE_MIPS_ALL
,
4124 CPU_SUBTYPE_MIPS_R2300
,
4125 CPU_SUBTYPE_MIPS_R2600
,
4126 CPU_SUBTYPE_MIPS_R2800
,
4127 CPU_SUBTYPE_MIPS_R2000A
,
4128 CPU_SUBTYPE_MIPS_R2000
,
4129 CPU_SUBTYPE_MIPS_R3000A
,
4130 CPU_SUBTYPE_MIPS_R3000
,
4132 static FLAGS_CPU_SUBTYPE_MC98000
: &[Flag
<u32>] =
4133 &flags
!(CPU_SUBTYPE_MC98000_ALL
, CPU_SUBTYPE_MC98601
);
4134 static FLAGS_CPU_SUBTYPE_HPPA
: &[Flag
<u32>] =
4135 &flags
!(CPU_SUBTYPE_HPPA_ALL
, CPU_SUBTYPE_HPPA_7100LC
);
4136 static FLAGS_CPU_SUBTYPE_MC88000
: &[Flag
<u32>] = &flags
!(
4137 CPU_SUBTYPE_MC88000_ALL
,
4138 CPU_SUBTYPE_MC88100
,
4139 CPU_SUBTYPE_MC88110
,
4141 static FLAGS_CPU_SUBTYPE_SPARC
: &[Flag
<u32>] = &flags
!(CPU_SUBTYPE_SPARC_ALL
);
4142 static FLAGS_CPU_SUBTYPE_I860
: &[Flag
<u32>] =
4143 &flags
!(CPU_SUBTYPE_I860_ALL
, CPU_SUBTYPE_I860_860
);
4144 static FLAGS_CPU_SUBTYPE_POWERPC
: &[Flag
<u32>] = &flags
!(
4145 CPU_SUBTYPE_POWERPC_ALL
,
4146 CPU_SUBTYPE_POWERPC_601
,
4147 CPU_SUBTYPE_POWERPC_602
,
4148 CPU_SUBTYPE_POWERPC_603
,
4149 CPU_SUBTYPE_POWERPC_603E
,
4150 CPU_SUBTYPE_POWERPC_603EV
,
4151 CPU_SUBTYPE_POWERPC_604
,
4152 CPU_SUBTYPE_POWERPC_604E
,
4153 CPU_SUBTYPE_POWERPC_620
,
4154 CPU_SUBTYPE_POWERPC_750
,
4155 CPU_SUBTYPE_POWERPC_7400
,
4156 CPU_SUBTYPE_POWERPC_7450
,
4157 CPU_SUBTYPE_POWERPC_970
,
4159 static FLAGS_CPU_SUBTYPE_ARM
: &[Flag
<u32>] = &flags
!(
4160 CPU_SUBTYPE_ARM_ALL
,
4161 CPU_SUBTYPE_ARM_V4T
,
4163 CPU_SUBTYPE_ARM_V5TEJ
,
4164 CPU_SUBTYPE_ARM_XSCALE
,
4166 CPU_SUBTYPE_ARM_V7F
,
4167 CPU_SUBTYPE_ARM_V7S
,
4168 CPU_SUBTYPE_ARM_V7K
,
4170 CPU_SUBTYPE_ARM_V6M
,
4171 CPU_SUBTYPE_ARM_V7M
,
4172 CPU_SUBTYPE_ARM_V7EM
,
4173 CPU_SUBTYPE_ARM_V8M
,
4175 static FLAGS_CPU_SUBTYPE_ARM64
: &[Flag
<u32>] = &flags
!(
4176 CPU_SUBTYPE_ARM64_ALL
,
4177 CPU_SUBTYPE_ARM64_V8
,
4180 static FLAGS_CPU_SUBTYPE_ARM64_32
: &[Flag
<u32>] =
4181 &flags
!(CPU_SUBTYPE_ARM64_32_ALL
, CPU_SUBTYPE_ARM64_32_V8
);
4182 static FLAGS_MH_FILETYPE
: &[Flag
<u32>] = &flags
!(
4196 static FLAGS_MH
: &[Flag
<u32>] = &flags
!(
4210 MH_SUBSECTIONS_VIA_SYMBOLS
,
4214 MH_ALLOW_STACK_EXECUTION
,
4217 MH_NO_REEXPORTED_DYLIBS
,
4219 MH_DEAD_STRIPPABLE_DYLIB
,
4220 MH_HAS_TLV_DESCRIPTORS
,
4221 MH_NO_HEAP_EXECUTION
,
4222 MH_APP_EXTENSION_SAFE
,
4223 MH_NLIST_OUTOFSYNC_WITH_DYLDINFO
,
4227 static FLAGS_LC
: &[Flag
<u32>] = &flags
!(
4257 LC_SEGMENT_SPLIT_INFO
,
4263 LC_LOAD_UPWARD_DYLIB
,
4264 LC_VERSION_MIN_MACOSX
,
4265 LC_VERSION_MIN_IPHONEOS
,
4267 LC_DYLD_ENVIRONMENT
,
4271 LC_DYLIB_CODE_SIGN_DRS
,
4272 LC_ENCRYPTION_INFO_64
,
4274 LC_LINKER_OPTIMIZATION_HINT
,
4275 LC_VERSION_MIN_TVOS
,
4276 LC_VERSION_MIN_WATCHOS
,
4279 LC_DYLD_EXPORTS_TRIE
,
4280 LC_DYLD_CHAINED_FIXUPS
,
4283 static FLAGS_VM
: &[Flag
<u32>] = &flags
!(VM_PROT_READ
, VM_PROT_WRITE
, VM_PROT_EXECUTE
);
4284 static FLAGS_SG
: &[Flag
<u32>] = &flags
!(
4288 SG_PROTECTED_VERSION_1
,
4291 static FLAGS_S_TYPE
: &[Flag
<u32>] = &flags
!(
4298 S_NON_LAZY_SYMBOL_POINTERS
,
4299 S_LAZY_SYMBOL_POINTERS
,
4301 S_MOD_INIT_FUNC_POINTERS
,
4302 S_MOD_TERM_FUNC_POINTERS
,
4308 S_LAZY_DYLIB_SYMBOL_POINTERS
,
4309 S_THREAD_LOCAL_REGULAR
,
4310 S_THREAD_LOCAL_ZEROFILL
,
4311 S_THREAD_LOCAL_VARIABLES
,
4312 S_THREAD_LOCAL_VARIABLE_POINTERS
,
4313 S_THREAD_LOCAL_INIT_FUNCTION_POINTERS
,
4314 S_INIT_FUNC_OFFSETS
,
4316 static FLAGS_S_ATTR
: &[Flag
<u32>] = &flags
!(
4317 S_ATTR_PURE_INSTRUCTIONS
,
4319 S_ATTR_STRIP_STATIC_SYMS
,
4320 S_ATTR_NO_DEAD_STRIP
,
4321 S_ATTR_LIVE_SUPPORT
,
4322 S_ATTR_SELF_MODIFYING_CODE
,
4324 S_ATTR_SOME_INSTRUCTIONS
,
4328 static FLAGS_PLATFORM
: &[Flag
<u32>] = &flags
!(
4334 PLATFORM_MACCATALYST
,
4335 PLATFORM_IOSSIMULATOR
,
4336 PLATFORM_TVOSSIMULATOR
,
4337 PLATFORM_WATCHOSSIMULATOR
,
4340 static FLAGS_N_EXT
: &[Flag
<u8>] = &flags
!(N_PEXT
, N_EXT
);
4341 static FLAGS_N_TYPE
: &[Flag
<u8>] = &flags
!(N_UNDF
, N_ABS
, N_SECT
, N_PBUD
, N_INDR
);
4342 static FLAGS_N_STAB
: &[Flag
<u8>] = &flags
!(
4343 N_GSYM
, N_FNAME
, N_FUN
, N_STSYM
, N_LCSYM
, N_BNSYM
, N_AST
, N_OPT
, N_RSYM
, N_SLINE
, N_ENSYM
,
4344 N_SSYM
, N_SO
, N_OSO
, N_LSYM
, N_BINCL
, N_SOL
, N_PARAMS
, N_VERSION
, N_OLEVEL
, N_PSYM
,
4345 N_EINCL
, N_ENTRY
, N_LBRAC
, N_EXCL
, N_RBRAC
, N_BCOMM
, N_ECOMM
, N_ECOML
, N_LENG
, N_PC
,
4347 static FLAGS_REFERENCE
: &[Flag
<u16>] = &flags
!(
4348 REFERENCE_FLAG_UNDEFINED_NON_LAZY
,
4349 REFERENCE_FLAG_UNDEFINED_LAZY
,
4350 REFERENCE_FLAG_DEFINED
,
4351 REFERENCE_FLAG_PRIVATE_DEFINED
,
4352 REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY
,
4353 REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY
,
4355 static FLAGS_N_DESC
: &[Flag
<u16>] = &flags
!(
4356 REFERENCED_DYNAMICALLY
,
4366 static FLAGS_GENERIC_RELOC
: &[Flag
<u8>] = &flags
!(
4367 GENERIC_RELOC_VANILLA
,
4369 GENERIC_RELOC_SECTDIFF
,
4370 GENERIC_RELOC_PB_LA_PTR
,
4371 GENERIC_RELOC_LOCAL_SECTDIFF
,
4374 static FLAGS_ARM_RELOC
: &[Flag
<u8>] = &flags
!(
4378 ARM_RELOC_LOCAL_SECTDIFF
,
4379 ARM_RELOC_PB_LA_PTR
,
4381 ARM_THUMB_RELOC_BR22
,
4382 ARM_THUMB_32BIT_BRANCH
,
4384 ARM_RELOC_HALF_SECTDIFF
,
4386 static FLAGS_ARM64_RELOC
: &[Flag
<u8>] = &flags
!(
4387 ARM64_RELOC_UNSIGNED
,
4388 ARM64_RELOC_SUBTRACTOR
,
4389 ARM64_RELOC_BRANCH26
,
4391 ARM64_RELOC_PAGEOFF12
,
4392 ARM64_RELOC_GOT_LOAD_PAGE21
,
4393 ARM64_RELOC_GOT_LOAD_PAGEOFF12
,
4394 ARM64_RELOC_POINTER_TO_GOT
,
4395 ARM64_RELOC_TLVP_LOAD_PAGE21
,
4396 ARM64_RELOC_TLVP_LOAD_PAGEOFF12
,
4398 ARM64_RELOC_AUTHENTICATED_POINTER
,
4400 static FLAGS_PPC_RELOC
: &[Flag
<u8>] = &flags
!(
4410 PPC_RELOC_PB_LA_PTR
,
4411 PPC_RELOC_HI16_SECTDIFF
,
4412 PPC_RELOC_LO16_SECTDIFF
,
4413 PPC_RELOC_HA16_SECTDIFF
,
4415 PPC_RELOC_LO14_SECTDIFF
,
4416 PPC_RELOC_LOCAL_SECTDIFF
,
4418 static FLAGS_X86_64_RELOC
: &[Flag
<u8>] = &flags
!(
4419 X86_64_RELOC_UNSIGNED
,
4420 X86_64_RELOC_SIGNED
,
4421 X86_64_RELOC_BRANCH
,
4422 X86_64_RELOC_GOT_LOAD
,
4424 X86_64_RELOC_SUBTRACTOR
,
4425 X86_64_RELOC_SIGNED_1
,
4426 X86_64_RELOC_SIGNED_2
,
4427 X86_64_RELOC_SIGNED_4
,
4435 use object
::read
::pe
::*;
4436 use object
::LittleEndian
as LE
;
4438 pub(super) fn print_coff(p
: &mut Printer
<impl Write
>, data
: &[u8]) {
4440 if let Ok(header
) = ImageFileHeader
::parse(data
, &mut offset
) {
4441 println
!("Format: COFF");
4442 print_file(p
, header
);
4443 let sections
= header
.sections(data
, offset
).ok();
4444 let symbols
= header
.symbols(data
).ok();
4445 if let Some(ref sections
) = sections
{
4446 print_sections(p
, data
, header
.machine
.get(LE
), symbols
.as_ref(), §ions
);
4448 if let Some(ref symbols
) = symbols
{
4449 print_symbols(p
, sections
.as_ref(), &symbols
);
4454 pub(super) fn print_pe32(p
: &mut Printer
<impl Write
>, data
: &[u8]) {
4455 println
!("Format: PE 32-bit");
4456 print_pe
::<ImageNtHeaders32
, _
>(p
, data
);
4459 pub(super) fn print_pe64(p
: &mut Printer
<impl Write
>, data
: &[u8]) {
4460 println
!("Format: PE 64-bit");
4461 print_pe
::<ImageNtHeaders64
, _
>(p
, data
);
4464 fn print_pe
<Pe
: ImageNtHeaders
, W
: Write
>(p
: &mut Printer
<W
>, data
: &[u8]) {
4465 if let Ok(dos_header
) = ImageDosHeader
::parse(data
) {
4466 p
.group("ImageDosHeader", |p
| {
4467 p
.field_hex("Magic", dos_header
.e_magic
.get(LE
));
4468 p
.field_hex("CountBytesLastPage", dos_header
.e_cblp
.get(LE
));
4469 p
.field_hex("CountPages", dos_header
.e_cp
.get(LE
));
4470 p
.field_hex("CountRelocations", dos_header
.e_crlc
.get(LE
));
4471 p
.field_hex("CountHeaderParagraphs", dos_header
.e_cparhdr
.get(LE
));
4472 p
.field_hex("MinAllocParagraphs", dos_header
.e_minalloc
.get(LE
));
4473 p
.field_hex("MaxAllocParagraphs", dos_header
.e_maxalloc
.get(LE
));
4474 p
.field_hex("StackSegment", dos_header
.e_ss
.get(LE
));
4475 p
.field_hex("StackPointer", dos_header
.e_sp
.get(LE
));
4476 p
.field_hex("Checksum", dos_header
.e_csum
.get(LE
));
4477 p
.field_hex("InstructionPointer", dos_header
.e_ip
.get(LE
));
4478 p
.field_hex("CodeSegment", dos_header
.e_cs
.get(LE
));
4479 p
.field_hex("AddressOfRelocations", dos_header
.e_lfarlc
.get(LE
));
4480 p
.field_hex("OverlayNumber", dos_header
.e_ovno
.get(LE
));
4481 p
.field_hex("OemId", dos_header
.e_oemid
.get(LE
));
4482 p
.field_hex("OemInfo", dos_header
.e_oeminfo
.get(LE
));
4483 p
.field_hex("AddressOfNewHeader", dos_header
.e_lfanew
.get(LE
));
4485 let mut offset
= dos_header
.nt_headers_offset().into();
4486 if let Ok((nt_headers
, data_directories
)) = Pe
::parse(data
, &mut offset
) {
4487 p
.group("ImageNtHeaders", |p
| {
4488 p
.field_hex("Signature", nt_headers
.signature());
4490 let header
= nt_headers
.file_header();
4491 let sections
= header
.sections(data
, offset
).ok();
4492 let symbols
= header
.symbols(data
).ok();
4493 print_file(p
, header
);
4494 print_optional(p
, nt_headers
.optional_header());
4495 for (index
, dir
) in data_directories
.iter().enumerate() {
4496 p
.group("ImageDataDirectory", |p
| {
4497 p
.field_enum("Index", index
, FLAGS_IMAGE_DIRECTORY_ENTRY
);
4498 p
.field_hex("VirtualAddress", dir
.virtual_address
.get(LE
));
4499 p
.field_hex("Size", dir
.size
.get(LE
));
4500 if let Some(dir_data
) = sections
4502 .and_then(|sections
| dir
.data(data
, sections
).ok())
4505 IMAGE_DIRECTORY_ENTRY_EXPORT
=> print_export_dir(p
, dir
, dir_data
),
4512 if let Some(ref sections
) = sections
{
4513 print_sections(p
, data
, header
.machine
.get(LE
), symbols
.as_ref(), §ions
);
4515 if let Some(ref symbols
) = symbols
{
4516 print_symbols(p
, sections
.as_ref(), &symbols
);
4522 fn print_file(p
: &mut Printer
<impl Write
>, header
: &ImageFileHeader
) {
4523 p
.group("ImageFileHeader", |p
| {
4524 p
.field_enum("Machine", header
.machine
.get(LE
), FLAGS_IMAGE_FILE_MACHINE
);
4525 p
.field("NumberOfSections", header
.number_of_sections
.get(LE
));
4526 p
.field("TimeDateStamp", header
.time_date_stamp
.get(LE
));
4528 "PointerToSymbolTable",
4529 header
.pointer_to_symbol_table
.get(LE
),
4531 p
.field("NumberOfSymbols", header
.number_of_symbols
.get(LE
));
4533 "SizeOfOptionalHeader",
4534 header
.size_of_optional_header
.get(LE
),
4536 p
.field_hex("Characteristics", header
.characteristics
.get(LE
));
4537 p
.flags(header
.characteristics
.get(LE
), 0, FLAGS_IMAGE_FILE
);
4541 fn print_optional(p
: &mut Printer
<impl Write
>, header
: &impl ImageOptionalHeader
) {
4542 p
.group("ImageOptionalHeader", |p
| {
4543 p
.field_hex("Magic", header
.magic());
4544 p
.field("MajorLinkerVersion", header
.major_linker_version());
4545 p
.field("MinorLinkerVersion", header
.minor_linker_version());
4546 p
.field_hex("SizeOfCode", header
.size_of_code());
4547 p
.field_hex("SizeOfInitializedData", header
.size_of_initialized_data());
4549 "SizeOfUninitializedData",
4550 header
.size_of_uninitialized_data(),
4552 p
.field_hex("AddressOfEntryPoint", header
.address_of_entry_point());
4553 p
.field_hex("BaseOfCode", header
.base_of_code());
4554 p
.field_hex("ImageBase", header
.image_base());
4555 p
.field_hex("SectionAlignment", header
.section_alignment());
4557 "MajorOperatingSystemVersion",
4558 header
.major_operating_system_version(),
4561 "MinorOperatingSystemVersion",
4562 header
.minor_operating_system_version(),
4564 p
.field("MajorImageVersion", header
.major_image_version());
4565 p
.field("MinorImageVersion", header
.minor_image_version());
4566 p
.field("MajorSubsystemVersion", header
.major_subsystem_version());
4567 p
.field("MinorSubsystemVersion", header
.minor_subsystem_version());
4568 p
.field("Win32VersionValue", header
.win32_version_value());
4569 p
.field_hex("SizeOfImage", header
.size_of_image());
4570 p
.field_hex("SizeOfHeaders", header
.size_of_headers());
4571 p
.field_hex("CheckSum", header
.check_sum());
4572 p
.field_enum("Subsystem", header
.subsystem(), FLAGS_IMAGE_SUBSYSTEM
);
4573 p
.field_hex("DllCharacteristics", header
.dll_characteristics());
4575 header
.dll_characteristics(),
4577 FLAGS_IMAGE_DLLCHARACTERISTICS
,
4579 p
.field_hex("SizeOfStackReserve", header
.size_of_stack_reserve());
4580 p
.field_hex("SizeOfStackCommit", header
.size_of_stack_commit());
4581 p
.field_hex("SizeOfHeapReserve", header
.size_of_heap_reserve());
4582 p
.field_hex("SizeOfHeapCommit", header
.size_of_heap_commit());
4583 p
.field_hex("LoaderFlags", header
.loader_flags());
4584 p
.field_hex("NumberOfRvaAndSizes", header
.number_of_rva_and_sizes());
4588 fn print_export_dir(p
: &mut Printer
<impl Write
>, _dir
: &ImageDataDirectory
, dir_data
: &[u8]) {
4589 if let Ok((export_dir
, _
)) = object
::from_bytes
::<pe
::ImageExportDirectory
>(dir_data
) {
4590 p
.group("ImageExportDirectory", |p
| {
4591 p
.field_hex("Characteristics", export_dir
.characteristics
.get(LE
));
4592 p
.field_hex("TimeDateStamp", export_dir
.time_date_stamp
.get(LE
));
4593 p
.field("MajorVersion", export_dir
.major_version
.get(LE
));
4594 p
.field("MinorVersion", export_dir
.minor_version
.get(LE
));
4595 p
.field_hex("Name", export_dir
.name
.get(LE
));
4596 p
.field("Base", export_dir
.base
.get(LE
));
4597 p
.field("NumberOfFunctions", export_dir
.number_of_functions
.get(LE
));
4598 p
.field("NumberOfNames", export_dir
.number_of_names
.get(LE
));
4600 "AddressOfFunctions",
4601 export_dir
.address_of_functions
.get(LE
),
4603 p
.field_hex("AddressOfNames", export_dir
.address_of_names
.get(LE
));
4605 "AddressOfNameOrdinals",
4606 export_dir
.address_of_name_ordinals
.get(LE
),
4608 // TODO: display tables
4614 p
: &mut Printer
<impl Write
>,
4617 symbols
: Option
<&SymbolTable
>,
4618 sections
: &SectionTable
,
4620 for (index
, section
) in sections
.iter().enumerate() {
4621 p
.group("ImageSectionHeader", |p
| {
4622 p
.field("Index", index
+ 1);
4623 if let Some(name
) = symbols
.and_then(|symbols
| section
.name(symbols
.strings()).ok())
4625 p
.field_inline_string("Name", name
);
4627 p
.field_inline_string("Name", section
.raw_name());
4629 p
.field_hex("VirtualSize", section
.virtual_size
.get(LE
));
4630 p
.field_hex("VirtualAddress", section
.virtual_address
.get(LE
));
4631 p
.field_hex("SizeOfRawData", section
.size_of_raw_data
.get(LE
));
4632 p
.field_hex("PointerToRawData", section
.pointer_to_raw_data
.get(LE
));
4634 "PointerToRelocations",
4635 section
.pointer_to_relocations
.get(LE
),
4638 "PointerToLinenumbers",
4639 section
.pointer_to_linenumbers
.get(LE
),
4641 p
.field("NumberOfRelocations", section
.number_of_relocations
.get(LE
));
4642 p
.field("NumberOfLinenumbers", section
.number_of_linenumbers
.get(LE
));
4643 p
.field_hex("Characteristics", section
.characteristics
.get(LE
));
4644 p
.flags(section
.characteristics
.get(LE
), 0, FLAGS_IMAGE_SCN
);
4646 section
.characteristics
.get(LE
),
4647 IMAGE_SCN_ALIGN_MASK
,
4648 FLAGS_IMAGE_SCN_ALIGN
,
4650 if let Ok(relocations
) = section
.coff_relocations(data
) {
4651 for relocation
in relocations
{
4652 p
.group("ImageRelocation", |p
| {
4653 p
.field_hex("VirtualAddress", relocation
.virtual_address
.get(LE
));
4654 let index
= relocation
.symbol_table_index
.get(LE
);
4655 let name
= symbols
.and_then(|symbols
| {
4657 .symbol(index
as usize)
4658 .and_then(|symbol
| symbol
.name(symbols
.strings()))
4661 p
.field_string("Symbol", index
, name
);
4662 let proc
= match machine
{
4663 IMAGE_FILE_MACHINE_I386
=> FLAGS_IMAGE_REL_I386
,
4664 IMAGE_FILE_MACHINE_MIPS16
4665 | IMAGE_FILE_MACHINE_MIPSFPU
4666 | IMAGE_FILE_MACHINE_MIPSFPU16
=> FLAGS_IMAGE_REL_MIPS
,
4667 IMAGE_FILE_MACHINE_ALPHA
| IMAGE_FILE_MACHINE_ALPHA64
=> {
4668 FLAGS_IMAGE_REL_ALPHA
4670 IMAGE_FILE_MACHINE_POWERPC
| IMAGE_FILE_MACHINE_POWERPCFP
=> {
4673 IMAGE_FILE_MACHINE_SH3
4674 | IMAGE_FILE_MACHINE_SH3DSP
4675 | IMAGE_FILE_MACHINE_SH3E
4676 | IMAGE_FILE_MACHINE_SH4
4677 | IMAGE_FILE_MACHINE_SH5
=> FLAGS_IMAGE_REL_SH
,
4678 IMAGE_FILE_MACHINE_ARM
=> FLAGS_IMAGE_REL_ARM
,
4679 IMAGE_FILE_MACHINE_AM33
=> FLAGS_IMAGE_REL_AM
,
4680 IMAGE_FILE_MACHINE_ARM64
=> FLAGS_IMAGE_REL_ARM64
,
4681 IMAGE_FILE_MACHINE_AMD64
=> FLAGS_IMAGE_REL_AMD64
,
4682 IMAGE_FILE_MACHINE_IA64
=> FLAGS_IMAGE_REL_IA64
,
4683 IMAGE_FILE_MACHINE_CEF
=> FLAGS_IMAGE_REL_CEF
,
4684 IMAGE_FILE_MACHINE_CEE
=> FLAGS_IMAGE_REL_CEE
,
4685 IMAGE_FILE_MACHINE_M32R
=> FLAGS_IMAGE_REL_M32R
,
4686 IMAGE_FILE_MACHINE_EBC
=> FLAGS_IMAGE_REL_EBC
,
4689 let typ
= relocation
.typ
.get(LE
);
4690 p
.field_enum("Type", typ
, proc
);
4692 IMAGE_FILE_MACHINE_POWERPC
| IMAGE_FILE_MACHINE_POWERPCFP
=> {
4693 p
.flags(typ
, 0, FLAGS_IMAGE_REL_PPC_BITS
)
4695 IMAGE_FILE_MACHINE_SH3
4696 | IMAGE_FILE_MACHINE_SH3DSP
4697 | IMAGE_FILE_MACHINE_SH3E
4698 | IMAGE_FILE_MACHINE_SH4
4699 | IMAGE_FILE_MACHINE_SH5
=> {
4700 p
.flags(typ
, 0, FLAGS_IMAGE_REL_SH_BITS
)
4712 p
: &mut Printer
<impl Write
>,
4713 sections
: Option
<&SectionTable
>,
4714 symbols
: &SymbolTable
,
4716 for (index
, symbol
) in symbols
.iter() {
4717 p
.group("ImageSymbol", |p
| {
4718 p
.field("Index", index
);
4719 if let Ok(name
) = symbol
.name(symbols
.strings()) {
4720 p
.field_inline_string("Name", name
);
4722 p
.field("Name", format
!("{:X?}", symbol
.name
));
4724 p
.field_hex("Value", symbol
.value
.get(LE
));
4725 let section
= symbol
.section_number
.get(LE
);
4726 if section
== 0 || section
>= IMAGE_SYM_SECTION_MAX
{
4727 p
.field_enum("Section", section
, FLAGS_IMAGE_SYM
);
4729 let section_name
= sections
.and_then(|sections
| {
4731 .section(section
.into())
4732 .and_then(|section
| section
.name(symbols
.strings()))
4735 p
.field_string("Section", section
, section_name
);
4737 p
.field_hex("Type", symbol
.typ
.get(LE
));
4738 p
.field_enum("BaseType", symbol
.base_type(), FLAGS_IMAGE_SYM_TYPE
);
4739 p
.field_enum("DerivedType", symbol
.derived_type(), FLAGS_IMAGE_SYM_DTYPE
);
4740 p
.field_enum("StorageClass", symbol
.storage_class
, FLAGS_IMAGE_SYM_CLASS
);
4741 p
.field_hex("NumberOfAuxSymbols", symbol
.number_of_aux_symbols
);
4742 if symbol
.has_aux_file_name() {
4743 if let Ok(name
) = symbols
.aux_file_name(index
, symbol
.number_of_aux_symbols
) {
4744 p
.group("ImageAuxSymbolFile", |p
| {
4745 p
.field_inline_string("Name", name
);
4748 } else if symbol
.has_aux_function() {
4749 if let Ok(aux
) = symbols
.aux_function(index
) {
4750 p
.group("ImageAuxSymbolFunction", |p
| {
4751 p
.field("TagIndex", aux
.tag_index
.get(LE
));
4752 p
.field("TotalSize", aux
.total_size
.get(LE
));
4753 p
.field_hex("PointerToLinenumber", aux
.pointer_to_linenumber
.get(LE
));
4755 "PointerToNextFunction",
4756 aux
.pointer_to_next_function
.get(LE
),
4758 p
.field("Unused", format
!("{:X?}", aux
.unused
));
4761 } else if symbol
.has_aux_section() {
4762 if let Ok(aux
) = symbols
.aux_section(index
) {
4763 p
.group("ImageAuxSymbolSection", |p
| {
4764 p
.field_hex("Length", aux
.length
.get(LE
));
4765 p
.field("NumberOfRelocations", aux
.number_of_relocations
.get(LE
));
4766 p
.field("NumberOfLinenumbers", aux
.number_of_linenumbers
.get(LE
));
4767 p
.field_hex("CheckSum", aux
.check_sum
.get(LE
));
4768 p
.field("Number", aux
.number
.get(LE
));
4769 p
.field_enum("Selection", aux
.selection
, FLAGS_IMAGE_COMDAT_SELECT
);
4770 p
.field_hex("Reserved", aux
.reserved
);
4771 p
.field("HighNumber", aux
.high_number
.get(LE
));
4775 // TODO: ImageAuxSymbolFunctionBeginEnd
4776 // TODO: ImageAuxSymbolWeak
4781 static FLAGS_IMAGE_FILE
: &[Flag
<u16>] = &flags
!(
4782 IMAGE_FILE_RELOCS_STRIPPED
,
4783 IMAGE_FILE_EXECUTABLE_IMAGE
,
4784 IMAGE_FILE_LINE_NUMS_STRIPPED
,
4785 IMAGE_FILE_LOCAL_SYMS_STRIPPED
,
4786 IMAGE_FILE_AGGRESIVE_WS_TRIM
,
4787 IMAGE_FILE_LARGE_ADDRESS_AWARE
,
4788 IMAGE_FILE_BYTES_REVERSED_LO
,
4789 IMAGE_FILE_32BIT_MACHINE
,
4790 IMAGE_FILE_DEBUG_STRIPPED
,
4791 IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
,
4792 IMAGE_FILE_NET_RUN_FROM_SWAP
,
4795 IMAGE_FILE_UP_SYSTEM_ONLY
,
4796 IMAGE_FILE_BYTES_REVERSED_HI
,
4798 static FLAGS_IMAGE_FILE_MACHINE
: &[Flag
<u16>] = &flags
!(
4799 IMAGE_FILE_MACHINE_UNKNOWN
,
4800 IMAGE_FILE_MACHINE_TARGET_HOST
,
4801 IMAGE_FILE_MACHINE_I386
,
4802 IMAGE_FILE_MACHINE_R3000
,
4803 IMAGE_FILE_MACHINE_R4000
,
4804 IMAGE_FILE_MACHINE_R10000
,
4805 IMAGE_FILE_MACHINE_WCEMIPSV2
,
4806 IMAGE_FILE_MACHINE_ALPHA
,
4807 IMAGE_FILE_MACHINE_SH3
,
4808 IMAGE_FILE_MACHINE_SH3DSP
,
4809 IMAGE_FILE_MACHINE_SH3E
,
4810 IMAGE_FILE_MACHINE_SH4
,
4811 IMAGE_FILE_MACHINE_SH5
,
4812 IMAGE_FILE_MACHINE_ARM
,
4813 IMAGE_FILE_MACHINE_THUMB
,
4814 IMAGE_FILE_MACHINE_ARMNT
,
4815 IMAGE_FILE_MACHINE_AM33
,
4816 IMAGE_FILE_MACHINE_POWERPC
,
4817 IMAGE_FILE_MACHINE_POWERPCFP
,
4818 IMAGE_FILE_MACHINE_IA64
,
4819 IMAGE_FILE_MACHINE_MIPS16
,
4820 IMAGE_FILE_MACHINE_ALPHA64
,
4821 IMAGE_FILE_MACHINE_MIPSFPU
,
4822 IMAGE_FILE_MACHINE_MIPSFPU16
,
4823 IMAGE_FILE_MACHINE_AXP64
,
4824 IMAGE_FILE_MACHINE_TRICORE
,
4825 IMAGE_FILE_MACHINE_CEF
,
4826 IMAGE_FILE_MACHINE_EBC
,
4827 IMAGE_FILE_MACHINE_AMD64
,
4828 IMAGE_FILE_MACHINE_M32R
,
4829 IMAGE_FILE_MACHINE_ARM64
,
4830 IMAGE_FILE_MACHINE_CEE
,
4831 IMAGE_FILE_MACHINE_RISCV32
,
4832 IMAGE_FILE_MACHINE_RISCV64
,
4833 IMAGE_FILE_MACHINE_RISCV128
,
4835 static FLAGS_IMAGE_SCN
: &[Flag
<u32>] = &flags
!(
4836 IMAGE_SCN_TYPE_NO_PAD
,
4838 IMAGE_SCN_CNT_INITIALIZED_DATA
,
4839 IMAGE_SCN_CNT_UNINITIALIZED_DATA
,
4840 IMAGE_SCN_LNK_OTHER
,
4842 IMAGE_SCN_LNK_REMOVE
,
4843 IMAGE_SCN_LNK_COMDAT
,
4844 IMAGE_SCN_NO_DEFER_SPEC_EXC
,
4846 IMAGE_SCN_MEM_FARDATA
,
4847 IMAGE_SCN_MEM_PURGEABLE
,
4848 IMAGE_SCN_MEM_16BIT
,
4849 IMAGE_SCN_MEM_LOCKED
,
4850 IMAGE_SCN_MEM_PRELOAD
,
4851 IMAGE_SCN_LNK_NRELOC_OVFL
,
4852 IMAGE_SCN_MEM_DISCARDABLE
,
4853 IMAGE_SCN_MEM_NOT_CACHED
,
4854 IMAGE_SCN_MEM_NOT_PAGED
,
4855 IMAGE_SCN_MEM_SHARED
,
4856 IMAGE_SCN_MEM_EXECUTE
,
4858 IMAGE_SCN_MEM_WRITE
,
4860 static FLAGS_IMAGE_SCN_ALIGN
: &[Flag
<u32>] = &flags
!(
4861 IMAGE_SCN_ALIGN_1BYTES
,
4862 IMAGE_SCN_ALIGN_2BYTES
,
4863 IMAGE_SCN_ALIGN_4BYTES
,
4864 IMAGE_SCN_ALIGN_8BYTES
,
4865 IMAGE_SCN_ALIGN_16BYTES
,
4866 IMAGE_SCN_ALIGN_32BYTES
,
4867 IMAGE_SCN_ALIGN_64BYTES
,
4868 IMAGE_SCN_ALIGN_128BYTES
,
4869 IMAGE_SCN_ALIGN_256BYTES
,
4870 IMAGE_SCN_ALIGN_512BYTES
,
4871 IMAGE_SCN_ALIGN_1024BYTES
,
4872 IMAGE_SCN_ALIGN_2048BYTES
,
4873 IMAGE_SCN_ALIGN_4096BYTES
,
4874 IMAGE_SCN_ALIGN_8192BYTES
,
4876 static FLAGS_IMAGE_REL_I386
: &[Flag
<u16>] = &flags
!(
4877 IMAGE_REL_I386_ABSOLUTE
,
4878 IMAGE_REL_I386_DIR16
,
4879 IMAGE_REL_I386_REL16
,
4880 IMAGE_REL_I386_DIR32
,
4881 IMAGE_REL_I386_DIR32NB
,
4882 IMAGE_REL_I386_SEG12
,
4883 IMAGE_REL_I386_SECTION
,
4884 IMAGE_REL_I386_SECREL
,
4885 IMAGE_REL_I386_TOKEN
,
4886 IMAGE_REL_I386_SECREL7
,
4887 IMAGE_REL_I386_REL32
,
4889 static FLAGS_IMAGE_REL_MIPS
: &[Flag
<u16>] = &flags
!(
4890 IMAGE_REL_MIPS_ABSOLUTE
,
4891 IMAGE_REL_MIPS_REFHALF
,
4892 IMAGE_REL_MIPS_REFWORD
,
4893 IMAGE_REL_MIPS_JMPADDR
,
4894 IMAGE_REL_MIPS_REFHI
,
4895 IMAGE_REL_MIPS_REFLO
,
4896 IMAGE_REL_MIPS_GPREL
,
4897 IMAGE_REL_MIPS_LITERAL
,
4898 IMAGE_REL_MIPS_SECTION
,
4899 IMAGE_REL_MIPS_SECREL
,
4900 IMAGE_REL_MIPS_SECRELLO
,
4901 IMAGE_REL_MIPS_SECRELHI
,
4902 IMAGE_REL_MIPS_TOKEN
,
4903 IMAGE_REL_MIPS_JMPADDR16
,
4904 IMAGE_REL_MIPS_REFWORDNB
,
4905 IMAGE_REL_MIPS_PAIR
,
4907 static FLAGS_IMAGE_REL_ALPHA
: &[Flag
<u16>] = &flags
!(
4908 IMAGE_REL_ALPHA_ABSOLUTE
,
4909 IMAGE_REL_ALPHA_REFLONG
,
4910 IMAGE_REL_ALPHA_REFQUAD
,
4911 IMAGE_REL_ALPHA_GPREL32
,
4912 IMAGE_REL_ALPHA_LITERAL
,
4913 IMAGE_REL_ALPHA_LITUSE
,
4914 IMAGE_REL_ALPHA_GPDISP
,
4915 IMAGE_REL_ALPHA_BRADDR
,
4916 IMAGE_REL_ALPHA_HINT
,
4917 IMAGE_REL_ALPHA_INLINE_REFLONG
,
4918 IMAGE_REL_ALPHA_REFHI
,
4919 IMAGE_REL_ALPHA_REFLO
,
4920 IMAGE_REL_ALPHA_PAIR
,
4921 IMAGE_REL_ALPHA_MATCH
,
4922 IMAGE_REL_ALPHA_SECTION
,
4923 IMAGE_REL_ALPHA_SECREL
,
4924 IMAGE_REL_ALPHA_REFLONGNB
,
4925 IMAGE_REL_ALPHA_SECRELLO
,
4926 IMAGE_REL_ALPHA_SECRELHI
,
4927 IMAGE_REL_ALPHA_REFQ3
,
4928 IMAGE_REL_ALPHA_REFQ2
,
4929 IMAGE_REL_ALPHA_REFQ1
,
4930 IMAGE_REL_ALPHA_GPRELLO
,
4931 IMAGE_REL_ALPHA_GPRELHI
,
4933 static FLAGS_IMAGE_REL_PPC
: &[Flag
<u16>] = &flags
!(
4934 IMAGE_REL_PPC_ABSOLUTE
,
4935 IMAGE_REL_PPC_ADDR64
,
4936 IMAGE_REL_PPC_ADDR32
,
4937 IMAGE_REL_PPC_ADDR24
,
4938 IMAGE_REL_PPC_ADDR16
,
4939 IMAGE_REL_PPC_ADDR14
,
4940 IMAGE_REL_PPC_REL24
,
4941 IMAGE_REL_PPC_REL14
,
4942 IMAGE_REL_PPC_TOCREL16
,
4943 IMAGE_REL_PPC_TOCREL14
,
4944 IMAGE_REL_PPC_ADDR32NB
,
4945 IMAGE_REL_PPC_SECREL
,
4946 IMAGE_REL_PPC_SECTION
,
4947 IMAGE_REL_PPC_IFGLUE
,
4948 IMAGE_REL_PPC_IMGLUE
,
4949 IMAGE_REL_PPC_SECREL16
,
4950 IMAGE_REL_PPC_REFHI
,
4951 IMAGE_REL_PPC_REFLO
,
4953 IMAGE_REL_PPC_SECRELLO
,
4954 IMAGE_REL_PPC_SECRELHI
,
4955 IMAGE_REL_PPC_GPREL
,
4956 IMAGE_REL_PPC_TOKEN
,
4958 static FLAGS_IMAGE_REL_PPC_BITS
: &[Flag
<u16>] = &flags
!(
4960 IMAGE_REL_PPC_BRTAKEN
,
4961 IMAGE_REL_PPC_BRNTAKEN
,
4962 IMAGE_REL_PPC_TOCDEFN
,
4964 static FLAGS_IMAGE_REL_SH
: &[Flag
<u16>] = &flags
!(
4965 IMAGE_REL_SH3_ABSOLUTE
,
4966 IMAGE_REL_SH3_DIRECT16
,
4967 IMAGE_REL_SH3_DIRECT32
,
4968 IMAGE_REL_SH3_DIRECT8
,
4969 IMAGE_REL_SH3_DIRECT8_WORD
,
4970 IMAGE_REL_SH3_DIRECT8_LONG
,
4971 IMAGE_REL_SH3_DIRECT4
,
4972 IMAGE_REL_SH3_DIRECT4_WORD
,
4973 IMAGE_REL_SH3_DIRECT4_LONG
,
4974 IMAGE_REL_SH3_PCREL8_WORD
,
4975 IMAGE_REL_SH3_PCREL8_LONG
,
4976 IMAGE_REL_SH3_PCREL12_WORD
,
4977 IMAGE_REL_SH3_STARTOF_SECTION
,
4978 IMAGE_REL_SH3_SIZEOF_SECTION
,
4979 IMAGE_REL_SH3_SECTION
,
4980 IMAGE_REL_SH3_SECREL
,
4981 IMAGE_REL_SH3_DIRECT32_NB
,
4982 IMAGE_REL_SH3_GPREL4_LONG
,
4983 IMAGE_REL_SH3_TOKEN
,
4984 IMAGE_REL_SHM_PCRELPT
,
4985 IMAGE_REL_SHM_REFLO
,
4986 IMAGE_REL_SHM_REFHALF
,
4987 IMAGE_REL_SHM_RELLO
,
4988 IMAGE_REL_SHM_RELHALF
,
4991 static FLAGS_IMAGE_REL_SH_BITS
: &[Flag
<u16>] = &flags
!(IMAGE_REL_SH_NOMODE
,);
4992 static FLAGS_IMAGE_REL_ARM
: &[Flag
<u16>] = &flags
!(
4993 IMAGE_REL_ARM_ABSOLUTE
,
4994 IMAGE_REL_ARM_ADDR32
,
4995 IMAGE_REL_ARM_ADDR32NB
,
4996 IMAGE_REL_ARM_BRANCH24
,
4997 IMAGE_REL_ARM_BRANCH11
,
4998 IMAGE_REL_ARM_TOKEN
,
4999 IMAGE_REL_ARM_GPREL12
,
5000 IMAGE_REL_ARM_GPREL7
,
5001 IMAGE_REL_ARM_BLX24
,
5002 IMAGE_REL_ARM_BLX11
,
5003 IMAGE_REL_ARM_SECTION
,
5004 IMAGE_REL_ARM_SECREL
,
5005 IMAGE_REL_ARM_MOV32A
,
5006 IMAGE_REL_ARM_MOV32T
,
5007 IMAGE_REL_ARM_BRANCH20T
,
5008 IMAGE_REL_ARM_BRANCH24T
,
5009 IMAGE_REL_ARM_BLX23T
,
5011 static FLAGS_IMAGE_REL_AM
: &[Flag
<u16>] = &flags
!(
5012 IMAGE_REL_AM_ABSOLUTE
,
5013 IMAGE_REL_AM_ADDR32
,
5014 IMAGE_REL_AM_ADDR32NB
,
5015 IMAGE_REL_AM_CALL32
,
5016 IMAGE_REL_AM_FUNCINFO
,
5017 IMAGE_REL_AM_REL32_1
,
5018 IMAGE_REL_AM_REL32_2
,
5019 IMAGE_REL_AM_SECREL
,
5020 IMAGE_REL_AM_SECTION
,
5023 static FLAGS_IMAGE_REL_ARM64
: &[Flag
<u16>] = &flags
!(
5024 IMAGE_REL_ARM64_ABSOLUTE
,
5025 IMAGE_REL_ARM64_ADDR32
,
5026 IMAGE_REL_ARM64_ADDR32NB
,
5027 IMAGE_REL_ARM64_BRANCH26
,
5028 IMAGE_REL_ARM64_PAGEBASE_REL21
,
5029 IMAGE_REL_ARM64_REL21
,
5030 IMAGE_REL_ARM64_PAGEOFFSET_12A
,
5031 IMAGE_REL_ARM64_PAGEOFFSET_12L
,
5032 IMAGE_REL_ARM64_SECREL
,
5033 IMAGE_REL_ARM64_SECREL_LOW12A
,
5034 IMAGE_REL_ARM64_SECREL_HIGH12A
,
5035 IMAGE_REL_ARM64_SECREL_LOW12L
,
5036 IMAGE_REL_ARM64_TOKEN
,
5037 IMAGE_REL_ARM64_SECTION
,
5038 IMAGE_REL_ARM64_ADDR64
,
5039 IMAGE_REL_ARM64_BRANCH19
,
5041 static FLAGS_IMAGE_REL_AMD64
: &[Flag
<u16>] = &flags
!(
5042 IMAGE_REL_AMD64_ABSOLUTE
,
5043 IMAGE_REL_AMD64_ADDR64
,
5044 IMAGE_REL_AMD64_ADDR32
,
5045 IMAGE_REL_AMD64_ADDR32NB
,
5046 IMAGE_REL_AMD64_REL32
,
5047 IMAGE_REL_AMD64_REL32_1
,
5048 IMAGE_REL_AMD64_REL32_2
,
5049 IMAGE_REL_AMD64_REL32_3
,
5050 IMAGE_REL_AMD64_REL32_4
,
5051 IMAGE_REL_AMD64_REL32_5
,
5052 IMAGE_REL_AMD64_SECTION
,
5053 IMAGE_REL_AMD64_SECREL
,
5054 IMAGE_REL_AMD64_SECREL7
,
5055 IMAGE_REL_AMD64_TOKEN
,
5056 IMAGE_REL_AMD64_SREL32
,
5057 IMAGE_REL_AMD64_PAIR
,
5058 IMAGE_REL_AMD64_SSPAN32
,
5059 IMAGE_REL_AMD64_EHANDLER
,
5060 IMAGE_REL_AMD64_IMPORT_BR
,
5061 IMAGE_REL_AMD64_IMPORT_CALL
,
5062 IMAGE_REL_AMD64_CFG_BR
,
5063 IMAGE_REL_AMD64_CFG_BR_REX
,
5064 IMAGE_REL_AMD64_CFG_CALL
,
5065 IMAGE_REL_AMD64_INDIR_BR
,
5066 IMAGE_REL_AMD64_INDIR_BR_REX
,
5067 IMAGE_REL_AMD64_INDIR_CALL
,
5068 IMAGE_REL_AMD64_INDIR_BR_SWITCHTABLE_FIRST
,
5069 IMAGE_REL_AMD64_INDIR_BR_SWITCHTABLE_LAST
,
5071 static FLAGS_IMAGE_REL_IA64
: &[Flag
<u16>] = &flags
!(
5072 IMAGE_REL_IA64_ABSOLUTE
,
5073 IMAGE_REL_IA64_IMM14
,
5074 IMAGE_REL_IA64_IMM22
,
5075 IMAGE_REL_IA64_IMM64
,
5076 IMAGE_REL_IA64_DIR32
,
5077 IMAGE_REL_IA64_DIR64
,
5078 IMAGE_REL_IA64_PCREL21B
,
5079 IMAGE_REL_IA64_PCREL21M
,
5080 IMAGE_REL_IA64_PCREL21F
,
5081 IMAGE_REL_IA64_GPREL22
,
5082 IMAGE_REL_IA64_LTOFF22
,
5083 IMAGE_REL_IA64_SECTION
,
5084 IMAGE_REL_IA64_SECREL22
,
5085 IMAGE_REL_IA64_SECREL64I
,
5086 IMAGE_REL_IA64_SECREL32
,
5087 IMAGE_REL_IA64_DIR32NB
,
5088 IMAGE_REL_IA64_SREL14
,
5089 IMAGE_REL_IA64_SREL22
,
5090 IMAGE_REL_IA64_SREL32
,
5091 IMAGE_REL_IA64_UREL32
,
5092 IMAGE_REL_IA64_PCREL60X
,
5093 IMAGE_REL_IA64_PCREL60B
,
5094 IMAGE_REL_IA64_PCREL60F
,
5095 IMAGE_REL_IA64_PCREL60I
,
5096 IMAGE_REL_IA64_PCREL60M
,
5097 IMAGE_REL_IA64_IMMGPREL64
,
5098 IMAGE_REL_IA64_TOKEN
,
5099 IMAGE_REL_IA64_GPREL32
,
5100 IMAGE_REL_IA64_ADDEND
,
5102 static FLAGS_IMAGE_REL_CEF
: &[Flag
<u16>] = &flags
!(
5103 IMAGE_REL_CEF_ABSOLUTE
,
5104 IMAGE_REL_CEF_ADDR32
,
5105 IMAGE_REL_CEF_ADDR64
,
5106 IMAGE_REL_CEF_ADDR32NB
,
5107 IMAGE_REL_CEF_SECTION
,
5108 IMAGE_REL_CEF_SECREL
,
5109 IMAGE_REL_CEF_TOKEN
,
5111 static FLAGS_IMAGE_REL_CEE
: &[Flag
<u16>] = &flags
!(
5112 IMAGE_REL_CEE_ABSOLUTE
,
5113 IMAGE_REL_CEE_ADDR32
,
5114 IMAGE_REL_CEE_ADDR64
,
5115 IMAGE_REL_CEE_ADDR32NB
,
5116 IMAGE_REL_CEE_SECTION
,
5117 IMAGE_REL_CEE_SECREL
,
5118 IMAGE_REL_CEE_TOKEN
,
5120 static FLAGS_IMAGE_REL_M32R
: &[Flag
<u16>] = &flags
!(
5121 IMAGE_REL_M32R_ABSOLUTE
,
5122 IMAGE_REL_M32R_ADDR32
,
5123 IMAGE_REL_M32R_ADDR32NB
,
5124 IMAGE_REL_M32R_ADDR24
,
5125 IMAGE_REL_M32R_GPREL16
,
5126 IMAGE_REL_M32R_PCREL24
,
5127 IMAGE_REL_M32R_PCREL16
,
5128 IMAGE_REL_M32R_PCREL8
,
5129 IMAGE_REL_M32R_REFHALF
,
5130 IMAGE_REL_M32R_REFHI
,
5131 IMAGE_REL_M32R_REFLO
,
5132 IMAGE_REL_M32R_PAIR
,
5133 IMAGE_REL_M32R_SECTION
,
5134 IMAGE_REL_M32R_SECREL32
,
5135 IMAGE_REL_M32R_TOKEN
,
5137 static FLAGS_IMAGE_REL_EBC
: &[Flag
<u16>] = &flags
!(
5138 IMAGE_REL_EBC_ABSOLUTE
,
5139 IMAGE_REL_EBC_ADDR32NB
,
5140 IMAGE_REL_EBC_REL32
,
5141 IMAGE_REL_EBC_SECTION
,
5142 IMAGE_REL_EBC_SECREL
,
5144 static FLAGS_IMAGE_SYM
: &[Flag
<u16>] =
5145 &flags
!(IMAGE_SYM_UNDEFINED
, IMAGE_SYM_ABSOLUTE
, IMAGE_SYM_DEBUG
,);
5146 static FLAGS_IMAGE_SYM_TYPE
: &[Flag
<u16>] = &flags
!(
5147 IMAGE_SYM_TYPE_NULL
,
5148 IMAGE_SYM_TYPE_VOID
,
5149 IMAGE_SYM_TYPE_CHAR
,
5150 IMAGE_SYM_TYPE_SHORT
,
5152 IMAGE_SYM_TYPE_LONG
,
5153 IMAGE_SYM_TYPE_FLOAT
,
5154 IMAGE_SYM_TYPE_DOUBLE
,
5155 IMAGE_SYM_TYPE_STRUCT
,
5156 IMAGE_SYM_TYPE_UNION
,
5157 IMAGE_SYM_TYPE_ENUM
,
5159 IMAGE_SYM_TYPE_BYTE
,
5160 IMAGE_SYM_TYPE_WORD
,
5161 IMAGE_SYM_TYPE_UINT
,
5162 IMAGE_SYM_TYPE_DWORD
,
5163 IMAGE_SYM_TYPE_PCODE
,
5165 static FLAGS_IMAGE_SYM_DTYPE
: &[Flag
<u16>] = &flags
!(
5166 IMAGE_SYM_DTYPE_NULL
,
5167 IMAGE_SYM_DTYPE_POINTER
,
5168 IMAGE_SYM_DTYPE_FUNCTION
,
5169 IMAGE_SYM_DTYPE_ARRAY
,
5171 static FLAGS_IMAGE_SYM_CLASS
: &[Flag
<u8>] = &flags
!(
5172 IMAGE_SYM_CLASS_END_OF_FUNCTION
,
5173 IMAGE_SYM_CLASS_NULL
,
5174 IMAGE_SYM_CLASS_AUTOMATIC
,
5175 IMAGE_SYM_CLASS_EXTERNAL
,
5176 IMAGE_SYM_CLASS_STATIC
,
5177 IMAGE_SYM_CLASS_REGISTER
,
5178 IMAGE_SYM_CLASS_EXTERNAL_DEF
,
5179 IMAGE_SYM_CLASS_LABEL
,
5180 IMAGE_SYM_CLASS_UNDEFINED_LABEL
,
5181 IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
,
5182 IMAGE_SYM_CLASS_ARGUMENT
,
5183 IMAGE_SYM_CLASS_STRUCT_TAG
,
5184 IMAGE_SYM_CLASS_MEMBER_OF_UNION
,
5185 IMAGE_SYM_CLASS_UNION_TAG
,
5186 IMAGE_SYM_CLASS_TYPE_DEFINITION
,
5187 IMAGE_SYM_CLASS_UNDEFINED_STATIC
,
5188 IMAGE_SYM_CLASS_ENUM_TAG
,
5189 IMAGE_SYM_CLASS_MEMBER_OF_ENUM
,
5190 IMAGE_SYM_CLASS_REGISTER_PARAM
,
5191 IMAGE_SYM_CLASS_BIT_FIELD
,
5192 IMAGE_SYM_CLASS_FAR_EXTERNAL
,
5193 IMAGE_SYM_CLASS_BLOCK
,
5194 IMAGE_SYM_CLASS_FUNCTION
,
5195 IMAGE_SYM_CLASS_END_OF_STRUCT
,
5196 IMAGE_SYM_CLASS_FILE
,
5197 IMAGE_SYM_CLASS_SECTION
,
5198 IMAGE_SYM_CLASS_WEAK_EXTERNAL
,
5199 IMAGE_SYM_CLASS_CLR_TOKEN
,
5201 static FLAGS_IMAGE_COMDAT_SELECT
: &[Flag
<u8>] = &flags
!(
5202 IMAGE_COMDAT_SELECT_NODUPLICATES
,
5203 IMAGE_COMDAT_SELECT_ANY
,
5204 IMAGE_COMDAT_SELECT_SAME_SIZE
,
5205 IMAGE_COMDAT_SELECT_EXACT_MATCH
,
5206 IMAGE_COMDAT_SELECT_ASSOCIATIVE
,
5207 IMAGE_COMDAT_SELECT_LARGEST
,
5208 IMAGE_COMDAT_SELECT_NEWEST
,
5210 static FLAGS_IMAGE_SUBSYSTEM
: &[Flag
<u16>] = &flags
!(
5211 IMAGE_SUBSYSTEM_UNKNOWN
,
5212 IMAGE_SUBSYSTEM_NATIVE
,
5213 IMAGE_SUBSYSTEM_WINDOWS_GUI
,
5214 IMAGE_SUBSYSTEM_WINDOWS_CUI
,
5215 IMAGE_SUBSYSTEM_OS2_CUI
,
5216 IMAGE_SUBSYSTEM_POSIX_CUI
,
5217 IMAGE_SUBSYSTEM_NATIVE_WINDOWS
,
5218 IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
,
5219 IMAGE_SUBSYSTEM_EFI_APPLICATION
,
5220 IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
,
5221 IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
,
5222 IMAGE_SUBSYSTEM_EFI_ROM
,
5223 IMAGE_SUBSYSTEM_XBOX
,
5224 IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION
,
5225 IMAGE_SUBSYSTEM_XBOX_CODE_CATALOG
,
5227 static FLAGS_IMAGE_DLLCHARACTERISTICS
: &[Flag
<u16>] = &flags
!(
5228 IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA
,
5229 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
,
5230 IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY
,
5231 IMAGE_DLLCHARACTERISTICS_NX_COMPAT
,
5232 IMAGE_DLLCHARACTERISTICS_NO_ISOLATION
,
5233 IMAGE_DLLCHARACTERISTICS_NO_SEH
,
5234 IMAGE_DLLCHARACTERISTICS_NO_BIND
,
5235 IMAGE_DLLCHARACTERISTICS_APPCONTAINER
,
5236 IMAGE_DLLCHARACTERISTICS_WDM_DRIVER
,
5237 IMAGE_DLLCHARACTERISTICS_GUARD_CF
,
5238 IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
,
5240 static FLAGS_IMAGE_DIRECTORY_ENTRY
: &[Flag
<usize>] = &flags
!(
5241 IMAGE_DIRECTORY_ENTRY_EXPORT
,
5242 IMAGE_DIRECTORY_ENTRY_IMPORT
,
5243 IMAGE_DIRECTORY_ENTRY_RESOURCE
,
5244 IMAGE_DIRECTORY_ENTRY_EXCEPTION
,
5245 IMAGE_DIRECTORY_ENTRY_SECURITY
,
5246 IMAGE_DIRECTORY_ENTRY_BASERELOC
,
5247 IMAGE_DIRECTORY_ENTRY_DEBUG
,
5248 IMAGE_DIRECTORY_ENTRY_ARCHITECTURE
,
5249 IMAGE_DIRECTORY_ENTRY_GLOBALPTR
,
5250 IMAGE_DIRECTORY_ENTRY_TLS
,
5251 IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG
,
5252 IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
,
5253 IMAGE_DIRECTORY_ENTRY_IAT
,
5254 IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT
,
5255 IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
,