1 //! Example that uses the lower level read API.
2 
3 use object::read::archive::ArchiveFile;
4 use object::read::macho::{FatArch, FatHeader};
5 use object::Endianness;
6 use std::convert::TryInto;
7 use std::io::Write;
8 use std::{env, fmt, fs, io, process, str};
9 
main()10 fn main() {
11     let arg_len = env::args().len();
12     if arg_len <= 1 {
13         eprintln!("Usage: {} <file> ...", env::args().next().unwrap());
14         process::exit(1);
15     }
16 
17     for file_path in env::args().skip(1) {
18         if arg_len > 2 {
19             println!();
20             println!("{}:", file_path);
21         }
22 
23         let file = match fs::File::open(&file_path) {
24             Ok(file) => file,
25             Err(err) => {
26                 println!("Failed to open file '{}': {}", file_path, err);
27                 continue;
28             }
29         };
30         let file = match unsafe { memmap2::Mmap::map(&file) } {
31             Ok(mmap) => mmap,
32             Err(err) => {
33                 println!("Failed to map file '{}': {}", file_path, err);
34                 continue;
35             }
36         };
37 
38         let stdout = io::stdout();
39         let mut printer = Printer::new(stdout.lock());
40         print_object(&mut printer, &*file);
41     }
42 }
43 
44 struct Printer<W: Write> {
45     w: W,
46     indent: usize,
47 }
48 
49 impl<W: Write> Printer<W> {
new(w: W) -> Self50     fn new(w: W) -> Self {
51         Self { w, indent: 0 }
52     }
53 
blank(&mut self)54     fn blank(&mut self) {
55         writeln!(self.w).unwrap();
56     }
57 
print_indent(&mut self)58     fn print_indent(&mut self) {
59         if self.indent != 0 {
60             write!(self.w, "{:-1$}", " ", self.indent * 4).unwrap();
61         }
62     }
63 
print_string(&mut self, s: &[u8])64     fn print_string(&mut self, s: &[u8]) {
65         if let Ok(s) = str::from_utf8(s) {
66             write!(self.w, "\"{}\"", s).unwrap();
67         } else {
68             write!(self.w, "{:X?}", s).unwrap();
69         }
70     }
71 
indent<F: FnOnce(&mut Self)>(&mut self, f: F)72     fn indent<F: FnOnce(&mut Self)>(&mut self, f: F) {
73         self.indent += 1;
74         f(self);
75         self.indent -= 1;
76     }
77 
group<F: FnOnce(&mut Self)>(&mut self, name: &str, f: F)78     fn group<F: FnOnce(&mut Self)>(&mut self, name: &str, f: F) {
79         self.print_indent();
80         writeln!(self.w, "{} {{", name).unwrap();
81         self.indent(f);
82         self.print_indent();
83         writeln!(self.w, "}}").unwrap();
84     }
85 
field_name(&mut self, name: &str)86     fn field_name(&mut self, name: &str) {
87         self.print_indent();
88         if !name.is_empty() {
89             write!(self.w, "{}: ", name).unwrap();
90         }
91     }
92 
field<T: fmt::Display>(&mut self, name: &str, value: T)93     fn field<T: fmt::Display>(&mut self, name: &str, value: T) {
94         self.field_name(name);
95         writeln!(self.w, "{}", value).unwrap();
96     }
97 
field_hex<T: fmt::UpperHex>(&mut self, name: &str, value: T)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();
101     }
102 
field_bytes(&mut self, name: &str, value: &[u8])103     fn field_bytes(&mut self, name: &str, value: &[u8]) {
104         self.field_name(name);
105         writeln!(self.w, "{:X?}", value).unwrap();
106     }
107 
field_string<T: fmt::UpperHex>(&mut self, name: &str, value: T, s: Option<&[u8]>)108     fn field_string<T: fmt::UpperHex>(&mut self, name: &str, value: T, s: Option<&[u8]>) {
109         if let Some(s) = s {
110             self.field_name(name);
111             self.print_string(s);
112             writeln!(self.w, " (0x{:X})", value).unwrap();
113         } else {
114             self.field_hex(name, value);
115         }
116     }
117 
field_inline_string(&mut self, name: &str, s: &[u8])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();
122     }
123 
field_enum<T: Eq + fmt::UpperHex>(&mut self, name: &str, value: T, flags: &[Flag<T>])124     fn field_enum<T: Eq + fmt::UpperHex>(&mut self, name: &str, value: T, flags: &[Flag<T>]) {
125         for flag in flags {
126             if value == flag.value {
127                 self.field_name(name);
128                 writeln!(self.w, "{} (0x{:X})", flag.name, value).unwrap();
129                 return;
130             }
131         }
132         self.field_hex(name, value);
133     }
134 
field_enums<T: Eq + fmt::UpperHex>(&mut self, name: &str, value: T, enums: &[&[Flag<T>]])135     fn field_enums<T: Eq + fmt::UpperHex>(&mut self, name: &str, value: T, enums: &[&[Flag<T>]]) {
136         for flags in enums {
137             for flag in *flags {
138                 if value == flag.value {
139                     self.field_name(name);
140                     writeln!(self.w, "{} (0x{:X})", flag.name, value).unwrap();
141                     return;
142                 }
143             }
144         }
145         self.field_hex(name, value);
146     }
147 
flags<T: Into<u64>, U: Copy + Into<u64>>(&mut self, value: T, mask: U, flags: &[Flag<U>])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();
151         self.indent(|p| {
152             if mask != 0 {
153                 for flag in flags {
154                     if value & mask == flag.value.into() {
155                         p.print_indent();
156                         writeln!(p.w, "{} (0x{:X})", flag.name, flag.value.into()).unwrap();
157                         return;
158                     }
159                 }
160                 p.print_indent();
161                 writeln!(p.w, "<unknown> (0x{:X})", value & mask).unwrap();
162             } else {
163                 for flag in flags {
164                     if value & flag.value.into() == flag.value.into() {
165                         p.print_indent();
166                         writeln!(p.w, "{} (0x{:X})", flag.name, flag.value.into()).unwrap();
167                     }
168                 }
169                 // TODO: display unknown flags (need to display all flags at once for this)
170             }
171         });
172     }
173 }
174 
175 struct Flag<T> {
176     value: T,
177     name: &'static str,
178 }
179 
180 macro_rules! flags {
181     ($($name:ident),+ $(,)?) => ( [ $(Flag { value: $name, name: stringify!($name), }),+ ] )
182 }
183 
print_object(p: &mut Printer<impl Write>, data: &[u8])184 fn print_object(p: &mut Printer<impl Write>, data: &[u8]) {
185     let kind = match object::FileKind::parse(data) {
186         Ok(file) => file,
187         Err(err) => {
188             println!("Failed to parse file: {}", err);
189             return;
190         }
191     };
192     match kind {
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),
204         // TODO
205         _ => {}
206     }
207 }
208 
print_object_at(p: &mut Printer<impl Write>, data: &[u8], offset: u64)209 fn print_object_at(p: &mut Printer<impl Write>, data: &[u8], offset: u64) {
210     let kind = match object::FileKind::parse_at(data, offset) {
211         Ok(file) => file,
212         Err(err) => {
213             println!("Failed to parse file: {}", err);
214             return;
215         }
216     };
217     match kind {
218         object::FileKind::MachO32 => macho::print_macho32(p, data, offset),
219         object::FileKind::MachO64 => macho::print_macho64(p, data, offset),
220         // TODO
221         _ => {}
222     }
223 }
224 
print_archive(p: &mut Printer<impl Write>, data: &[u8])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 {
230                 p.blank();
231                 p.field("Member", String::from_utf8_lossy(member.name()));
232                 if let Ok(data) = member.data(data) {
233                     print_object(p, data);
234                 }
235             }
236         }
237     }
238 }
239 
240 mod elf {
241     use super::*;
242     use object::elf::*;
243     use object::read::elf::*;
244 
print_elf32(p: &mut Printer<impl Write>, data: &[u8])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);
249         }
250     }
251 
print_elf64(p: &mut Printer<impl Write>, data: &[u8])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);
256         }
257     }
258 
print_elf<Elf: FileHeader<Endian = Endianness>>( p: &mut Printer<impl Write>, elf: &Elf, data: &[u8], )259     fn print_elf<Elf: FileHeader<Endian = Endianness>>(
260         p: &mut Printer<impl Write>,
261         elf: &Elf,
262         data: &[u8],
263     ) {
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);
268             }
269             if let Ok(sections) = elf.sections(endian, data) {
270                 print_section_headers(p, endian, data, elf, &sections);
271             }
272         }
273     }
274 
print_file_header<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, elf: &Elf, )275     fn print_file_header<Elf: FileHeader>(
276         p: &mut Printer<impl Write>,
277         endian: Elf::Endian,
278         elf: &Elf,
279     ) {
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);
285             if version < 256 {
286                 p.field_enum("Version", version as u8, &FLAGS_EV);
287             } else {
288                 p.field_hex("Version", version);
289             }
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),
299                 EM_MIPS => {
300                     p.flags(flags, 0, &FLAGS_EF_MIPS);
301                     p.flags(flags, EF_MIPS_ARCH, &FLAGS_EF_MIPS_ARCH);
302                 }
303                 EM_PARISC => {
304                     p.flags(flags, 0, &FLAGS_EF_PARISC);
305                     p.flags(flags, EF_PARISC_ARCH, &FLAGS_EF_PARISC_ARCH);
306                 }
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),
310                 EM_ARM => {
311                     p.flags(flags, 0, &FLAGS_EF_ARM);
312                     p.flags(flags, EF_ARM_EABIMASK, &FLAGS_EF_ARM_EABI);
313                 }
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),
318                 EM_RISCV => {
319                     p.flags(flags, 0, &FLAGS_EF_RISCV);
320                     p.flags(flags, EF_RISCV_FLOAT_ABI, &FLAGS_EF_RISCV_FLOAT_ABI);
321                 }
322                 _ => {}
323             };
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));
330         });
331     }
332 
print_ident(p: &mut Printer<impl Write>, ident: &Ident)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));
341     }
342 
print_program_headers<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: &[u8], elf: &Elf, segments: &[Elf::ProgramHeader], )343     fn print_program_headers<Elf: FileHeader>(
344         p: &mut Printer<impl Write>,
345         endian: Elf::Endian,
346         data: &[u8],
347         elf: &Elf,
348         segments: &[Elf::ProgramHeader],
349     ) {
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,
357                     _ => &[],
358                 };
359                 let os = match elf.e_ident().os_abi {
360                     ELFOSABI_HPUX => FLAGS_PT_HP,
361                     _ => &[],
362                 };
363                 p.field_enums("Type", segment.p_type(endian), &[FLAGS_PT, proc, os]);
364 
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());
370 
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),
376                     _ => {}
377                 };
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),
383                     _ => {}
384                 };
385 
386                 p.field_hex("Align", segment.p_align(endian).into());
387 
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),
391                     // TODO:
392                     //PT_INTERP =>
393                     //PT_SHLIB =>
394                     //PT_PHDR =>
395                     //PT_TLS =>
396                     //PT_GNU_EH_FRAME =>
397                     //PT_GNU_STACK =>
398                     //PT_GNU_RELRO =>
399                     _ => {}
400                 }
401             });
402         }
403     }
404 
print_segment_notes<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: &[u8], _elf: &Elf, segment: &Elf::ProgramHeader, )405     fn print_segment_notes<Elf: FileHeader>(
406         p: &mut Printer<impl Write>,
407         endian: Elf::Endian,
408         data: &[u8],
409         _elf: &Elf,
410         segment: &Elf::ProgramHeader,
411     ) {
412         if let Ok(Some(notes)) = segment.notes(endian, data) {
413             print_notes(p, endian, notes);
414         }
415     }
416 
print_segment_dynamic<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: &[u8], elf: &Elf, segments: &[Elf::ProgramHeader], segment: &Elf::ProgramHeader, )417     fn print_segment_dynamic<Elf: FileHeader>(
418         p: &mut Printer<impl Write>,
419         endian: Elf::Endian,
420         data: &[u8],
421         elf: &Elf,
422         segments: &[Elf::ProgramHeader],
423         segment: &Elf::ProgramHeader,
424     ) {
425         if let Ok(Some(dynamic)) = segment.dynamic(endian, data) {
426             // TODO: add a helper API for this and the other mandatory tags?
427             let mut strtab = 0;
428             let mut strsz = 0;
429             for d in dynamic {
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();
435                 }
436             }
437             let mut dynstr = object::StringTable::default();
438             for s in segments {
439                 if let Ok(Some(data)) = s.data_range(endian, data, strtab, strsz) {
440                     dynstr = object::StringTable::new(data);
441                     break;
442                 }
443             }
444 
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,
453                 _ => &[],
454             };
455             for d in dynamic {
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 {
462                             p.field_string(
463                                 "Value",
464                                 val,
465                                 val.try_into().ok().and_then(|val| dynstr.get(val).ok()),
466                             );
467                         } else {
468                             p.field_hex("Value", val);
469                             if tag == DT_FLAGS {
470                                 p.flags(val, 0, FLAGS_DF);
471                             } else if tag == DT_FLAGS_1 {
472                                 p.flags(val, 0, FLAGS_DF_1);
473                             }
474                         }
475                     } else {
476                         p.field_hex("Tag", tag);
477                         p.field_hex("Value", val);
478                     }
479                 });
480                 if tag == DT_NULL.into() {
481                     break;
482                 }
483             }
484         }
485     }
486 
print_section_headers<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: &[u8], elf: &Elf, sections: &SectionTable<Elf>, )487     fn print_section_headers<Elf: FileHeader>(
488         p: &mut Printer<impl Write>,
489         endian: Elf::Endian,
490         data: &[u8],
491         elf: &Elf,
492         sections: &SectionTable<Elf>,
493     ) {
494         for (index, section) in sections.iter().enumerate() {
495             p.group("SectionHeader", |p| {
496                 p.field("Index", index);
497                 p.field_string(
498                     "Name",
499                     section.sh_name(endian),
500                     sections.section_name(endian, section).ok(),
501                 );
502 
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,
511                     _ => &[],
512                 };
513                 p.field_enums("Type", section.sh_type(endian), &[FLAGS_SHT, proc]);
514 
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),
524                     _ => {}
525                 }
526 
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());
534 
535                 match section.sh_type(endian) {
536                     SHT_SYMTAB | SHT_DYNSYM => {
537                         print_section_symbols(p, endian, data, elf, sections, index, section)
538                     }
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                     // TODO:
544                     //SHT_HASH =>
545                     //SHT_DYNAMIC =>
546                     //SHT_SHLIB =>
547                     //SHT_INIT_ARRAY =>
548                     //SHT_FINI_ARRAY =>
549                     //SHT_PREINIT_ARRAY =>
550                     _ => {}
551                 }
552             });
553         }
554     }
555 
print_section_symbols<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: &[u8], elf: &Elf, sections: &SectionTable<Elf>, section_index: usize, section: &Elf::SectionHeader, )556     fn print_section_symbols<Elf: FileHeader>(
557         p: &mut Printer<impl Write>,
558         endian: Elf::Endian,
559         data: &[u8],
560         elf: &Elf,
561         sections: &SectionTable<Elf>,
562         section_index: usize,
563         section: &Elf::SectionHeader,
564     ) {
565         if let Ok(Some(symbols)) = section.symbols(endian, data, sections, section_index) {
566             let os_stt = match elf.e_ident().os_abi {
567                 ELFOSABI_GNU => FLAGS_STT_GNU,
568                 ELFOSABI_HPUX => FLAGS_STT_HP,
569                 _ => &[],
570             };
571             let proc_stt = match elf.e_machine(endian) {
572                 EM_SPARC => FLAGS_STT_SPARC,
573                 EM_PARISC => FLAGS_STT_PARISC,
574                 EM_ARM => FLAGS_STT_ARM,
575                 _ => &[],
576             };
577             let os_stb = match elf.e_ident().os_abi {
578                 ELFOSABI_GNU => FLAGS_STB_GNU,
579                 _ => &[],
580             };
581             let proc_stb = match elf.e_machine(endian) {
582                 EM_MIPS => FLAGS_STB_MIPS,
583                 _ => &[],
584             };
585             let proc_shn = match elf.e_machine(endian) {
586                 EM_MIPS => FLAGS_SHN_MIPS,
587                 EM_PARISC => FLAGS_SHN_PARISC,
588                 _ => &[],
589             };
590             for (index, symbol) in symbols.iter().enumerate() {
591                 p.group("Symbol", |p| {
592                     p.field("Index", index);
593                     p.field_string(
594                         "Name",
595                         symbol.st_name(endian),
596                         symbol.name(endian, symbols.strings()).ok(),
597                     );
598                     p.field_hex("Value", symbol.st_value(endian).into());
599                     p.field_hex("Size", symbol.st_size(endian).into());
600                     p.field_enums("Type", symbol.st_type(), &[FLAGS_STT, os_stt, proc_stt]);
601                     p.field_enums("Bind", symbol.st_bind(), &[FLAGS_STB, os_stb, proc_stb]);
602 
603                     let other = symbol.st_other();
604                     if other & !0x3 == 0 {
605                         p.field_enum("Other", other, FLAGS_STV);
606                     } else {
607                         p.field_hex("Other", other);
608                         p.flags(other, 0x3, FLAGS_STV);
609                         match elf.e_machine(endian) {
610                             EM_MIPS => p.flags(other, 0, FLAGS_STO_MIPS),
611                             EM_ALPHA => p.flags(other, 0, FLAGS_STO_ALPHA),
612                             EM_PPC64 => p.field_hex(
613                                 "Local",
614                                 (other & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT,
615                             ),
616                             _ => {}
617                         }
618                     }
619 
620                     let shndx = symbol.st_shndx(endian);
621                     if shndx == SHN_UNDEF || shndx >= SHN_LORESERVE {
622                         p.field_enums("SectionIndex", shndx, &[FLAGS_SHN, proc_shn]);
623                     } else {
624                         p.field("SectionIndex", shndx);
625                     }
626                     if let Some(shndx) = symbols.shndx(index) {
627                         p.field("ExtendedSectionIndex", shndx);
628                     }
629                 });
630             }
631         }
632     }
633 
print_section_rel<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: &[u8], elf: &Elf, sections: &SectionTable<Elf>, section: &Elf::SectionHeader, )634     fn print_section_rel<Elf: FileHeader>(
635         p: &mut Printer<impl Write>,
636         endian: Elf::Endian,
637         data: &[u8],
638         elf: &Elf,
639         sections: &SectionTable<Elf>,
640         section: &Elf::SectionHeader,
641     ) {
642         if let Ok(Some(relocations)) = section.rel(endian, data) {
643             let symbols = section.relocation_symbols(endian, data, sections).ok();
644             let proc = rel_flag_type(endian, elf);
645             for relocation in relocations {
646                 p.group("Relocation", |p| {
647                     p.field_hex("Offset", relocation.r_offset(endian).into());
648                     p.field_enum("Type", relocation.r_type(endian), proc);
649                     let sym = relocation.r_sym(endian);
650                     p.field_string("Symbol", sym, rel_symbol(endian, symbols, sym as usize));
651                 });
652             }
653         }
654     }
655 
print_section_rela<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: &[u8], elf: &Elf, sections: &SectionTable<Elf>, section: &Elf::SectionHeader, )656     fn print_section_rela<Elf: FileHeader>(
657         p: &mut Printer<impl Write>,
658         endian: Elf::Endian,
659         data: &[u8],
660         elf: &Elf,
661         sections: &SectionTable<Elf>,
662         section: &Elf::SectionHeader,
663     ) {
664         if let Ok(Some(relocations)) = section.rela(endian, data) {
665             let symbols = section.relocation_symbols(endian, data, sections).ok();
666             let proc = rel_flag_type(endian, elf);
667             for relocation in relocations {
668                 p.group("Relocation", |p| {
669                     p.field_hex("Offset", relocation.r_offset(endian).into());
670                     p.field_enum(
671                         "Type",
672                         relocation.r_type(endian, elf.is_mips64el(endian)),
673                         proc,
674                     );
675                     let sym = relocation.r_sym(endian, elf.is_mips64el(endian));
676                     p.field_string("Symbol", sym, rel_symbol(endian, symbols, sym as usize));
677                     let addend = relocation.r_addend(endian).into() as u64;
678                     if addend != 0 {
679                         p.field_hex("Addend", addend);
680                     }
681                 });
682             }
683         }
684     }
685 
rel_symbol<'data, Elf: FileHeader>( endian: Elf::Endian, symbols: Option<SymbolTable<'data, Elf>>, sym: usize, ) -> Option<&'data [u8]>686     fn rel_symbol<'data, Elf: FileHeader>(
687         endian: Elf::Endian,
688         symbols: Option<SymbolTable<'data, Elf>>,
689         sym: usize,
690     ) -> Option<&'data [u8]> {
691         let symbols = symbols?;
692         let symbol = symbols.symbol(sym as usize).ok()?;
693         symbol.name(endian, symbols.strings()).ok()
694     }
695 
rel_flag_type<Elf: FileHeader>(endian: Elf::Endian, elf: &Elf) -> &'static [Flag<u32>]696     fn rel_flag_type<Elf: FileHeader>(endian: Elf::Endian, elf: &Elf) -> &'static [Flag<u32>] {
697         match elf.e_machine(endian) {
698             EM_68K => FLAGS_R_68K,
699             EM_386 => FLAGS_R_386,
700             EM_SPARC => FLAGS_R_SPARC,
701             EM_MIPS => FLAGS_R_MIPS,
702             EM_PARISC => FLAGS_R_PARISC,
703             EM_ALPHA => FLAGS_R_ALPHA,
704             EM_PPC => FLAGS_R_PPC,
705             EM_PPC64 => FLAGS_R_PPC64,
706             EM_AARCH64 => FLAGS_R_AARCH64,
707             EM_ARM => FLAGS_R_ARM,
708             EM_CSKY => FLAGS_R_CKCORE,
709             EM_IA_64 => FLAGS_R_IA64,
710             EM_SH => FLAGS_R_SH,
711             EM_S390 => FLAGS_R_390,
712             EM_CRIS => FLAGS_R_CRIS,
713             EM_X86_64 => FLAGS_R_X86_64,
714             EM_MN10300 => FLAGS_R_MN10300,
715             EM_M32R => FLAGS_R_M32R,
716             EM_MICROBLAZE => FLAGS_R_MICROBLAZE,
717             EM_ALTERA_NIOS2 => FLAGS_R_NIOS2,
718             EM_TILEPRO => FLAGS_R_TILEPRO,
719             EM_TILEGX => FLAGS_R_TILEGX,
720             EM_RISCV => FLAGS_R_RISCV,
721             EM_BPF => FLAGS_R_BPF,
722             EM_METAG => FLAGS_R_METAG,
723             EM_NDS32 => FLAGS_R_NDS32,
724             _ => &[],
725         }
726     }
727 
print_section_notes<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: &[u8], _elf: &Elf, section: &Elf::SectionHeader, )728     fn print_section_notes<Elf: FileHeader>(
729         p: &mut Printer<impl Write>,
730         endian: Elf::Endian,
731         data: &[u8],
732         _elf: &Elf,
733         section: &Elf::SectionHeader,
734     ) {
735         if let Ok(Some(notes)) = section.notes(endian, data) {
736             print_notes(p, endian, notes);
737         }
738     }
739 
print_section_group<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: &[u8], _elf: &Elf, sections: &SectionTable<Elf>, section: &Elf::SectionHeader, )740     fn print_section_group<Elf: FileHeader>(
741         p: &mut Printer<impl Write>,
742         endian: Elf::Endian,
743         data: &[u8],
744         _elf: &Elf,
745         sections: &SectionTable<Elf>,
746         section: &Elf::SectionHeader,
747     ) {
748         if let Ok(Some((flag, members))) = section.group(endian, data) {
749             p.field_enum("GroupFlag", flag, FLAGS_GRP);
750             p.group("GroupSections", |p| {
751                 for member in members {
752                     let index = member.get(endian);
753                     p.print_indent();
754                     if let Ok(section) = sections.section(index as usize) {
755                         if let Ok(name) = sections.section_name(endian, section) {
756                             p.print_string(name);
757                             writeln!(p.w, " ({})", index).unwrap();
758                         } else {
759                             writeln!(p.w, "{}", index).unwrap();
760                         }
761                     } else {
762                         writeln!(p.w, "{}", index).unwrap();
763                     }
764                 }
765             });
766         }
767     }
768 
print_notes<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, mut notes: NoteIterator<Elf>, )769     fn print_notes<Elf: FileHeader>(
770         p: &mut Printer<impl Write>,
771         endian: Elf::Endian,
772         mut notes: NoteIterator<Elf>,
773     ) {
774         while let Ok(Some(note)) = notes.next() {
775             p.group("Note", |p| {
776                 let name = note.name();
777                 p.field_string("Name", note.n_namesz(endian), Some(name));
778                 let flags = if name == ELF_NOTE_CORE || name == ELF_NOTE_LINUX {
779                     FLAGS_NT_CORE
780                 } else if name == ELF_NOTE_SOLARIS {
781                     FLAGS_NT_SOLARIS
782                 } else if name == ELF_NOTE_GNU {
783                     FLAGS_NT_GNU
784                 } else {
785                     // TODO: NT_VERSION
786                     &[]
787                 };
788                 p.field_enum("Type", note.n_type(endian), flags);
789                 // TODO: interpret desc
790                 p.field_bytes("Desc", note.desc());
791             });
792         }
793     }
794 
795     static FLAGS_EI_CLASS: &[Flag<u8>] = &flags!(ELFCLASSNONE, ELFCLASS32, ELFCLASS64);
796     static FLAGS_EI_DATA: &[Flag<u8>] = &flags!(ELFDATANONE, ELFDATA2LSB, ELFDATA2MSB);
797     static FLAGS_EV: &[Flag<u8>] = &flags!(EV_NONE, EV_CURRENT);
798     static FLAGS_EI_OSABI: &[Flag<u8>] = &flags!(
799         ELFOSABI_SYSV,
800         ELFOSABI_HPUX,
801         ELFOSABI_NETBSD,
802         ELFOSABI_GNU,
803         ELFOSABI_SOLARIS,
804         ELFOSABI_AIX,
805         ELFOSABI_IRIX,
806         ELFOSABI_FREEBSD,
807         ELFOSABI_TRU64,
808         ELFOSABI_MODESTO,
809         ELFOSABI_OPENBSD,
810         ELFOSABI_ARM_AEABI,
811         ELFOSABI_ARM,
812         ELFOSABI_STANDALONE,
813     );
814     static FLAGS_ET: &[Flag<u16>] = &flags!(ET_NONE, ET_REL, ET_EXEC, ET_DYN, ET_CORE);
815     static FLAGS_EM: &[Flag<u16>] = &flags!(
816         EM_NONE,
817         EM_M32,
818         EM_SPARC,
819         EM_386,
820         EM_68K,
821         EM_88K,
822         EM_IAMCU,
823         EM_860,
824         EM_MIPS,
825         EM_S370,
826         EM_MIPS_RS3_LE,
827         EM_PARISC,
828         EM_VPP500,
829         EM_SPARC32PLUS,
830         EM_960,
831         EM_PPC,
832         EM_PPC64,
833         EM_S390,
834         EM_SPU,
835         EM_V800,
836         EM_FR20,
837         EM_RH32,
838         EM_RCE,
839         EM_ARM,
840         EM_FAKE_ALPHA,
841         EM_SH,
842         EM_SPARCV9,
843         EM_TRICORE,
844         EM_ARC,
845         EM_H8_300,
846         EM_H8_300H,
847         EM_H8S,
848         EM_H8_500,
849         EM_IA_64,
850         EM_MIPS_X,
851         EM_COLDFIRE,
852         EM_68HC12,
853         EM_MMA,
854         EM_PCP,
855         EM_NCPU,
856         EM_NDR1,
857         EM_STARCORE,
858         EM_ME16,
859         EM_ST100,
860         EM_TINYJ,
861         EM_X86_64,
862         EM_PDSP,
863         EM_PDP10,
864         EM_PDP11,
865         EM_FX66,
866         EM_ST9PLUS,
867         EM_ST7,
868         EM_68HC16,
869         EM_68HC11,
870         EM_68HC08,
871         EM_68HC05,
872         EM_SVX,
873         EM_ST19,
874         EM_VAX,
875         EM_CRIS,
876         EM_JAVELIN,
877         EM_FIREPATH,
878         EM_ZSP,
879         EM_MMIX,
880         EM_HUANY,
881         EM_PRISM,
882         EM_AVR,
883         EM_FR30,
884         EM_D10V,
885         EM_D30V,
886         EM_V850,
887         EM_M32R,
888         EM_MN10300,
889         EM_MN10200,
890         EM_PJ,
891         EM_OPENRISC,
892         EM_ARC_COMPACT,
893         EM_XTENSA,
894         EM_VIDEOCORE,
895         EM_TMM_GPP,
896         EM_NS32K,
897         EM_TPC,
898         EM_SNP1K,
899         EM_ST200,
900         EM_IP2K,
901         EM_MAX,
902         EM_CR,
903         EM_F2MC16,
904         EM_MSP430,
905         EM_BLACKFIN,
906         EM_SE_C33,
907         EM_SEP,
908         EM_ARCA,
909         EM_UNICORE,
910         EM_EXCESS,
911         EM_DXP,
912         EM_ALTERA_NIOS2,
913         EM_CRX,
914         EM_XGATE,
915         EM_C166,
916         EM_M16C,
917         EM_DSPIC30F,
918         EM_CE,
919         EM_M32C,
920         EM_TSK3000,
921         EM_RS08,
922         EM_SHARC,
923         EM_ECOG2,
924         EM_SCORE7,
925         EM_DSP24,
926         EM_VIDEOCORE3,
927         EM_LATTICEMICO32,
928         EM_SE_C17,
929         EM_TI_C6000,
930         EM_TI_C2000,
931         EM_TI_C5500,
932         EM_TI_ARP32,
933         EM_TI_PRU,
934         EM_MMDSP_PLUS,
935         EM_CYPRESS_M8C,
936         EM_R32C,
937         EM_TRIMEDIA,
938         EM_HEXAGON,
939         EM_8051,
940         EM_STXP7X,
941         EM_NDS32,
942         EM_ECOG1X,
943         EM_MAXQ30,
944         EM_XIMO16,
945         EM_MANIK,
946         EM_CRAYNV2,
947         EM_RX,
948         EM_METAG,
949         EM_MCST_ELBRUS,
950         EM_ECOG16,
951         EM_CR16,
952         EM_ETPU,
953         EM_SLE9X,
954         EM_L10M,
955         EM_K10M,
956         EM_AARCH64,
957         EM_AVR32,
958         EM_STM8,
959         EM_TILE64,
960         EM_TILEPRO,
961         EM_MICROBLAZE,
962         EM_CUDA,
963         EM_TILEGX,
964         EM_CLOUDSHIELD,
965         EM_COREA_1ST,
966         EM_COREA_2ND,
967         EM_ARC_COMPACT2,
968         EM_OPEN8,
969         EM_RL78,
970         EM_VIDEOCORE5,
971         EM_78KOR,
972         EM_56800EX,
973         EM_BA1,
974         EM_BA2,
975         EM_XCORE,
976         EM_MCHP_PIC,
977         EM_KM32,
978         EM_KMX32,
979         EM_EMX16,
980         EM_EMX8,
981         EM_KVARC,
982         EM_CDP,
983         EM_COGE,
984         EM_COOL,
985         EM_NORC,
986         EM_CSR_KALIMBA,
987         EM_Z80,
988         EM_VISIUM,
989         EM_FT32,
990         EM_MOXIE,
991         EM_AMDGPU,
992         EM_RISCV,
993         EM_BPF,
994         EM_CSKY,
995         EM_ALPHA,
996     );
997     static FLAGS_EF_SPARC: &[Flag<u32>] = &flags!(
998         EF_SPARC_LEDATA,
999         EF_SPARC_EXT_MASK,
1000         EF_SPARC_32PLUS,
1001         EF_SPARC_SUN_US1,
1002         EF_SPARC_HAL_R1,
1003         EF_SPARC_SUN_US3,
1004     );
1005     static FLAGS_EF_SPARCV9: &[Flag<u32>] = &flags!(
1006         EF_SPARCV9_MM,
1007         EF_SPARCV9_TSO,
1008         EF_SPARCV9_PSO,
1009         EF_SPARCV9_RMO,
1010     );
1011     static FLAGS_EF_MIPS: &[Flag<u32>] = &flags!(
1012         EF_MIPS_NOREORDER,
1013         EF_MIPS_PIC,
1014         EF_MIPS_CPIC,
1015         EF_MIPS_XGOT,
1016         EF_MIPS_64BIT_WHIRL,
1017         EF_MIPS_ABI2,
1018         EF_MIPS_ABI_ON32,
1019         EF_MIPS_FP64,
1020         EF_MIPS_NAN2008,
1021     );
1022     static FLAGS_EF_MIPS_ARCH: &[Flag<u32>] = &flags!(
1023         EF_MIPS_ARCH_1,
1024         EF_MIPS_ARCH_2,
1025         EF_MIPS_ARCH_3,
1026         EF_MIPS_ARCH_4,
1027         EF_MIPS_ARCH_5,
1028         EF_MIPS_ARCH_32,
1029         EF_MIPS_ARCH_64,
1030         EF_MIPS_ARCH_32R2,
1031         EF_MIPS_ARCH_64R2,
1032     );
1033     static FLAGS_EF_PARISC: &[Flag<u32>] = &flags!(
1034         EF_PARISC_TRAPNIL,
1035         EF_PARISC_EXT,
1036         EF_PARISC_LSB,
1037         EF_PARISC_WIDE,
1038         EF_PARISC_NO_KABP,
1039         EF_PARISC_LAZYSWAP,
1040     );
1041     static FLAGS_EF_PARISC_ARCH: &[Flag<u32>] =
1042         &flags!(EFA_PARISC_1_0, EFA_PARISC_1_1, EFA_PARISC_2_0);
1043     static FLAGS_EF_ALPHA: &[Flag<u32>] = &flags!(EF_ALPHA_32BIT, EF_ALPHA_CANRELAX);
1044     static FLAGS_EF_PPC: &[Flag<u32>] =
1045         &flags!(EF_PPC_EMB, EF_PPC_RELOCATABLE, EF_PPC_RELOCATABLE_LIB);
1046     static FLAGS_EF_PPC64: &[Flag<u32>] = &flags!(EF_PPC64_ABI);
1047     static FLAGS_EF_ARM: &[Flag<u32>] = &flags!(
1048         EF_ARM_RELEXEC,
1049         EF_ARM_HASENTRY,
1050         EF_ARM_INTERWORK,
1051         EF_ARM_APCS_26,
1052         EF_ARM_APCS_FLOAT,
1053         EF_ARM_PIC,
1054         EF_ARM_ALIGN8,
1055         EF_ARM_NEW_ABI,
1056         EF_ARM_OLD_ABI,
1057         EF_ARM_SOFT_FLOAT,
1058         EF_ARM_VFP_FLOAT,
1059         EF_ARM_MAVERICK_FLOAT,
1060         EF_ARM_BE8,
1061         EF_ARM_LE8,
1062     );
1063     static FLAGS_EF_ARM_EABI: &[Flag<u32>] = &flags!(
1064         EF_ARM_EABI_UNKNOWN,
1065         EF_ARM_EABI_VER1,
1066         EF_ARM_EABI_VER2,
1067         EF_ARM_EABI_VER3,
1068         EF_ARM_EABI_VER4,
1069         EF_ARM_EABI_VER5,
1070     );
1071     static FLAGS_EF_CSKY_ABI: &[Flag<u32>] = &flags!(EF_CSKY_ABIV1, EF_CSKY_ABIV2);
1072     static FLAGS_EF_IA_64: &[Flag<u32>] = &flags!(EF_IA_64_ABI64);
1073     static FLAGS_EF_SH_MACH: &[Flag<u32>] = &flags!(
1074         EF_SH_UNKNOWN,
1075         EF_SH1,
1076         EF_SH2,
1077         EF_SH3,
1078         EF_SH_DSP,
1079         EF_SH3_DSP,
1080         EF_SH4AL_DSP,
1081         EF_SH3E,
1082         EF_SH4,
1083         EF_SH2E,
1084         EF_SH4A,
1085         EF_SH2A,
1086         EF_SH4_NOFPU,
1087         EF_SH4A_NOFPU,
1088         EF_SH4_NOMMU_NOFPU,
1089         EF_SH2A_NOFPU,
1090         EF_SH3_NOMMU,
1091         EF_SH2A_SH4_NOFPU,
1092         EF_SH2A_SH3_NOFPU,
1093         EF_SH2A_SH4,
1094         EF_SH2A_SH3E,
1095     );
1096     static FLAGS_EF_S390: &[Flag<u32>] = &flags!(EF_S390_HIGH_GPRS);
1097     static FLAGS_EF_RISCV: &[Flag<u32>] = &flags!(EF_RISCV_RVC);
1098     static FLAGS_EF_RISCV_FLOAT_ABI: &[Flag<u32>] = &flags!(
1099         EF_RISCV_FLOAT_ABI_SOFT,
1100         EF_RISCV_FLOAT_ABI_SINGLE,
1101         EF_RISCV_FLOAT_ABI_DOUBLE,
1102         EF_RISCV_FLOAT_ABI_QUAD,
1103     );
1104     static FLAGS_PT: &[Flag<u32>] = &flags!(
1105         PT_NULL,
1106         PT_LOAD,
1107         PT_DYNAMIC,
1108         PT_INTERP,
1109         PT_NOTE,
1110         PT_SHLIB,
1111         PT_PHDR,
1112         PT_TLS,
1113         PT_LOOS,
1114         PT_GNU_EH_FRAME,
1115         PT_GNU_STACK,
1116         PT_GNU_RELRO,
1117     );
1118     static FLAGS_PT_HP: &[Flag<u32>] = &flags!(
1119         PT_HP_TLS,
1120         PT_HP_CORE_NONE,
1121         PT_HP_CORE_VERSION,
1122         PT_HP_CORE_KERNEL,
1123         PT_HP_CORE_COMM,
1124         PT_HP_CORE_PROC,
1125         PT_HP_CORE_LOADABLE,
1126         PT_HP_CORE_STACK,
1127         PT_HP_CORE_SHM,
1128         PT_HP_CORE_MMF,
1129         PT_HP_PARALLEL,
1130         PT_HP_FASTBIND,
1131         PT_HP_OPT_ANNOT,
1132         PT_HP_HSL_ANNOT,
1133         PT_HP_STACK,
1134     );
1135     static FLAGS_PT_MIPS: &[Flag<u32>] = &flags!(
1136         PT_MIPS_REGINFO,
1137         PT_MIPS_RTPROC,
1138         PT_MIPS_OPTIONS,
1139         PT_MIPS_ABIFLAGS,
1140     );
1141     static FLAGS_PT_PARISC: &[Flag<u32>] = &flags!(PT_PARISC_ARCHEXT, PT_PARISC_UNWIND);
1142     static FLAGS_PT_ARM: &[Flag<u32>] = &flags!(PT_ARM_EXIDX);
1143     static FLAGS_PT_IA_64: &[Flag<u32>] = &flags!(PT_IA_64_ARCHEXT, PT_IA_64_UNWIND);
1144     static FLAGS_PF: &[Flag<u32>] = &flags!(PF_X, PF_W, PF_R);
1145     static FLAGS_PF_HP: &[Flag<u32>] = &flags!(
1146         PF_HP_PAGE_SIZE,
1147         PF_HP_FAR_SHARED,
1148         PF_HP_NEAR_SHARED,
1149         PF_HP_CODE,
1150         PF_HP_MODIFY,
1151         PF_HP_LAZYSWAP,
1152         PF_HP_SBP,
1153     );
1154     static FLAGS_PF_MIPS: &[Flag<u32>] = &flags!(PF_MIPS_LOCAL);
1155     static FLAGS_PF_PARISC: &[Flag<u32>] = &flags!(PF_PARISC_SBP);
1156     static FLAGS_PF_ARM: &[Flag<u32>] = &flags!(PF_ARM_SB, PF_ARM_PI, PF_ARM_ABS);
1157     static FLAGS_PF_IA_64: &[Flag<u32>] = &flags!(PF_IA_64_NORECOV);
1158     static FLAGS_SHT: &[Flag<u32>] = &flags!(
1159         SHT_NULL,
1160         SHT_PROGBITS,
1161         SHT_SYMTAB,
1162         SHT_STRTAB,
1163         SHT_RELA,
1164         SHT_HASH,
1165         SHT_DYNAMIC,
1166         SHT_NOTE,
1167         SHT_NOBITS,
1168         SHT_REL,
1169         SHT_SHLIB,
1170         SHT_DYNSYM,
1171         SHT_INIT_ARRAY,
1172         SHT_FINI_ARRAY,
1173         SHT_PREINIT_ARRAY,
1174         SHT_GROUP,
1175         SHT_SYMTAB_SHNDX,
1176     );
1177     static FLAGS_SHT_MIPS: &[Flag<u32>] = &flags!(
1178         SHT_MIPS_LIBLIST,
1179         SHT_MIPS_MSYM,
1180         SHT_MIPS_CONFLICT,
1181         SHT_MIPS_GPTAB,
1182         SHT_MIPS_UCODE,
1183         SHT_MIPS_DEBUG,
1184         SHT_MIPS_REGINFO,
1185         SHT_MIPS_PACKAGE,
1186         SHT_MIPS_PACKSYM,
1187         SHT_MIPS_RELD,
1188         SHT_MIPS_IFACE,
1189         SHT_MIPS_CONTENT,
1190         SHT_MIPS_OPTIONS,
1191         SHT_MIPS_SHDR,
1192         SHT_MIPS_FDESC,
1193         SHT_MIPS_EXTSYM,
1194         SHT_MIPS_DENSE,
1195         SHT_MIPS_PDESC,
1196         SHT_MIPS_LOCSYM,
1197         SHT_MIPS_AUXSYM,
1198         SHT_MIPS_OPTSYM,
1199         SHT_MIPS_LOCSTR,
1200         SHT_MIPS_LINE,
1201         SHT_MIPS_RFDESC,
1202         SHT_MIPS_DELTASYM,
1203         SHT_MIPS_DELTAINST,
1204         SHT_MIPS_DELTACLASS,
1205         SHT_MIPS_DWARF,
1206         SHT_MIPS_DELTADECL,
1207         SHT_MIPS_SYMBOL_LIB,
1208         SHT_MIPS_EVENTS,
1209         SHT_MIPS_TRANSLATE,
1210         SHT_MIPS_PIXIE,
1211         SHT_MIPS_XLATE,
1212         SHT_MIPS_XLATE_DEBUG,
1213         SHT_MIPS_WHIRL,
1214         SHT_MIPS_EH_REGION,
1215         SHT_MIPS_XLATE_OLD,
1216         SHT_MIPS_PDR_EXCEPTION,
1217     );
1218     static FLAGS_SHT_PARISC: &[Flag<u32>] =
1219         &flags!(SHT_PARISC_EXT, SHT_PARISC_UNWIND, SHT_PARISC_DOC);
1220     static FLAGS_SHT_ALPHA: &[Flag<u32>] = &flags!(SHT_ALPHA_DEBUG, SHT_ALPHA_REGINFO);
1221     static FLAGS_SHT_ARM: &[Flag<u32>] =
1222         &flags!(SHT_ARM_EXIDX, SHT_ARM_PREEMPTMAP, SHT_ARM_ATTRIBUTES);
1223     static FLAGS_SHT_CSKY: &[Flag<u32>] = &flags!(SHT_CSKY_ATTRIBUTES);
1224     static FLAGS_SHT_IA_64: &[Flag<u32>] = &flags!(SHT_IA_64_EXT, SHT_IA_64_UNWIND);
1225     static FLAGS_SHT_X86_64: &[Flag<u32>] = &flags!(SHT_X86_64_UNWIND);
1226     static FLAGS_SHF: &[Flag<u32>] = &flags!(
1227         SHF_WRITE,
1228         SHF_ALLOC,
1229         SHF_EXECINSTR,
1230         SHF_MERGE,
1231         SHF_STRINGS,
1232         SHF_INFO_LINK,
1233         SHF_LINK_ORDER,
1234         SHF_OS_NONCONFORMING,
1235         SHF_GROUP,
1236         SHF_TLS,
1237         SHF_COMPRESSED,
1238     );
1239     static FLAGS_SHF_MIPS: &[Flag<u32>] = &flags!(
1240         SHF_MIPS_GPREL,
1241         SHF_MIPS_MERGE,
1242         SHF_MIPS_ADDR,
1243         SHF_MIPS_STRINGS,
1244         SHF_MIPS_NOSTRIP,
1245         SHF_MIPS_LOCAL,
1246         SHF_MIPS_NAMES,
1247         SHF_MIPS_NODUPE,
1248     );
1249     static FLAGS_SHF_PARISC: &[Flag<u32>] =
1250         &flags!(SHF_PARISC_SHORT, SHF_PARISC_HUGE, SHF_PARISC_SBP);
1251     static FLAGS_SHF_ALPHA: &[Flag<u32>] = &flags!(SHF_ALPHA_GPREL);
1252     static FLAGS_SHF_ARM: &[Flag<u32>] = &flags!(SHF_ARM_ENTRYSECT, SHF_ARM_COMDEF);
1253     static FLAGS_SHF_IA_64: &[Flag<u32>] = &flags!(SHF_IA_64_SHORT, SHF_IA_64_NORECOV);
1254     static FLAGS_STT: &[Flag<u8>] = &flags!(
1255         STT_NOTYPE,
1256         STT_OBJECT,
1257         STT_FUNC,
1258         STT_SECTION,
1259         STT_FILE,
1260         STT_COMMON,
1261         STT_TLS,
1262     );
1263     static FLAGS_STT_GNU: &[Flag<u8>] = &flags!(STT_GNU_IFUNC);
1264     static FLAGS_STT_HP: &[Flag<u8>] = &flags!(STT_HP_OPAQUE, STT_HP_STUB);
1265     static FLAGS_STT_SPARC: &[Flag<u8>] = &flags!(STT_SPARC_REGISTER);
1266     static FLAGS_STT_PARISC: &[Flag<u8>] = &flags!(STT_PARISC_MILLICODE);
1267     static FLAGS_STT_ARM: &[Flag<u8>] = &flags!(STT_ARM_TFUNC, STT_ARM_16BIT);
1268     static FLAGS_STB: &[Flag<u8>] = &flags!(STB_LOCAL, STB_GLOBAL, STB_WEAK);
1269     static FLAGS_STB_GNU: &[Flag<u8>] = &flags!(STB_GNU_UNIQUE);
1270     static FLAGS_STB_MIPS: &[Flag<u8>] = &flags!(STB_MIPS_SPLIT_COMMON);
1271     static FLAGS_STV: &[Flag<u8>] = &flags!(STV_DEFAULT, STV_INTERNAL, STV_HIDDEN, STV_PROTECTED);
1272     static FLAGS_STO_MIPS: &[Flag<u8>] = &flags!(STO_MIPS_PLT);
1273     static FLAGS_STO_ALPHA: &[Flag<u8>] = &flags!(STO_ALPHA_NOPV, STO_ALPHA_STD_GPLOAD);
1274     static FLAGS_SHN: &[Flag<u16>] = &flags!(SHN_UNDEF, SHN_ABS, SHN_COMMON, SHN_XINDEX);
1275     static FLAGS_SHN_MIPS: &[Flag<u16>] = &flags!(
1276         SHN_MIPS_ACOMMON,
1277         SHN_MIPS_TEXT,
1278         SHN_MIPS_DATA,
1279         SHN_MIPS_SCOMMON,
1280         SHN_MIPS_SUNDEFINED,
1281     );
1282     static FLAGS_SHN_PARISC: &[Flag<u16>] = &flags!(SHN_PARISC_ANSI_COMMON, SHN_PARISC_HUGE_COMMON);
1283     static FLAGS_R_68K: &[Flag<u32>] = &flags!(
1284         R_68K_NONE,
1285         R_68K_32,
1286         R_68K_16,
1287         R_68K_8,
1288         R_68K_PC32,
1289         R_68K_PC16,
1290         R_68K_PC8,
1291         R_68K_GOT32,
1292         R_68K_GOT16,
1293         R_68K_GOT8,
1294         R_68K_GOT32O,
1295         R_68K_GOT16O,
1296         R_68K_GOT8O,
1297         R_68K_PLT32,
1298         R_68K_PLT16,
1299         R_68K_PLT8,
1300         R_68K_PLT32O,
1301         R_68K_PLT16O,
1302         R_68K_PLT8O,
1303         R_68K_COPY,
1304         R_68K_GLOB_DAT,
1305         R_68K_JMP_SLOT,
1306         R_68K_RELATIVE,
1307         R_68K_TLS_GD32,
1308         R_68K_TLS_GD16,
1309         R_68K_TLS_GD8,
1310         R_68K_TLS_LDM32,
1311         R_68K_TLS_LDM16,
1312         R_68K_TLS_LDM8,
1313         R_68K_TLS_LDO32,
1314         R_68K_TLS_LDO16,
1315         R_68K_TLS_LDO8,
1316         R_68K_TLS_IE32,
1317         R_68K_TLS_IE16,
1318         R_68K_TLS_IE8,
1319         R_68K_TLS_LE32,
1320         R_68K_TLS_LE16,
1321         R_68K_TLS_LE8,
1322         R_68K_TLS_DTPMOD32,
1323         R_68K_TLS_DTPREL32,
1324         R_68K_TLS_TPREL32,
1325     );
1326     static FLAGS_R_386: &[Flag<u32>] = &flags!(
1327         R_386_NONE,
1328         R_386_32,
1329         R_386_PC32,
1330         R_386_GOT32,
1331         R_386_PLT32,
1332         R_386_COPY,
1333         R_386_GLOB_DAT,
1334         R_386_JMP_SLOT,
1335         R_386_RELATIVE,
1336         R_386_GOTOFF,
1337         R_386_GOTPC,
1338         R_386_32PLT,
1339         R_386_TLS_TPOFF,
1340         R_386_TLS_IE,
1341         R_386_TLS_GOTIE,
1342         R_386_TLS_LE,
1343         R_386_TLS_GD,
1344         R_386_TLS_LDM,
1345         R_386_16,
1346         R_386_PC16,
1347         R_386_8,
1348         R_386_PC8,
1349         R_386_TLS_GD_32,
1350         R_386_TLS_GD_PUSH,
1351         R_386_TLS_GD_CALL,
1352         R_386_TLS_GD_POP,
1353         R_386_TLS_LDM_32,
1354         R_386_TLS_LDM_PUSH,
1355         R_386_TLS_LDM_CALL,
1356         R_386_TLS_LDM_POP,
1357         R_386_TLS_LDO_32,
1358         R_386_TLS_IE_32,
1359         R_386_TLS_LE_32,
1360         R_386_TLS_DTPMOD32,
1361         R_386_TLS_DTPOFF32,
1362         R_386_TLS_TPOFF32,
1363         R_386_SIZE32,
1364         R_386_TLS_GOTDESC,
1365         R_386_TLS_DESC_CALL,
1366         R_386_TLS_DESC,
1367         R_386_IRELATIVE,
1368         R_386_GOT32X,
1369     );
1370     static FLAGS_R_SPARC: &[Flag<u32>] = &flags!(
1371         R_SPARC_NONE,
1372         R_SPARC_8,
1373         R_SPARC_16,
1374         R_SPARC_32,
1375         R_SPARC_DISP8,
1376         R_SPARC_DISP16,
1377         R_SPARC_DISP32,
1378         R_SPARC_WDISP30,
1379         R_SPARC_WDISP22,
1380         R_SPARC_HI22,
1381         R_SPARC_22,
1382         R_SPARC_13,
1383         R_SPARC_LO10,
1384         R_SPARC_GOT10,
1385         R_SPARC_GOT13,
1386         R_SPARC_GOT22,
1387         R_SPARC_PC10,
1388         R_SPARC_PC22,
1389         R_SPARC_WPLT30,
1390         R_SPARC_COPY,
1391         R_SPARC_GLOB_DAT,
1392         R_SPARC_JMP_SLOT,
1393         R_SPARC_RELATIVE,
1394         R_SPARC_UA32,
1395         R_SPARC_PLT32,
1396         R_SPARC_HIPLT22,
1397         R_SPARC_LOPLT10,
1398         R_SPARC_PCPLT32,
1399         R_SPARC_PCPLT22,
1400         R_SPARC_PCPLT10,
1401         R_SPARC_10,
1402         R_SPARC_11,
1403         R_SPARC_64,
1404         R_SPARC_OLO10,
1405         R_SPARC_HH22,
1406         R_SPARC_HM10,
1407         R_SPARC_LM22,
1408         R_SPARC_PC_HH22,
1409         R_SPARC_PC_HM10,
1410         R_SPARC_PC_LM22,
1411         R_SPARC_WDISP16,
1412         R_SPARC_WDISP19,
1413         R_SPARC_GLOB_JMP,
1414         R_SPARC_7,
1415         R_SPARC_5,
1416         R_SPARC_6,
1417         R_SPARC_DISP64,
1418         R_SPARC_PLT64,
1419         R_SPARC_HIX22,
1420         R_SPARC_LOX10,
1421         R_SPARC_H44,
1422         R_SPARC_M44,
1423         R_SPARC_L44,
1424         R_SPARC_REGISTER,
1425         R_SPARC_UA64,
1426         R_SPARC_UA16,
1427         R_SPARC_TLS_GD_HI22,
1428         R_SPARC_TLS_GD_LO10,
1429         R_SPARC_TLS_GD_ADD,
1430         R_SPARC_TLS_GD_CALL,
1431         R_SPARC_TLS_LDM_HI22,
1432         R_SPARC_TLS_LDM_LO10,
1433         R_SPARC_TLS_LDM_ADD,
1434         R_SPARC_TLS_LDM_CALL,
1435         R_SPARC_TLS_LDO_HIX22,
1436         R_SPARC_TLS_LDO_LOX10,
1437         R_SPARC_TLS_LDO_ADD,
1438         R_SPARC_TLS_IE_HI22,
1439         R_SPARC_TLS_IE_LO10,
1440         R_SPARC_TLS_IE_LD,
1441         R_SPARC_TLS_IE_LDX,
1442         R_SPARC_TLS_IE_ADD,
1443         R_SPARC_TLS_LE_HIX22,
1444         R_SPARC_TLS_LE_LOX10,
1445         R_SPARC_TLS_DTPMOD32,
1446         R_SPARC_TLS_DTPMOD64,
1447         R_SPARC_TLS_DTPOFF32,
1448         R_SPARC_TLS_DTPOFF64,
1449         R_SPARC_TLS_TPOFF32,
1450         R_SPARC_TLS_TPOFF64,
1451         R_SPARC_GOTDATA_HIX22,
1452         R_SPARC_GOTDATA_LOX10,
1453         R_SPARC_GOTDATA_OP_HIX22,
1454         R_SPARC_GOTDATA_OP_LOX10,
1455         R_SPARC_GOTDATA_OP,
1456         R_SPARC_H34,
1457         R_SPARC_SIZE32,
1458         R_SPARC_SIZE64,
1459         R_SPARC_WDISP10,
1460         R_SPARC_JMP_IREL,
1461         R_SPARC_IRELATIVE,
1462         R_SPARC_GNU_VTINHERIT,
1463         R_SPARC_GNU_VTENTRY,
1464         R_SPARC_REV32,
1465     );
1466     static FLAGS_R_MIPS: &[Flag<u32>] = &flags!(
1467         R_MIPS_NONE,
1468         R_MIPS_16,
1469         R_MIPS_32,
1470         R_MIPS_REL32,
1471         R_MIPS_26,
1472         R_MIPS_HI16,
1473         R_MIPS_LO16,
1474         R_MIPS_GPREL16,
1475         R_MIPS_LITERAL,
1476         R_MIPS_GOT16,
1477         R_MIPS_PC16,
1478         R_MIPS_CALL16,
1479         R_MIPS_GPREL32,
1480         R_MIPS_SHIFT5,
1481         R_MIPS_SHIFT6,
1482         R_MIPS_64,
1483         R_MIPS_GOT_DISP,
1484         R_MIPS_GOT_PAGE,
1485         R_MIPS_GOT_OFST,
1486         R_MIPS_GOT_HI16,
1487         R_MIPS_GOT_LO16,
1488         R_MIPS_SUB,
1489         R_MIPS_INSERT_A,
1490         R_MIPS_INSERT_B,
1491         R_MIPS_DELETE,
1492         R_MIPS_HIGHER,
1493         R_MIPS_HIGHEST,
1494         R_MIPS_CALL_HI16,
1495         R_MIPS_CALL_LO16,
1496         R_MIPS_SCN_DISP,
1497         R_MIPS_REL16,
1498         R_MIPS_ADD_IMMEDIATE,
1499         R_MIPS_PJUMP,
1500         R_MIPS_RELGOT,
1501         R_MIPS_JALR,
1502         R_MIPS_TLS_DTPMOD32,
1503         R_MIPS_TLS_DTPREL32,
1504         R_MIPS_TLS_DTPMOD64,
1505         R_MIPS_TLS_DTPREL64,
1506         R_MIPS_TLS_GD,
1507         R_MIPS_TLS_LDM,
1508         R_MIPS_TLS_DTPREL_HI16,
1509         R_MIPS_TLS_DTPREL_LO16,
1510         R_MIPS_TLS_GOTTPREL,
1511         R_MIPS_TLS_TPREL32,
1512         R_MIPS_TLS_TPREL64,
1513         R_MIPS_TLS_TPREL_HI16,
1514         R_MIPS_TLS_TPREL_LO16,
1515         R_MIPS_GLOB_DAT,
1516         R_MIPS_COPY,
1517         R_MIPS_JUMP_SLOT,
1518     );
1519     static FLAGS_R_PARISC: &[Flag<u32>] = &flags!(
1520         R_PARISC_NONE,
1521         R_PARISC_DIR32,
1522         R_PARISC_DIR21L,
1523         R_PARISC_DIR17R,
1524         R_PARISC_DIR17F,
1525         R_PARISC_DIR14R,
1526         R_PARISC_PCREL32,
1527         R_PARISC_PCREL21L,
1528         R_PARISC_PCREL17R,
1529         R_PARISC_PCREL17F,
1530         R_PARISC_PCREL14R,
1531         R_PARISC_DPREL21L,
1532         R_PARISC_DPREL14R,
1533         R_PARISC_GPREL21L,
1534         R_PARISC_GPREL14R,
1535         R_PARISC_LTOFF21L,
1536         R_PARISC_LTOFF14R,
1537         R_PARISC_SECREL32,
1538         R_PARISC_SEGBASE,
1539         R_PARISC_SEGREL32,
1540         R_PARISC_PLTOFF21L,
1541         R_PARISC_PLTOFF14R,
1542         R_PARISC_LTOFF_FPTR32,
1543         R_PARISC_LTOFF_FPTR21L,
1544         R_PARISC_LTOFF_FPTR14R,
1545         R_PARISC_FPTR64,
1546         R_PARISC_PLABEL32,
1547         R_PARISC_PLABEL21L,
1548         R_PARISC_PLABEL14R,
1549         R_PARISC_PCREL64,
1550         R_PARISC_PCREL22F,
1551         R_PARISC_PCREL14WR,
1552         R_PARISC_PCREL14DR,
1553         R_PARISC_PCREL16F,
1554         R_PARISC_PCREL16WF,
1555         R_PARISC_PCREL16DF,
1556         R_PARISC_DIR64,
1557         R_PARISC_DIR14WR,
1558         R_PARISC_DIR14DR,
1559         R_PARISC_DIR16F,
1560         R_PARISC_DIR16WF,
1561         R_PARISC_DIR16DF,
1562         R_PARISC_GPREL64,
1563         R_PARISC_GPREL14WR,
1564         R_PARISC_GPREL14DR,
1565         R_PARISC_GPREL16F,
1566         R_PARISC_GPREL16WF,
1567         R_PARISC_GPREL16DF,
1568         R_PARISC_LTOFF64,
1569         R_PARISC_LTOFF14WR,
1570         R_PARISC_LTOFF14DR,
1571         R_PARISC_LTOFF16F,
1572         R_PARISC_LTOFF16WF,
1573         R_PARISC_LTOFF16DF,
1574         R_PARISC_SECREL64,
1575         R_PARISC_SEGREL64,
1576         R_PARISC_PLTOFF14WR,
1577         R_PARISC_PLTOFF14DR,
1578         R_PARISC_PLTOFF16F,
1579         R_PARISC_PLTOFF16WF,
1580         R_PARISC_PLTOFF16DF,
1581         R_PARISC_LTOFF_FPTR64,
1582         R_PARISC_LTOFF_FPTR14WR,
1583         R_PARISC_LTOFF_FPTR14DR,
1584         R_PARISC_LTOFF_FPTR16F,
1585         R_PARISC_LTOFF_FPTR16WF,
1586         R_PARISC_LTOFF_FPTR16DF,
1587         R_PARISC_COPY,
1588         R_PARISC_IPLT,
1589         R_PARISC_EPLT,
1590         R_PARISC_TPREL32,
1591         R_PARISC_TPREL21L,
1592         R_PARISC_TPREL14R,
1593         R_PARISC_LTOFF_TP21L,
1594         R_PARISC_LTOFF_TP14R,
1595         R_PARISC_LTOFF_TP14F,
1596         R_PARISC_TPREL64,
1597         R_PARISC_TPREL14WR,
1598         R_PARISC_TPREL14DR,
1599         R_PARISC_TPREL16F,
1600         R_PARISC_TPREL16WF,
1601         R_PARISC_TPREL16DF,
1602         R_PARISC_LTOFF_TP64,
1603         R_PARISC_LTOFF_TP14WR,
1604         R_PARISC_LTOFF_TP14DR,
1605         R_PARISC_LTOFF_TP16F,
1606         R_PARISC_LTOFF_TP16WF,
1607         R_PARISC_LTOFF_TP16DF,
1608         R_PARISC_GNU_VTENTRY,
1609         R_PARISC_GNU_VTINHERIT,
1610         R_PARISC_TLS_GD21L,
1611         R_PARISC_TLS_GD14R,
1612         R_PARISC_TLS_GDCALL,
1613         R_PARISC_TLS_LDM21L,
1614         R_PARISC_TLS_LDM14R,
1615         R_PARISC_TLS_LDMCALL,
1616         R_PARISC_TLS_LDO21L,
1617         R_PARISC_TLS_LDO14R,
1618         R_PARISC_TLS_DTPMOD32,
1619         R_PARISC_TLS_DTPMOD64,
1620         R_PARISC_TLS_DTPOFF32,
1621         R_PARISC_TLS_DTPOFF64,
1622         R_PARISC_TLS_LE21L,
1623         R_PARISC_TLS_LE14R,
1624         R_PARISC_TLS_IE21L,
1625         R_PARISC_TLS_IE14R,
1626         R_PARISC_TLS_TPREL32,
1627         R_PARISC_TLS_TPREL64,
1628     );
1629     static FLAGS_R_ALPHA: &[Flag<u32>] = &flags!(
1630         R_ALPHA_NONE,
1631         R_ALPHA_REFLONG,
1632         R_ALPHA_REFQUAD,
1633         R_ALPHA_GPREL32,
1634         R_ALPHA_LITERAL,
1635         R_ALPHA_LITUSE,
1636         R_ALPHA_GPDISP,
1637         R_ALPHA_BRADDR,
1638         R_ALPHA_HINT,
1639         R_ALPHA_SREL16,
1640         R_ALPHA_SREL32,
1641         R_ALPHA_SREL64,
1642         R_ALPHA_GPRELHIGH,
1643         R_ALPHA_GPRELLOW,
1644         R_ALPHA_GPREL16,
1645         R_ALPHA_COPY,
1646         R_ALPHA_GLOB_DAT,
1647         R_ALPHA_JMP_SLOT,
1648         R_ALPHA_RELATIVE,
1649         R_ALPHA_TLS_GD_HI,
1650         R_ALPHA_TLSGD,
1651         R_ALPHA_TLS_LDM,
1652         R_ALPHA_DTPMOD64,
1653         R_ALPHA_GOTDTPREL,
1654         R_ALPHA_DTPREL64,
1655         R_ALPHA_DTPRELHI,
1656         R_ALPHA_DTPRELLO,
1657         R_ALPHA_DTPREL16,
1658         R_ALPHA_GOTTPREL,
1659         R_ALPHA_TPREL64,
1660         R_ALPHA_TPRELHI,
1661         R_ALPHA_TPRELLO,
1662         R_ALPHA_TPREL16,
1663     );
1664     static FLAGS_R_PPC: &[Flag<u32>] = &flags!(
1665         R_PPC_NONE,
1666         R_PPC_ADDR32,
1667         R_PPC_ADDR24,
1668         R_PPC_ADDR16,
1669         R_PPC_ADDR16_LO,
1670         R_PPC_ADDR16_HI,
1671         R_PPC_ADDR16_HA,
1672         R_PPC_ADDR14,
1673         R_PPC_ADDR14_BRTAKEN,
1674         R_PPC_ADDR14_BRNTAKEN,
1675         R_PPC_REL24,
1676         R_PPC_REL14,
1677         R_PPC_REL14_BRTAKEN,
1678         R_PPC_REL14_BRNTAKEN,
1679         R_PPC_GOT16,
1680         R_PPC_GOT16_LO,
1681         R_PPC_GOT16_HI,
1682         R_PPC_GOT16_HA,
1683         R_PPC_PLTREL24,
1684         R_PPC_COPY,
1685         R_PPC_GLOB_DAT,
1686         R_PPC_JMP_SLOT,
1687         R_PPC_RELATIVE,
1688         R_PPC_LOCAL24PC,
1689         R_PPC_UADDR32,
1690         R_PPC_UADDR16,
1691         R_PPC_REL32,
1692         R_PPC_PLT32,
1693         R_PPC_PLTREL32,
1694         R_PPC_PLT16_LO,
1695         R_PPC_PLT16_HI,
1696         R_PPC_PLT16_HA,
1697         R_PPC_SDAREL16,
1698         R_PPC_SECTOFF,
1699         R_PPC_SECTOFF_LO,
1700         R_PPC_SECTOFF_HI,
1701         R_PPC_SECTOFF_HA,
1702         R_PPC_TLS,
1703         R_PPC_DTPMOD32,
1704         R_PPC_TPREL16,
1705         R_PPC_TPREL16_LO,
1706         R_PPC_TPREL16_HI,
1707         R_PPC_TPREL16_HA,
1708         R_PPC_TPREL32,
1709         R_PPC_DTPREL16,
1710         R_PPC_DTPREL16_LO,
1711         R_PPC_DTPREL16_HI,
1712         R_PPC_DTPREL16_HA,
1713         R_PPC_DTPREL32,
1714         R_PPC_GOT_TLSGD16,
1715         R_PPC_GOT_TLSGD16_LO,
1716         R_PPC_GOT_TLSGD16_HI,
1717         R_PPC_GOT_TLSGD16_HA,
1718         R_PPC_GOT_TLSLD16,
1719         R_PPC_GOT_TLSLD16_LO,
1720         R_PPC_GOT_TLSLD16_HI,
1721         R_PPC_GOT_TLSLD16_HA,
1722         R_PPC_GOT_TPREL16,
1723         R_PPC_GOT_TPREL16_LO,
1724         R_PPC_GOT_TPREL16_HI,
1725         R_PPC_GOT_TPREL16_HA,
1726         R_PPC_GOT_DTPREL16,
1727         R_PPC_GOT_DTPREL16_LO,
1728         R_PPC_GOT_DTPREL16_HI,
1729         R_PPC_GOT_DTPREL16_HA,
1730         R_PPC_TLSGD,
1731         R_PPC_TLSLD,
1732         R_PPC_EMB_NADDR32,
1733         R_PPC_EMB_NADDR16,
1734         R_PPC_EMB_NADDR16_LO,
1735         R_PPC_EMB_NADDR16_HI,
1736         R_PPC_EMB_NADDR16_HA,
1737         R_PPC_EMB_SDAI16,
1738         R_PPC_EMB_SDA2I16,
1739         R_PPC_EMB_SDA2REL,
1740         R_PPC_EMB_SDA21,
1741         R_PPC_EMB_MRKREF,
1742         R_PPC_EMB_RELSEC16,
1743         R_PPC_EMB_RELST_LO,
1744         R_PPC_EMB_RELST_HI,
1745         R_PPC_EMB_RELST_HA,
1746         R_PPC_EMB_BIT_FLD,
1747         R_PPC_EMB_RELSDA,
1748         R_PPC_DIAB_SDA21_LO,
1749         R_PPC_DIAB_SDA21_HI,
1750         R_PPC_DIAB_SDA21_HA,
1751         R_PPC_DIAB_RELSDA_LO,
1752         R_PPC_DIAB_RELSDA_HI,
1753         R_PPC_DIAB_RELSDA_HA,
1754         R_PPC_IRELATIVE,
1755         R_PPC_REL16,
1756         R_PPC_REL16_LO,
1757         R_PPC_REL16_HI,
1758         R_PPC_REL16_HA,
1759         R_PPC_TOC16,
1760     );
1761     static FLAGS_R_PPC64: &[Flag<u32>] = &flags!(
1762         R_PPC64_NONE,
1763         R_PPC64_ADDR32,
1764         R_PPC64_ADDR24,
1765         R_PPC64_ADDR16,
1766         R_PPC64_ADDR16_LO,
1767         R_PPC64_ADDR16_HI,
1768         R_PPC64_ADDR16_HA,
1769         R_PPC64_ADDR14,
1770         R_PPC64_ADDR14_BRTAKEN,
1771         R_PPC64_ADDR14_BRNTAKEN,
1772         R_PPC64_REL24,
1773         R_PPC64_REL14,
1774         R_PPC64_REL14_BRTAKEN,
1775         R_PPC64_REL14_BRNTAKEN,
1776         R_PPC64_GOT16,
1777         R_PPC64_GOT16_LO,
1778         R_PPC64_GOT16_HI,
1779         R_PPC64_GOT16_HA,
1780         R_PPC64_COPY,
1781         R_PPC64_GLOB_DAT,
1782         R_PPC64_JMP_SLOT,
1783         R_PPC64_RELATIVE,
1784         R_PPC64_UADDR32,
1785         R_PPC64_UADDR16,
1786         R_PPC64_REL32,
1787         R_PPC64_PLT32,
1788         R_PPC64_PLTREL32,
1789         R_PPC64_PLT16_LO,
1790         R_PPC64_PLT16_HI,
1791         R_PPC64_PLT16_HA,
1792         R_PPC64_SECTOFF,
1793         R_PPC64_SECTOFF_LO,
1794         R_PPC64_SECTOFF_HI,
1795         R_PPC64_SECTOFF_HA,
1796         R_PPC64_ADDR30,
1797         R_PPC64_ADDR64,
1798         R_PPC64_ADDR16_HIGHER,
1799         R_PPC64_ADDR16_HIGHERA,
1800         R_PPC64_ADDR16_HIGHEST,
1801         R_PPC64_ADDR16_HIGHESTA,
1802         R_PPC64_UADDR64,
1803         R_PPC64_REL64,
1804         R_PPC64_PLT64,
1805         R_PPC64_PLTREL64,
1806         R_PPC64_TOC16,
1807         R_PPC64_TOC16_LO,
1808         R_PPC64_TOC16_HI,
1809         R_PPC64_TOC16_HA,
1810         R_PPC64_TOC,
1811         R_PPC64_PLTGOT16,
1812         R_PPC64_PLTGOT16_LO,
1813         R_PPC64_PLTGOT16_HI,
1814         R_PPC64_PLTGOT16_HA,
1815         R_PPC64_ADDR16_DS,
1816         R_PPC64_ADDR16_LO_DS,
1817         R_PPC64_GOT16_DS,
1818         R_PPC64_GOT16_LO_DS,
1819         R_PPC64_PLT16_LO_DS,
1820         R_PPC64_SECTOFF_DS,
1821         R_PPC64_SECTOFF_LO_DS,
1822         R_PPC64_TOC16_DS,
1823         R_PPC64_TOC16_LO_DS,
1824         R_PPC64_PLTGOT16_DS,
1825         R_PPC64_PLTGOT16_LO_DS,
1826         R_PPC64_TLS,
1827         R_PPC64_DTPMOD64,
1828         R_PPC64_TPREL16,
1829         R_PPC64_TPREL16_LO,
1830         R_PPC64_TPREL16_HI,
1831         R_PPC64_TPREL16_HA,
1832         R_PPC64_TPREL64,
1833         R_PPC64_DTPREL16,
1834         R_PPC64_DTPREL16_LO,
1835         R_PPC64_DTPREL16_HI,
1836         R_PPC64_DTPREL16_HA,
1837         R_PPC64_DTPREL64,
1838         R_PPC64_GOT_TLSGD16,
1839         R_PPC64_GOT_TLSGD16_LO,
1840         R_PPC64_GOT_TLSGD16_HI,
1841         R_PPC64_GOT_TLSGD16_HA,
1842         R_PPC64_GOT_TLSLD16,
1843         R_PPC64_GOT_TLSLD16_LO,
1844         R_PPC64_GOT_TLSLD16_HI,
1845         R_PPC64_GOT_TLSLD16_HA,
1846         R_PPC64_GOT_TPREL16_DS,
1847         R_PPC64_GOT_TPREL16_LO_DS,
1848         R_PPC64_GOT_TPREL16_HI,
1849         R_PPC64_GOT_TPREL16_HA,
1850         R_PPC64_GOT_DTPREL16_DS,
1851         R_PPC64_GOT_DTPREL16_LO_DS,
1852         R_PPC64_GOT_DTPREL16_HI,
1853         R_PPC64_GOT_DTPREL16_HA,
1854         R_PPC64_TPREL16_DS,
1855         R_PPC64_TPREL16_LO_DS,
1856         R_PPC64_TPREL16_HIGHER,
1857         R_PPC64_TPREL16_HIGHERA,
1858         R_PPC64_TPREL16_HIGHEST,
1859         R_PPC64_TPREL16_HIGHESTA,
1860         R_PPC64_DTPREL16_DS,
1861         R_PPC64_DTPREL16_LO_DS,
1862         R_PPC64_DTPREL16_HIGHER,
1863         R_PPC64_DTPREL16_HIGHERA,
1864         R_PPC64_DTPREL16_HIGHEST,
1865         R_PPC64_DTPREL16_HIGHESTA,
1866         R_PPC64_TLSGD,
1867         R_PPC64_TLSLD,
1868         R_PPC64_TOCSAVE,
1869         R_PPC64_ADDR16_HIGH,
1870         R_PPC64_ADDR16_HIGHA,
1871         R_PPC64_TPREL16_HIGH,
1872         R_PPC64_TPREL16_HIGHA,
1873         R_PPC64_DTPREL16_HIGH,
1874         R_PPC64_DTPREL16_HIGHA,
1875         R_PPC64_JMP_IREL,
1876         R_PPC64_IRELATIVE,
1877         R_PPC64_REL16,
1878         R_PPC64_REL16_LO,
1879         R_PPC64_REL16_HI,
1880         R_PPC64_REL16_HA,
1881     );
1882     static FLAGS_R_AARCH64: &[Flag<u32>] = &flags!(
1883         R_AARCH64_NONE,
1884         R_AARCH64_P32_ABS32,
1885         R_AARCH64_P32_COPY,
1886         R_AARCH64_P32_GLOB_DAT,
1887         R_AARCH64_P32_JUMP_SLOT,
1888         R_AARCH64_P32_RELATIVE,
1889         R_AARCH64_P32_TLS_DTPMOD,
1890         R_AARCH64_P32_TLS_DTPREL,
1891         R_AARCH64_P32_TLS_TPREL,
1892         R_AARCH64_P32_TLSDESC,
1893         R_AARCH64_P32_IRELATIVE,
1894         R_AARCH64_ABS64,
1895         R_AARCH64_ABS32,
1896         R_AARCH64_ABS16,
1897         R_AARCH64_PREL64,
1898         R_AARCH64_PREL32,
1899         R_AARCH64_PREL16,
1900         R_AARCH64_MOVW_UABS_G0,
1901         R_AARCH64_MOVW_UABS_G0_NC,
1902         R_AARCH64_MOVW_UABS_G1,
1903         R_AARCH64_MOVW_UABS_G1_NC,
1904         R_AARCH64_MOVW_UABS_G2,
1905         R_AARCH64_MOVW_UABS_G2_NC,
1906         R_AARCH64_MOVW_UABS_G3,
1907         R_AARCH64_MOVW_SABS_G0,
1908         R_AARCH64_MOVW_SABS_G1,
1909         R_AARCH64_MOVW_SABS_G2,
1910         R_AARCH64_LD_PREL_LO19,
1911         R_AARCH64_ADR_PREL_LO21,
1912         R_AARCH64_ADR_PREL_PG_HI21,
1913         R_AARCH64_ADR_PREL_PG_HI21_NC,
1914         R_AARCH64_ADD_ABS_LO12_NC,
1915         R_AARCH64_LDST8_ABS_LO12_NC,
1916         R_AARCH64_TSTBR14,
1917         R_AARCH64_CONDBR19,
1918         R_AARCH64_JUMP26,
1919         R_AARCH64_CALL26,
1920         R_AARCH64_LDST16_ABS_LO12_NC,
1921         R_AARCH64_LDST32_ABS_LO12_NC,
1922         R_AARCH64_LDST64_ABS_LO12_NC,
1923         R_AARCH64_MOVW_PREL_G0,
1924         R_AARCH64_MOVW_PREL_G0_NC,
1925         R_AARCH64_MOVW_PREL_G1,
1926         R_AARCH64_MOVW_PREL_G1_NC,
1927         R_AARCH64_MOVW_PREL_G2,
1928         R_AARCH64_MOVW_PREL_G2_NC,
1929         R_AARCH64_MOVW_PREL_G3,
1930         R_AARCH64_LDST128_ABS_LO12_NC,
1931         R_AARCH64_MOVW_GOTOFF_G0,
1932         R_AARCH64_MOVW_GOTOFF_G0_NC,
1933         R_AARCH64_MOVW_GOTOFF_G1,
1934         R_AARCH64_MOVW_GOTOFF_G1_NC,
1935         R_AARCH64_MOVW_GOTOFF_G2,
1936         R_AARCH64_MOVW_GOTOFF_G2_NC,
1937         R_AARCH64_MOVW_GOTOFF_G3,
1938         R_AARCH64_GOTREL64,
1939         R_AARCH64_GOTREL32,
1940         R_AARCH64_GOT_LD_PREL19,
1941         R_AARCH64_LD64_GOTOFF_LO15,
1942         R_AARCH64_ADR_GOT_PAGE,
1943         R_AARCH64_LD64_GOT_LO12_NC,
1944         R_AARCH64_LD64_GOTPAGE_LO15,
1945         R_AARCH64_TLSGD_ADR_PREL21,
1946         R_AARCH64_TLSGD_ADR_PAGE21,
1947         R_AARCH64_TLSGD_ADD_LO12_NC,
1948         R_AARCH64_TLSGD_MOVW_G1,
1949         R_AARCH64_TLSGD_MOVW_G0_NC,
1950         R_AARCH64_TLSLD_ADR_PREL21,
1951         R_AARCH64_TLSLD_ADR_PAGE21,
1952         R_AARCH64_TLSLD_ADD_LO12_NC,
1953         R_AARCH64_TLSLD_MOVW_G1,
1954         R_AARCH64_TLSLD_MOVW_G0_NC,
1955         R_AARCH64_TLSLD_LD_PREL19,
1956         R_AARCH64_TLSLD_MOVW_DTPREL_G2,
1957         R_AARCH64_TLSLD_MOVW_DTPREL_G1,
1958         R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC,
1959         R_AARCH64_TLSLD_MOVW_DTPREL_G0,
1960         R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC,
1961         R_AARCH64_TLSLD_ADD_DTPREL_HI12,
1962         R_AARCH64_TLSLD_ADD_DTPREL_LO12,
1963         R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC,
1964         R_AARCH64_TLSLD_LDST8_DTPREL_LO12,
1965         R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC,
1966         R_AARCH64_TLSLD_LDST16_DTPREL_LO12,
1967         R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC,
1968         R_AARCH64_TLSLD_LDST32_DTPREL_LO12,
1969         R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC,
1970         R_AARCH64_TLSLD_LDST64_DTPREL_LO12,
1971         R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC,
1972         R_AARCH64_TLSIE_MOVW_GOTTPREL_G1,
1973         R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC,
1974         R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21,
1975         R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC,
1976         R_AARCH64_TLSIE_LD_GOTTPREL_PREL19,
1977         R_AARCH64_TLSLE_MOVW_TPREL_G2,
1978         R_AARCH64_TLSLE_MOVW_TPREL_G1,
1979         R_AARCH64_TLSLE_MOVW_TPREL_G1_NC,
1980         R_AARCH64_TLSLE_MOVW_TPREL_G0,
1981         R_AARCH64_TLSLE_MOVW_TPREL_G0_NC,
1982         R_AARCH64_TLSLE_ADD_TPREL_HI12,
1983         R_AARCH64_TLSLE_ADD_TPREL_LO12,
1984         R_AARCH64_TLSLE_ADD_TPREL_LO12_NC,
1985         R_AARCH64_TLSLE_LDST8_TPREL_LO12,
1986         R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC,
1987         R_AARCH64_TLSLE_LDST16_TPREL_LO12,
1988         R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC,
1989         R_AARCH64_TLSLE_LDST32_TPREL_LO12,
1990         R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC,
1991         R_AARCH64_TLSLE_LDST64_TPREL_LO12,
1992         R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC,
1993         R_AARCH64_TLSDESC_LD_PREL19,
1994         R_AARCH64_TLSDESC_ADR_PREL21,
1995         R_AARCH64_TLSDESC_ADR_PAGE21,
1996         R_AARCH64_TLSDESC_LD64_LO12,
1997         R_AARCH64_TLSDESC_ADD_LO12,
1998         R_AARCH64_TLSDESC_OFF_G1,
1999         R_AARCH64_TLSDESC_OFF_G0_NC,
2000         R_AARCH64_TLSDESC_LDR,
2001         R_AARCH64_TLSDESC_ADD,
2002         R_AARCH64_TLSDESC_CALL,
2003         R_AARCH64_TLSLE_LDST128_TPREL_LO12,
2004         R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC,
2005         R_AARCH64_TLSLD_LDST128_DTPREL_LO12,
2006         R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC,
2007         R_AARCH64_COPY,
2008         R_AARCH64_GLOB_DAT,
2009         R_AARCH64_JUMP_SLOT,
2010         R_AARCH64_RELATIVE,
2011         R_AARCH64_TLS_DTPMOD,
2012         R_AARCH64_TLS_DTPREL,
2013         R_AARCH64_TLS_TPREL,
2014         R_AARCH64_TLSDESC,
2015         R_AARCH64_IRELATIVE,
2016     );
2017     static FLAGS_R_ARM: &[Flag<u32>] = &flags!(
2018         R_ARM_NONE,
2019         R_ARM_PC24,
2020         R_ARM_ABS32,
2021         R_ARM_REL32,
2022         R_ARM_PC13,
2023         R_ARM_ABS16,
2024         R_ARM_ABS12,
2025         R_ARM_THM_ABS5,
2026         R_ARM_ABS8,
2027         R_ARM_SBREL32,
2028         R_ARM_THM_PC22,
2029         R_ARM_THM_PC8,
2030         R_ARM_AMP_VCALL9,
2031         R_ARM_SWI24,
2032         R_ARM_TLS_DESC,
2033         R_ARM_THM_SWI8,
2034         R_ARM_XPC25,
2035         R_ARM_THM_XPC22,
2036         R_ARM_TLS_DTPMOD32,
2037         R_ARM_TLS_DTPOFF32,
2038         R_ARM_TLS_TPOFF32,
2039         R_ARM_COPY,
2040         R_ARM_GLOB_DAT,
2041         R_ARM_JUMP_SLOT,
2042         R_ARM_RELATIVE,
2043         R_ARM_GOTOFF,
2044         R_ARM_GOTPC,
2045         R_ARM_GOT32,
2046         R_ARM_PLT32,
2047         R_ARM_CALL,
2048         R_ARM_JUMP24,
2049         R_ARM_THM_JUMP24,
2050         R_ARM_BASE_ABS,
2051         R_ARM_ALU_PCREL_7_0,
2052         R_ARM_ALU_PCREL_15_8,
2053         R_ARM_ALU_PCREL_23_15,
2054         R_ARM_LDR_SBREL_11_0,
2055         R_ARM_ALU_SBREL_19_12,
2056         R_ARM_ALU_SBREL_27_20,
2057         R_ARM_TARGET1,
2058         R_ARM_SBREL31,
2059         R_ARM_V4BX,
2060         R_ARM_TARGET2,
2061         R_ARM_PREL31,
2062         R_ARM_MOVW_ABS_NC,
2063         R_ARM_MOVT_ABS,
2064         R_ARM_MOVW_PREL_NC,
2065         R_ARM_MOVT_PREL,
2066         R_ARM_THM_MOVW_ABS_NC,
2067         R_ARM_THM_MOVT_ABS,
2068         R_ARM_THM_MOVW_PREL_NC,
2069         R_ARM_THM_MOVT_PREL,
2070         R_ARM_THM_JUMP19,
2071         R_ARM_THM_JUMP6,
2072         R_ARM_THM_ALU_PREL_11_0,
2073         R_ARM_THM_PC12,
2074         R_ARM_ABS32_NOI,
2075         R_ARM_REL32_NOI,
2076         R_ARM_ALU_PC_G0_NC,
2077         R_ARM_ALU_PC_G0,
2078         R_ARM_ALU_PC_G1_NC,
2079         R_ARM_ALU_PC_G1,
2080         R_ARM_ALU_PC_G2,
2081         R_ARM_LDR_PC_G1,
2082         R_ARM_LDR_PC_G2,
2083         R_ARM_LDRS_PC_G0,
2084         R_ARM_LDRS_PC_G1,
2085         R_ARM_LDRS_PC_G2,
2086         R_ARM_LDC_PC_G0,
2087         R_ARM_LDC_PC_G1,
2088         R_ARM_LDC_PC_G2,
2089         R_ARM_ALU_SB_G0_NC,
2090         R_ARM_ALU_SB_G0,
2091         R_ARM_ALU_SB_G1_NC,
2092         R_ARM_ALU_SB_G1,
2093         R_ARM_ALU_SB_G2,
2094         R_ARM_LDR_SB_G0,
2095         R_ARM_LDR_SB_G1,
2096         R_ARM_LDR_SB_G2,
2097         R_ARM_LDRS_SB_G0,
2098         R_ARM_LDRS_SB_G1,
2099         R_ARM_LDRS_SB_G2,
2100         R_ARM_LDC_SB_G0,
2101         R_ARM_LDC_SB_G1,
2102         R_ARM_LDC_SB_G2,
2103         R_ARM_MOVW_BREL_NC,
2104         R_ARM_MOVT_BREL,
2105         R_ARM_MOVW_BREL,
2106         R_ARM_THM_MOVW_BREL_NC,
2107         R_ARM_THM_MOVT_BREL,
2108         R_ARM_THM_MOVW_BREL,
2109         R_ARM_TLS_GOTDESC,
2110         R_ARM_TLS_CALL,
2111         R_ARM_TLS_DESCSEQ,
2112         R_ARM_THM_TLS_CALL,
2113         R_ARM_PLT32_ABS,
2114         R_ARM_GOT_ABS,
2115         R_ARM_GOT_PREL,
2116         R_ARM_GOT_BREL12,
2117         R_ARM_GOTOFF12,
2118         R_ARM_GOTRELAX,
2119         R_ARM_GNU_VTENTRY,
2120         R_ARM_GNU_VTINHERIT,
2121         R_ARM_THM_PC11,
2122         R_ARM_THM_PC9,
2123         R_ARM_TLS_GD32,
2124         R_ARM_TLS_LDM32,
2125         R_ARM_TLS_LDO32,
2126         R_ARM_TLS_IE32,
2127         R_ARM_TLS_LE32,
2128         R_ARM_TLS_LDO12,
2129         R_ARM_TLS_LE12,
2130         R_ARM_TLS_IE12GP,
2131         R_ARM_ME_TOO,
2132         R_ARM_THM_TLS_DESCSEQ,
2133         R_ARM_THM_TLS_DESCSEQ16,
2134         R_ARM_THM_TLS_DESCSEQ32,
2135         R_ARM_THM_GOT_BREL12,
2136         R_ARM_IRELATIVE,
2137         R_ARM_RXPC25,
2138         R_ARM_RSBREL32,
2139         R_ARM_THM_RPC22,
2140         R_ARM_RREL32,
2141         R_ARM_RABS22,
2142         R_ARM_RPC24,
2143         R_ARM_RBASE,
2144     );
2145     static FLAGS_R_CKCORE: &[Flag<u32>] = &flags!(
2146         R_CKCORE_NONE,
2147         R_CKCORE_ADDR32,
2148         R_CKCORE_PCRELIMM8BY4,
2149         R_CKCORE_PCRELIMM11BY2,
2150         R_CKCORE_PCREL32,
2151         R_CKCORE_PCRELJSR_IMM11BY2,
2152         R_CKCORE_RELATIVE,
2153         R_CKCORE_COPY,
2154         R_CKCORE_GLOB_DAT,
2155         R_CKCORE_JUMP_SLOT,
2156         R_CKCORE_GOTOFF,
2157         R_CKCORE_GOTPC,
2158         R_CKCORE_GOT32,
2159         R_CKCORE_PLT32,
2160         R_CKCORE_ADDRGOT,
2161         R_CKCORE_ADDRPLT,
2162         R_CKCORE_PCREL_IMM26BY2,
2163         R_CKCORE_PCREL_IMM16BY2,
2164         R_CKCORE_PCREL_IMM16BY4,
2165         R_CKCORE_PCREL_IMM10BY2,
2166         R_CKCORE_PCREL_IMM10BY4,
2167         R_CKCORE_ADDR_HI16,
2168         R_CKCORE_ADDR_LO16,
2169         R_CKCORE_GOTPC_HI16,
2170         R_CKCORE_GOTPC_LO16,
2171         R_CKCORE_GOTOFF_HI16,
2172         R_CKCORE_GOTOFF_LO16,
2173         R_CKCORE_GOT12,
2174         R_CKCORE_GOT_HI16,
2175         R_CKCORE_GOT_LO16,
2176         R_CKCORE_PLT12,
2177         R_CKCORE_PLT_HI16,
2178         R_CKCORE_PLT_LO16,
2179         R_CKCORE_ADDRGOT_HI16,
2180         R_CKCORE_ADDRGOT_LO16,
2181         R_CKCORE_ADDRPLT_HI16,
2182         R_CKCORE_ADDRPLT_LO16,
2183         R_CKCORE_PCREL_JSR_IMM26BY2,
2184         R_CKCORE_TOFFSET_LO16,
2185         R_CKCORE_DOFFSET_LO16,
2186         R_CKCORE_PCREL_IMM18BY2,
2187         R_CKCORE_DOFFSET_IMM18,
2188         R_CKCORE_DOFFSET_IMM18BY2,
2189         R_CKCORE_DOFFSET_IMM18BY4,
2190         R_CKCORE_GOT_IMM18BY4,
2191         R_CKCORE_PLT_IMM18BY4,
2192         R_CKCORE_PCREL_IMM7BY4,
2193         R_CKCORE_TLS_LE32,
2194         R_CKCORE_TLS_IE32,
2195         R_CKCORE_TLS_GD32,
2196         R_CKCORE_TLS_LDM32,
2197         R_CKCORE_TLS_LDO32,
2198         R_CKCORE_TLS_DTPMOD32,
2199         R_CKCORE_TLS_DTPOFF32,
2200         R_CKCORE_TLS_TPOFF32,
2201     );
2202     static FLAGS_R_IA64: &[Flag<u32>] = &flags!(
2203         R_IA64_NONE,
2204         R_IA64_IMM14,
2205         R_IA64_IMM22,
2206         R_IA64_IMM64,
2207         R_IA64_DIR32MSB,
2208         R_IA64_DIR32LSB,
2209         R_IA64_DIR64MSB,
2210         R_IA64_DIR64LSB,
2211         R_IA64_GPREL22,
2212         R_IA64_GPREL64I,
2213         R_IA64_GPREL32MSB,
2214         R_IA64_GPREL32LSB,
2215         R_IA64_GPREL64MSB,
2216         R_IA64_GPREL64LSB,
2217         R_IA64_LTOFF22,
2218         R_IA64_LTOFF64I,
2219         R_IA64_PLTOFF22,
2220         R_IA64_PLTOFF64I,
2221         R_IA64_PLTOFF64MSB,
2222         R_IA64_PLTOFF64LSB,
2223         R_IA64_FPTR64I,
2224         R_IA64_FPTR32MSB,
2225         R_IA64_FPTR32LSB,
2226         R_IA64_FPTR64MSB,
2227         R_IA64_FPTR64LSB,
2228         R_IA64_PCREL60B,
2229         R_IA64_PCREL21B,
2230         R_IA64_PCREL21M,
2231         R_IA64_PCREL21F,
2232         R_IA64_PCREL32MSB,
2233         R_IA64_PCREL32LSB,
2234         R_IA64_PCREL64MSB,
2235         R_IA64_PCREL64LSB,
2236         R_IA64_LTOFF_FPTR22,
2237         R_IA64_LTOFF_FPTR64I,
2238         R_IA64_LTOFF_FPTR32MSB,
2239         R_IA64_LTOFF_FPTR32LSB,
2240         R_IA64_LTOFF_FPTR64MSB,
2241         R_IA64_LTOFF_FPTR64LSB,
2242         R_IA64_SEGREL32MSB,
2243         R_IA64_SEGREL32LSB,
2244         R_IA64_SEGREL64MSB,
2245         R_IA64_SEGREL64LSB,
2246         R_IA64_SECREL32MSB,
2247         R_IA64_SECREL32LSB,
2248         R_IA64_SECREL64MSB,
2249         R_IA64_SECREL64LSB,
2250         R_IA64_REL32MSB,
2251         R_IA64_REL32LSB,
2252         R_IA64_REL64MSB,
2253         R_IA64_REL64LSB,
2254         R_IA64_LTV32MSB,
2255         R_IA64_LTV32LSB,
2256         R_IA64_LTV64MSB,
2257         R_IA64_LTV64LSB,
2258         R_IA64_PCREL21BI,
2259         R_IA64_PCREL22,
2260         R_IA64_PCREL64I,
2261         R_IA64_IPLTMSB,
2262         R_IA64_IPLTLSB,
2263         R_IA64_COPY,
2264         R_IA64_SUB,
2265         R_IA64_LTOFF22X,
2266         R_IA64_LDXMOV,
2267         R_IA64_TPREL14,
2268         R_IA64_TPREL22,
2269         R_IA64_TPREL64I,
2270         R_IA64_TPREL64MSB,
2271         R_IA64_TPREL64LSB,
2272         R_IA64_LTOFF_TPREL22,
2273         R_IA64_DTPMOD64MSB,
2274         R_IA64_DTPMOD64LSB,
2275         R_IA64_LTOFF_DTPMOD22,
2276         R_IA64_DTPREL14,
2277         R_IA64_DTPREL22,
2278         R_IA64_DTPREL64I,
2279         R_IA64_DTPREL32MSB,
2280         R_IA64_DTPREL32LSB,
2281         R_IA64_DTPREL64MSB,
2282         R_IA64_DTPREL64LSB,
2283         R_IA64_LTOFF_DTPREL22,
2284     );
2285     static FLAGS_R_SH: &[Flag<u32>] = &flags!(
2286         R_SH_NONE,
2287         R_SH_DIR32,
2288         R_SH_REL32,
2289         R_SH_DIR8WPN,
2290         R_SH_IND12W,
2291         R_SH_DIR8WPL,
2292         R_SH_DIR8WPZ,
2293         R_SH_DIR8BP,
2294         R_SH_DIR8W,
2295         R_SH_DIR8L,
2296         R_SH_SWITCH16,
2297         R_SH_SWITCH32,
2298         R_SH_USES,
2299         R_SH_COUNT,
2300         R_SH_ALIGN,
2301         R_SH_CODE,
2302         R_SH_DATA,
2303         R_SH_LABEL,
2304         R_SH_SWITCH8,
2305         R_SH_GNU_VTINHERIT,
2306         R_SH_GNU_VTENTRY,
2307         R_SH_TLS_GD_32,
2308         R_SH_TLS_LD_32,
2309         R_SH_TLS_LDO_32,
2310         R_SH_TLS_IE_32,
2311         R_SH_TLS_LE_32,
2312         R_SH_TLS_DTPMOD32,
2313         R_SH_TLS_DTPOFF32,
2314         R_SH_TLS_TPOFF32,
2315         R_SH_GOT32,
2316         R_SH_PLT32,
2317         R_SH_COPY,
2318         R_SH_GLOB_DAT,
2319         R_SH_JMP_SLOT,
2320         R_SH_RELATIVE,
2321         R_SH_GOTOFF,
2322         R_SH_GOTPC,
2323     );
2324     static FLAGS_R_390: &[Flag<u32>] = &flags!(
2325         R_390_NONE,
2326         R_390_8,
2327         R_390_12,
2328         R_390_16,
2329         R_390_32,
2330         R_390_PC32,
2331         R_390_GOT12,
2332         R_390_GOT32,
2333         R_390_PLT32,
2334         R_390_COPY,
2335         R_390_GLOB_DAT,
2336         R_390_JMP_SLOT,
2337         R_390_RELATIVE,
2338         R_390_GOTOFF32,
2339         R_390_GOTPC,
2340         R_390_GOT16,
2341         R_390_PC16,
2342         R_390_PC16DBL,
2343         R_390_PLT16DBL,
2344         R_390_PC32DBL,
2345         R_390_PLT32DBL,
2346         R_390_GOTPCDBL,
2347         R_390_64,
2348         R_390_PC64,
2349         R_390_GOT64,
2350         R_390_PLT64,
2351         R_390_GOTENT,
2352         R_390_GOTOFF16,
2353         R_390_GOTOFF64,
2354         R_390_GOTPLT12,
2355         R_390_GOTPLT16,
2356         R_390_GOTPLT32,
2357         R_390_GOTPLT64,
2358         R_390_GOTPLTENT,
2359         R_390_PLTOFF16,
2360         R_390_PLTOFF32,
2361         R_390_PLTOFF64,
2362         R_390_TLS_LOAD,
2363         R_390_TLS_GDCALL,
2364         R_390_TLS_LDCALL,
2365         R_390_TLS_GD32,
2366         R_390_TLS_GD64,
2367         R_390_TLS_GOTIE12,
2368         R_390_TLS_GOTIE32,
2369         R_390_TLS_GOTIE64,
2370         R_390_TLS_LDM32,
2371         R_390_TLS_LDM64,
2372         R_390_TLS_IE32,
2373         R_390_TLS_IE64,
2374         R_390_TLS_IEENT,
2375         R_390_TLS_LE32,
2376         R_390_TLS_LE64,
2377         R_390_TLS_LDO32,
2378         R_390_TLS_LDO64,
2379         R_390_TLS_DTPMOD,
2380         R_390_TLS_DTPOFF,
2381         R_390_TLS_TPOFF,
2382         R_390_20,
2383         R_390_GOT20,
2384         R_390_GOTPLT20,
2385         R_390_TLS_GOTIE20,
2386         R_390_IRELATIVE,
2387     );
2388     static FLAGS_R_CRIS: &[Flag<u32>] = &flags!(
2389         R_CRIS_NONE,
2390         R_CRIS_8,
2391         R_CRIS_16,
2392         R_CRIS_32,
2393         R_CRIS_8_PCREL,
2394         R_CRIS_16_PCREL,
2395         R_CRIS_32_PCREL,
2396         R_CRIS_GNU_VTINHERIT,
2397         R_CRIS_GNU_VTENTRY,
2398         R_CRIS_COPY,
2399         R_CRIS_GLOB_DAT,
2400         R_CRIS_JUMP_SLOT,
2401         R_CRIS_RELATIVE,
2402         R_CRIS_16_GOT,
2403         R_CRIS_32_GOT,
2404         R_CRIS_16_GOTPLT,
2405         R_CRIS_32_GOTPLT,
2406         R_CRIS_32_GOTREL,
2407         R_CRIS_32_PLT_GOTREL,
2408         R_CRIS_32_PLT_PCREL,
2409     );
2410     static FLAGS_R_X86_64: &[Flag<u32>] = &flags!(
2411         R_X86_64_NONE,
2412         R_X86_64_64,
2413         R_X86_64_PC32,
2414         R_X86_64_GOT32,
2415         R_X86_64_PLT32,
2416         R_X86_64_COPY,
2417         R_X86_64_GLOB_DAT,
2418         R_X86_64_JUMP_SLOT,
2419         R_X86_64_RELATIVE,
2420         R_X86_64_GOTPCREL,
2421         R_X86_64_32,
2422         R_X86_64_32S,
2423         R_X86_64_16,
2424         R_X86_64_PC16,
2425         R_X86_64_8,
2426         R_X86_64_PC8,
2427         R_X86_64_DTPMOD64,
2428         R_X86_64_DTPOFF64,
2429         R_X86_64_TPOFF64,
2430         R_X86_64_TLSGD,
2431         R_X86_64_TLSLD,
2432         R_X86_64_DTPOFF32,
2433         R_X86_64_GOTTPOFF,
2434         R_X86_64_TPOFF32,
2435         R_X86_64_PC64,
2436         R_X86_64_GOTOFF64,
2437         R_X86_64_GOTPC32,
2438         R_X86_64_GOT64,
2439         R_X86_64_GOTPCREL64,
2440         R_X86_64_GOTPC64,
2441         R_X86_64_GOTPLT64,
2442         R_X86_64_PLTOFF64,
2443         R_X86_64_SIZE32,
2444         R_X86_64_SIZE64,
2445         R_X86_64_GOTPC32_TLSDESC,
2446         R_X86_64_TLSDESC_CALL,
2447         R_X86_64_TLSDESC,
2448         R_X86_64_IRELATIVE,
2449         R_X86_64_RELATIVE64,
2450         R_X86_64_GOTPCRELX,
2451         R_X86_64_REX_GOTPCRELX,
2452     );
2453     static FLAGS_R_MN10300: &[Flag<u32>] = &flags!(
2454         R_MN10300_NONE,
2455         R_MN10300_32,
2456         R_MN10300_16,
2457         R_MN10300_8,
2458         R_MN10300_PCREL32,
2459         R_MN10300_PCREL16,
2460         R_MN10300_PCREL8,
2461         R_MN10300_GNU_VTINHERIT,
2462         R_MN10300_GNU_VTENTRY,
2463         R_MN10300_24,
2464         R_MN10300_GOTPC32,
2465         R_MN10300_GOTPC16,
2466         R_MN10300_GOTOFF32,
2467         R_MN10300_GOTOFF24,
2468         R_MN10300_GOTOFF16,
2469         R_MN10300_PLT32,
2470         R_MN10300_PLT16,
2471         R_MN10300_GOT32,
2472         R_MN10300_GOT24,
2473         R_MN10300_GOT16,
2474         R_MN10300_COPY,
2475         R_MN10300_GLOB_DAT,
2476         R_MN10300_JMP_SLOT,
2477         R_MN10300_RELATIVE,
2478         R_MN10300_TLS_GD,
2479         R_MN10300_TLS_LD,
2480         R_MN10300_TLS_LDO,
2481         R_MN10300_TLS_GOTIE,
2482         R_MN10300_TLS_IE,
2483         R_MN10300_TLS_LE,
2484         R_MN10300_TLS_DTPMOD,
2485         R_MN10300_TLS_DTPOFF,
2486         R_MN10300_TLS_TPOFF,
2487         R_MN10300_SYM_DIFF,
2488         R_MN10300_ALIGN,
2489     );
2490     static FLAGS_R_M32R: &[Flag<u32>] = &flags!(
2491         R_M32R_NONE,
2492         R_M32R_16,
2493         R_M32R_32,
2494         R_M32R_24,
2495         R_M32R_10_PCREL,
2496         R_M32R_18_PCREL,
2497         R_M32R_26_PCREL,
2498         R_M32R_HI16_ULO,
2499         R_M32R_HI16_SLO,
2500         R_M32R_LO16,
2501         R_M32R_SDA16,
2502         R_M32R_GNU_VTINHERIT,
2503         R_M32R_GNU_VTENTRY,
2504         R_M32R_16_RELA,
2505         R_M32R_32_RELA,
2506         R_M32R_24_RELA,
2507         R_M32R_10_PCREL_RELA,
2508         R_M32R_18_PCREL_RELA,
2509         R_M32R_26_PCREL_RELA,
2510         R_M32R_HI16_ULO_RELA,
2511         R_M32R_HI16_SLO_RELA,
2512         R_M32R_LO16_RELA,
2513         R_M32R_SDA16_RELA,
2514         R_M32R_RELA_GNU_VTINHERIT,
2515         R_M32R_RELA_GNU_VTENTRY,
2516         R_M32R_REL32,
2517         R_M32R_GOT24,
2518         R_M32R_26_PLTREL,
2519         R_M32R_COPY,
2520         R_M32R_GLOB_DAT,
2521         R_M32R_JMP_SLOT,
2522         R_M32R_RELATIVE,
2523         R_M32R_GOTOFF,
2524         R_M32R_GOTPC24,
2525         R_M32R_GOT16_HI_ULO,
2526         R_M32R_GOT16_HI_SLO,
2527         R_M32R_GOT16_LO,
2528         R_M32R_GOTPC_HI_ULO,
2529         R_M32R_GOTPC_HI_SLO,
2530         R_M32R_GOTPC_LO,
2531         R_M32R_GOTOFF_HI_ULO,
2532         R_M32R_GOTOFF_HI_SLO,
2533         R_M32R_GOTOFF_LO,
2534         R_M32R_NUM,
2535     );
2536     static FLAGS_R_MICROBLAZE: &[Flag<u32>] = &flags!(
2537         R_MICROBLAZE_NONE,
2538         R_MICROBLAZE_32,
2539         R_MICROBLAZE_32_PCREL,
2540         R_MICROBLAZE_64_PCREL,
2541         R_MICROBLAZE_32_PCREL_LO,
2542         R_MICROBLAZE_64,
2543         R_MICROBLAZE_32_LO,
2544         R_MICROBLAZE_SRO32,
2545         R_MICROBLAZE_SRW32,
2546         R_MICROBLAZE_64_NONE,
2547         R_MICROBLAZE_32_SYM_OP_SYM,
2548         R_MICROBLAZE_GNU_VTINHERIT,
2549         R_MICROBLAZE_GNU_VTENTRY,
2550         R_MICROBLAZE_GOTPC_64,
2551         R_MICROBLAZE_GOT_64,
2552         R_MICROBLAZE_PLT_64,
2553         R_MICROBLAZE_REL,
2554         R_MICROBLAZE_JUMP_SLOT,
2555         R_MICROBLAZE_GLOB_DAT,
2556         R_MICROBLAZE_GOTOFF_64,
2557         R_MICROBLAZE_GOTOFF_32,
2558         R_MICROBLAZE_COPY,
2559         R_MICROBLAZE_TLS,
2560         R_MICROBLAZE_TLSGD,
2561         R_MICROBLAZE_TLSLD,
2562         R_MICROBLAZE_TLSDTPMOD32,
2563         R_MICROBLAZE_TLSDTPREL32,
2564         R_MICROBLAZE_TLSDTPREL64,
2565         R_MICROBLAZE_TLSGOTTPREL32,
2566         R_MICROBLAZE_TLSTPREL32,
2567     );
2568     static FLAGS_R_NIOS2: &[Flag<u32>] = &flags!(
2569         R_NIOS2_NONE,
2570         R_NIOS2_S16,
2571         R_NIOS2_U16,
2572         R_NIOS2_PCREL16,
2573         R_NIOS2_CALL26,
2574         R_NIOS2_IMM5,
2575         R_NIOS2_CACHE_OPX,
2576         R_NIOS2_IMM6,
2577         R_NIOS2_IMM8,
2578         R_NIOS2_HI16,
2579         R_NIOS2_LO16,
2580         R_NIOS2_HIADJ16,
2581         R_NIOS2_BFD_RELOC_32,
2582         R_NIOS2_BFD_RELOC_16,
2583         R_NIOS2_BFD_RELOC_8,
2584         R_NIOS2_GPREL,
2585         R_NIOS2_GNU_VTINHERIT,
2586         R_NIOS2_GNU_VTENTRY,
2587         R_NIOS2_UJMP,
2588         R_NIOS2_CJMP,
2589         R_NIOS2_CALLR,
2590         R_NIOS2_ALIGN,
2591         R_NIOS2_GOT16,
2592         R_NIOS2_CALL16,
2593         R_NIOS2_GOTOFF_LO,
2594         R_NIOS2_GOTOFF_HA,
2595         R_NIOS2_PCREL_LO,
2596         R_NIOS2_PCREL_HA,
2597         R_NIOS2_TLS_GD16,
2598         R_NIOS2_TLS_LDM16,
2599         R_NIOS2_TLS_LDO16,
2600         R_NIOS2_TLS_IE16,
2601         R_NIOS2_TLS_LE16,
2602         R_NIOS2_TLS_DTPMOD,
2603         R_NIOS2_TLS_DTPREL,
2604         R_NIOS2_TLS_TPREL,
2605         R_NIOS2_COPY,
2606         R_NIOS2_GLOB_DAT,
2607         R_NIOS2_JUMP_SLOT,
2608         R_NIOS2_RELATIVE,
2609         R_NIOS2_GOTOFF,
2610         R_NIOS2_CALL26_NOAT,
2611         R_NIOS2_GOT_LO,
2612         R_NIOS2_GOT_HA,
2613         R_NIOS2_CALL_LO,
2614         R_NIOS2_CALL_HA,
2615     );
2616     static FLAGS_R_TILEPRO: &[Flag<u32>] = &flags!(
2617         R_TILEPRO_NONE,
2618         R_TILEPRO_32,
2619         R_TILEPRO_16,
2620         R_TILEPRO_8,
2621         R_TILEPRO_32_PCREL,
2622         R_TILEPRO_16_PCREL,
2623         R_TILEPRO_8_PCREL,
2624         R_TILEPRO_LO16,
2625         R_TILEPRO_HI16,
2626         R_TILEPRO_HA16,
2627         R_TILEPRO_COPY,
2628         R_TILEPRO_GLOB_DAT,
2629         R_TILEPRO_JMP_SLOT,
2630         R_TILEPRO_RELATIVE,
2631         R_TILEPRO_BROFF_X1,
2632         R_TILEPRO_JOFFLONG_X1,
2633         R_TILEPRO_JOFFLONG_X1_PLT,
2634         R_TILEPRO_IMM8_X0,
2635         R_TILEPRO_IMM8_Y0,
2636         R_TILEPRO_IMM8_X1,
2637         R_TILEPRO_IMM8_Y1,
2638         R_TILEPRO_MT_IMM15_X1,
2639         R_TILEPRO_MF_IMM15_X1,
2640         R_TILEPRO_IMM16_X0,
2641         R_TILEPRO_IMM16_X1,
2642         R_TILEPRO_IMM16_X0_LO,
2643         R_TILEPRO_IMM16_X1_LO,
2644         R_TILEPRO_IMM16_X0_HI,
2645         R_TILEPRO_IMM16_X1_HI,
2646         R_TILEPRO_IMM16_X0_HA,
2647         R_TILEPRO_IMM16_X1_HA,
2648         R_TILEPRO_IMM16_X0_PCREL,
2649         R_TILEPRO_IMM16_X1_PCREL,
2650         R_TILEPRO_IMM16_X0_LO_PCREL,
2651         R_TILEPRO_IMM16_X1_LO_PCREL,
2652         R_TILEPRO_IMM16_X0_HI_PCREL,
2653         R_TILEPRO_IMM16_X1_HI_PCREL,
2654         R_TILEPRO_IMM16_X0_HA_PCREL,
2655         R_TILEPRO_IMM16_X1_HA_PCREL,
2656         R_TILEPRO_IMM16_X0_GOT,
2657         R_TILEPRO_IMM16_X1_GOT,
2658         R_TILEPRO_IMM16_X0_GOT_LO,
2659         R_TILEPRO_IMM16_X1_GOT_LO,
2660         R_TILEPRO_IMM16_X0_GOT_HI,
2661         R_TILEPRO_IMM16_X1_GOT_HI,
2662         R_TILEPRO_IMM16_X0_GOT_HA,
2663         R_TILEPRO_IMM16_X1_GOT_HA,
2664         R_TILEPRO_MMSTART_X0,
2665         R_TILEPRO_MMEND_X0,
2666         R_TILEPRO_MMSTART_X1,
2667         R_TILEPRO_MMEND_X1,
2668         R_TILEPRO_SHAMT_X0,
2669         R_TILEPRO_SHAMT_X1,
2670         R_TILEPRO_SHAMT_Y0,
2671         R_TILEPRO_SHAMT_Y1,
2672         R_TILEPRO_DEST_IMM8_X1,
2673         R_TILEPRO_TLS_GD_CALL,
2674         R_TILEPRO_IMM8_X0_TLS_GD_ADD,
2675         R_TILEPRO_IMM8_X1_TLS_GD_ADD,
2676         R_TILEPRO_IMM8_Y0_TLS_GD_ADD,
2677         R_TILEPRO_IMM8_Y1_TLS_GD_ADD,
2678         R_TILEPRO_TLS_IE_LOAD,
2679         R_TILEPRO_IMM16_X0_TLS_GD,
2680         R_TILEPRO_IMM16_X1_TLS_GD,
2681         R_TILEPRO_IMM16_X0_TLS_GD_LO,
2682         R_TILEPRO_IMM16_X1_TLS_GD_LO,
2683         R_TILEPRO_IMM16_X0_TLS_GD_HI,
2684         R_TILEPRO_IMM16_X1_TLS_GD_HI,
2685         R_TILEPRO_IMM16_X0_TLS_GD_HA,
2686         R_TILEPRO_IMM16_X1_TLS_GD_HA,
2687         R_TILEPRO_IMM16_X0_TLS_IE,
2688         R_TILEPRO_IMM16_X1_TLS_IE,
2689         R_TILEPRO_IMM16_X0_TLS_IE_LO,
2690         R_TILEPRO_IMM16_X1_TLS_IE_LO,
2691         R_TILEPRO_IMM16_X0_TLS_IE_HI,
2692         R_TILEPRO_IMM16_X1_TLS_IE_HI,
2693         R_TILEPRO_IMM16_X0_TLS_IE_HA,
2694         R_TILEPRO_IMM16_X1_TLS_IE_HA,
2695         R_TILEPRO_TLS_DTPMOD32,
2696         R_TILEPRO_TLS_DTPOFF32,
2697         R_TILEPRO_TLS_TPOFF32,
2698         R_TILEPRO_IMM16_X0_TLS_LE,
2699         R_TILEPRO_IMM16_X1_TLS_LE,
2700         R_TILEPRO_IMM16_X0_TLS_LE_LO,
2701         R_TILEPRO_IMM16_X1_TLS_LE_LO,
2702         R_TILEPRO_IMM16_X0_TLS_LE_HI,
2703         R_TILEPRO_IMM16_X1_TLS_LE_HI,
2704         R_TILEPRO_IMM16_X0_TLS_LE_HA,
2705         R_TILEPRO_IMM16_X1_TLS_LE_HA,
2706         R_TILEPRO_GNU_VTINHERIT,
2707         R_TILEPRO_GNU_VTENTRY,
2708     );
2709     static FLAGS_R_TILEGX: &[Flag<u32>] = &flags!(
2710         R_TILEGX_NONE,
2711         R_TILEGX_64,
2712         R_TILEGX_32,
2713         R_TILEGX_16,
2714         R_TILEGX_8,
2715         R_TILEGX_64_PCREL,
2716         R_TILEGX_32_PCREL,
2717         R_TILEGX_16_PCREL,
2718         R_TILEGX_8_PCREL,
2719         R_TILEGX_HW0,
2720         R_TILEGX_HW1,
2721         R_TILEGX_HW2,
2722         R_TILEGX_HW3,
2723         R_TILEGX_HW0_LAST,
2724         R_TILEGX_HW1_LAST,
2725         R_TILEGX_HW2_LAST,
2726         R_TILEGX_COPY,
2727         R_TILEGX_GLOB_DAT,
2728         R_TILEGX_JMP_SLOT,
2729         R_TILEGX_RELATIVE,
2730         R_TILEGX_BROFF_X1,
2731         R_TILEGX_JUMPOFF_X1,
2732         R_TILEGX_JUMPOFF_X1_PLT,
2733         R_TILEGX_IMM8_X0,
2734         R_TILEGX_IMM8_Y0,
2735         R_TILEGX_IMM8_X1,
2736         R_TILEGX_IMM8_Y1,
2737         R_TILEGX_DEST_IMM8_X1,
2738         R_TILEGX_MT_IMM14_X1,
2739         R_TILEGX_MF_IMM14_X1,
2740         R_TILEGX_MMSTART_X0,
2741         R_TILEGX_MMEND_X0,
2742         R_TILEGX_SHAMT_X0,
2743         R_TILEGX_SHAMT_X1,
2744         R_TILEGX_SHAMT_Y0,
2745         R_TILEGX_SHAMT_Y1,
2746         R_TILEGX_IMM16_X0_HW0,
2747         R_TILEGX_IMM16_X1_HW0,
2748         R_TILEGX_IMM16_X0_HW1,
2749         R_TILEGX_IMM16_X1_HW1,
2750         R_TILEGX_IMM16_X0_HW2,
2751         R_TILEGX_IMM16_X1_HW2,
2752         R_TILEGX_IMM16_X0_HW3,
2753         R_TILEGX_IMM16_X1_HW3,
2754         R_TILEGX_IMM16_X0_HW0_LAST,
2755         R_TILEGX_IMM16_X1_HW0_LAST,
2756         R_TILEGX_IMM16_X0_HW1_LAST,
2757         R_TILEGX_IMM16_X1_HW1_LAST,
2758         R_TILEGX_IMM16_X0_HW2_LAST,
2759         R_TILEGX_IMM16_X1_HW2_LAST,
2760         R_TILEGX_IMM16_X0_HW0_PCREL,
2761         R_TILEGX_IMM16_X1_HW0_PCREL,
2762         R_TILEGX_IMM16_X0_HW1_PCREL,
2763         R_TILEGX_IMM16_X1_HW1_PCREL,
2764         R_TILEGX_IMM16_X0_HW2_PCREL,
2765         R_TILEGX_IMM16_X1_HW2_PCREL,
2766         R_TILEGX_IMM16_X0_HW3_PCREL,
2767         R_TILEGX_IMM16_X1_HW3_PCREL,
2768         R_TILEGX_IMM16_X0_HW0_LAST_PCREL,
2769         R_TILEGX_IMM16_X1_HW0_LAST_PCREL,
2770         R_TILEGX_IMM16_X0_HW1_LAST_PCREL,
2771         R_TILEGX_IMM16_X1_HW1_LAST_PCREL,
2772         R_TILEGX_IMM16_X0_HW2_LAST_PCREL,
2773         R_TILEGX_IMM16_X1_HW2_LAST_PCREL,
2774         R_TILEGX_IMM16_X0_HW0_GOT,
2775         R_TILEGX_IMM16_X1_HW0_GOT,
2776         R_TILEGX_IMM16_X0_HW0_PLT_PCREL,
2777         R_TILEGX_IMM16_X1_HW0_PLT_PCREL,
2778         R_TILEGX_IMM16_X0_HW1_PLT_PCREL,
2779         R_TILEGX_IMM16_X1_HW1_PLT_PCREL,
2780         R_TILEGX_IMM16_X0_HW2_PLT_PCREL,
2781         R_TILEGX_IMM16_X1_HW2_PLT_PCREL,
2782         R_TILEGX_IMM16_X0_HW0_LAST_GOT,
2783         R_TILEGX_IMM16_X1_HW0_LAST_GOT,
2784         R_TILEGX_IMM16_X0_HW1_LAST_GOT,
2785         R_TILEGX_IMM16_X1_HW1_LAST_GOT,
2786         R_TILEGX_IMM16_X0_HW3_PLT_PCREL,
2787         R_TILEGX_IMM16_X1_HW3_PLT_PCREL,
2788         R_TILEGX_IMM16_X0_HW0_TLS_GD,
2789         R_TILEGX_IMM16_X1_HW0_TLS_GD,
2790         R_TILEGX_IMM16_X0_HW0_TLS_LE,
2791         R_TILEGX_IMM16_X1_HW0_TLS_LE,
2792         R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE,
2793         R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE,
2794         R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE,
2795         R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE,
2796         R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD,
2797         R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD,
2798         R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD,
2799         R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD,
2800         R_TILEGX_IMM16_X0_HW0_TLS_IE,
2801         R_TILEGX_IMM16_X1_HW0_TLS_IE,
2802         R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL,
2803         R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL,
2804         R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL,
2805         R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL,
2806         R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL,
2807         R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL,
2808         R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE,
2809         R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE,
2810         R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE,
2811         R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE,
2812         R_TILEGX_TLS_DTPMOD64,
2813         R_TILEGX_TLS_DTPOFF64,
2814         R_TILEGX_TLS_TPOFF64,
2815         R_TILEGX_TLS_DTPMOD32,
2816         R_TILEGX_TLS_DTPOFF32,
2817         R_TILEGX_TLS_TPOFF32,
2818         R_TILEGX_TLS_GD_CALL,
2819         R_TILEGX_IMM8_X0_TLS_GD_ADD,
2820         R_TILEGX_IMM8_X1_TLS_GD_ADD,
2821         R_TILEGX_IMM8_Y0_TLS_GD_ADD,
2822         R_TILEGX_IMM8_Y1_TLS_GD_ADD,
2823         R_TILEGX_TLS_IE_LOAD,
2824         R_TILEGX_IMM8_X0_TLS_ADD,
2825         R_TILEGX_IMM8_X1_TLS_ADD,
2826         R_TILEGX_IMM8_Y0_TLS_ADD,
2827         R_TILEGX_IMM8_Y1_TLS_ADD,
2828         R_TILEGX_GNU_VTINHERIT,
2829         R_TILEGX_GNU_VTENTRY,
2830     );
2831     static FLAGS_R_RISCV: &[Flag<u32>] = &flags!(
2832         R_RISCV_NONE,
2833         R_RISCV_32,
2834         R_RISCV_64,
2835         R_RISCV_RELATIVE,
2836         R_RISCV_COPY,
2837         R_RISCV_JUMP_SLOT,
2838         R_RISCV_TLS_DTPMOD32,
2839         R_RISCV_TLS_DTPMOD64,
2840         R_RISCV_TLS_DTPREL32,
2841         R_RISCV_TLS_DTPREL64,
2842         R_RISCV_TLS_TPREL32,
2843         R_RISCV_TLS_TPREL64,
2844         R_RISCV_BRANCH,
2845         R_RISCV_JAL,
2846         R_RISCV_CALL,
2847         R_RISCV_CALL_PLT,
2848         R_RISCV_GOT_HI20,
2849         R_RISCV_TLS_GOT_HI20,
2850         R_RISCV_TLS_GD_HI20,
2851         R_RISCV_PCREL_HI20,
2852         R_RISCV_PCREL_LO12_I,
2853         R_RISCV_PCREL_LO12_S,
2854         R_RISCV_HI20,
2855         R_RISCV_LO12_I,
2856         R_RISCV_LO12_S,
2857         R_RISCV_TPREL_HI20,
2858         R_RISCV_TPREL_LO12_I,
2859         R_RISCV_TPREL_LO12_S,
2860         R_RISCV_TPREL_ADD,
2861         R_RISCV_ADD8,
2862         R_RISCV_ADD16,
2863         R_RISCV_ADD32,
2864         R_RISCV_ADD64,
2865         R_RISCV_SUB8,
2866         R_RISCV_SUB16,
2867         R_RISCV_SUB32,
2868         R_RISCV_SUB64,
2869         R_RISCV_GNU_VTINHERIT,
2870         R_RISCV_GNU_VTENTRY,
2871         R_RISCV_ALIGN,
2872         R_RISCV_RVC_BRANCH,
2873         R_RISCV_RVC_JUMP,
2874         R_RISCV_RVC_LUI,
2875         R_RISCV_GPREL_I,
2876         R_RISCV_GPREL_S,
2877         R_RISCV_TPREL_I,
2878         R_RISCV_TPREL_S,
2879         R_RISCV_RELAX,
2880         R_RISCV_SUB6,
2881         R_RISCV_SET6,
2882         R_RISCV_SET8,
2883         R_RISCV_SET16,
2884         R_RISCV_SET32,
2885         R_RISCV_32_PCREL,
2886     );
2887     static FLAGS_R_BPF: &[Flag<u32>] = &flags!(R_BPF_NONE, R_BPF_64_64, R_BPF_64_32);
2888     static FLAGS_R_METAG: &[Flag<u32>] = &flags!(
2889         R_METAG_HIADDR16,
2890         R_METAG_LOADDR16,
2891         R_METAG_ADDR32,
2892         R_METAG_NONE,
2893         R_METAG_RELBRANCH,
2894         R_METAG_GETSETOFF,
2895         R_METAG_REG32OP1,
2896         R_METAG_REG32OP2,
2897         R_METAG_REG32OP3,
2898         R_METAG_REG16OP1,
2899         R_METAG_REG16OP2,
2900         R_METAG_REG16OP3,
2901         R_METAG_REG32OP4,
2902         R_METAG_HIOG,
2903         R_METAG_LOOG,
2904         R_METAG_REL8,
2905         R_METAG_REL16,
2906         R_METAG_GNU_VTINHERIT,
2907         R_METAG_GNU_VTENTRY,
2908         R_METAG_HI16_GOTOFF,
2909         R_METAG_LO16_GOTOFF,
2910         R_METAG_GETSET_GOTOFF,
2911         R_METAG_GETSET_GOT,
2912         R_METAG_HI16_GOTPC,
2913         R_METAG_LO16_GOTPC,
2914         R_METAG_HI16_PLT,
2915         R_METAG_LO16_PLT,
2916         R_METAG_RELBRANCH_PLT,
2917         R_METAG_GOTOFF,
2918         R_METAG_PLT,
2919         R_METAG_COPY,
2920         R_METAG_JMP_SLOT,
2921         R_METAG_RELATIVE,
2922         R_METAG_GLOB_DAT,
2923         R_METAG_TLS_GD,
2924         R_METAG_TLS_LDM,
2925         R_METAG_TLS_LDO_HI16,
2926         R_METAG_TLS_LDO_LO16,
2927         R_METAG_TLS_LDO,
2928         R_METAG_TLS_IE,
2929         R_METAG_TLS_IENONPIC,
2930         R_METAG_TLS_IENONPIC_HI16,
2931         R_METAG_TLS_IENONPIC_LO16,
2932         R_METAG_TLS_TPOFF,
2933         R_METAG_TLS_DTPMOD,
2934         R_METAG_TLS_DTPOFF,
2935         R_METAG_TLS_LE,
2936         R_METAG_TLS_LE_HI16,
2937         R_METAG_TLS_LE_LO16,
2938     );
2939     static FLAGS_R_NDS32: &[Flag<u32>] = &flags!(
2940         R_NDS32_NONE,
2941         R_NDS32_32_RELA,
2942         R_NDS32_COPY,
2943         R_NDS32_GLOB_DAT,
2944         R_NDS32_JMP_SLOT,
2945         R_NDS32_RELATIVE,
2946         R_NDS32_TLS_TPOFF,
2947         R_NDS32_TLS_DESC,
2948     );
2949     static FLAGS_NT_CORE: &[Flag<u32>] = &flags!(
2950         NT_PRSTATUS,
2951         NT_PRFPREG,
2952         NT_FPREGSET,
2953         NT_PRPSINFO,
2954         NT_PRXREG,
2955         NT_TASKSTRUCT,
2956         NT_PLATFORM,
2957         NT_AUXV,
2958         NT_GWINDOWS,
2959         NT_ASRS,
2960         NT_PSTATUS,
2961         NT_PSINFO,
2962         NT_PRCRED,
2963         NT_UTSNAME,
2964         NT_LWPSTATUS,
2965         NT_LWPSINFO,
2966         NT_PRFPXREG,
2967         NT_SIGINFO,
2968         NT_FILE,
2969         NT_PRXFPREG,
2970         NT_PPC_VMX,
2971         NT_PPC_SPE,
2972         NT_PPC_VSX,
2973         NT_PPC_TAR,
2974         NT_PPC_PPR,
2975         NT_PPC_DSCR,
2976         NT_PPC_EBB,
2977         NT_PPC_PMU,
2978         NT_PPC_TM_CGPR,
2979         NT_PPC_TM_CFPR,
2980         NT_PPC_TM_CVMX,
2981         NT_PPC_TM_CVSX,
2982         NT_PPC_TM_SPR,
2983         NT_PPC_TM_CTAR,
2984         NT_PPC_TM_CPPR,
2985         NT_PPC_TM_CDSCR,
2986         NT_PPC_PKEY,
2987         NT_386_TLS,
2988         NT_386_IOPERM,
2989         NT_X86_XSTATE,
2990         NT_S390_HIGH_GPRS,
2991         NT_S390_TIMER,
2992         NT_S390_TODCMP,
2993         NT_S390_TODPREG,
2994         NT_S390_CTRS,
2995         NT_S390_PREFIX,
2996         NT_S390_LAST_BREAK,
2997         NT_S390_SYSTEM_CALL,
2998         NT_S390_TDB,
2999         NT_S390_VXRS_LOW,
3000         NT_S390_VXRS_HIGH,
3001         NT_S390_GS_CB,
3002         NT_S390_GS_BC,
3003         NT_S390_RI_CB,
3004         NT_ARM_VFP,
3005         NT_ARM_TLS,
3006         NT_ARM_HW_BREAK,
3007         NT_ARM_HW_WATCH,
3008         NT_ARM_SYSTEM_CALL,
3009         NT_ARM_SVE,
3010         NT_VMCOREDD,
3011         NT_MIPS_DSP,
3012         NT_MIPS_FP_MODE,
3013     );
3014     static FLAGS_NT_SOLARIS: &[Flag<u32>] = &flags!(NT_SOLARIS_PAGESIZE_HINT);
3015     static FLAGS_NT_GNU: &[Flag<u32>] = &flags!(
3016         NT_GNU_ABI_TAG,
3017         NT_GNU_HWCAP,
3018         NT_GNU_BUILD_ID,
3019         NT_GNU_GOLD_VERSION,
3020         NT_GNU_PROPERTY_TYPE_0,
3021     );
3022     static FLAGS_GRP: &[Flag<u32>] = &flags!(GRP_COMDAT);
3023     static FLAGS_DT: &[Flag<u32>] = &flags!(
3024         DT_NULL,
3025         DT_NEEDED,
3026         DT_PLTRELSZ,
3027         DT_PLTGOT,
3028         DT_HASH,
3029         DT_STRTAB,
3030         DT_SYMTAB,
3031         DT_RELA,
3032         DT_RELASZ,
3033         DT_RELAENT,
3034         DT_STRSZ,
3035         DT_SYMENT,
3036         DT_INIT,
3037         DT_FINI,
3038         DT_SONAME,
3039         DT_RPATH,
3040         DT_SYMBOLIC,
3041         DT_REL,
3042         DT_RELSZ,
3043         DT_RELENT,
3044         DT_PLTREL,
3045         DT_DEBUG,
3046         DT_TEXTREL,
3047         DT_JMPREL,
3048         DT_BIND_NOW,
3049         DT_INIT_ARRAY,
3050         DT_FINI_ARRAY,
3051         DT_INIT_ARRAYSZ,
3052         DT_FINI_ARRAYSZ,
3053         DT_RUNPATH,
3054         DT_FLAGS,
3055         DT_PREINIT_ARRAY,
3056         DT_PREINIT_ARRAYSZ,
3057         DT_SYMTAB_SHNDX,
3058         DT_GNU_PRELINKED,
3059         DT_GNU_CONFLICTSZ,
3060         DT_GNU_LIBLISTSZ,
3061         DT_CHECKSUM,
3062         DT_PLTPADSZ,
3063         DT_MOVEENT,
3064         DT_MOVESZ,
3065         DT_FEATURE_1,
3066         DT_POSFLAG_1,
3067         DT_SYMINSZ,
3068         DT_SYMINENT,
3069         DT_GNU_HASH,
3070         DT_TLSDESC_PLT,
3071         DT_TLSDESC_GOT,
3072         DT_GNU_CONFLICT,
3073         DT_GNU_LIBLIST,
3074         DT_CONFIG,
3075         DT_DEPAUDIT,
3076         DT_AUDIT,
3077         DT_PLTPAD,
3078         DT_MOVETAB,
3079         DT_SYMINFO,
3080         DT_VERSYM,
3081         DT_RELACOUNT,
3082         DT_RELCOUNT,
3083         DT_FLAGS_1,
3084         DT_VERDEF,
3085         DT_VERDEFNUM,
3086         DT_VERNEED,
3087         DT_VERNEEDNUM,
3088         DT_AUXILIARY,
3089         DT_FILTER,
3090     );
3091     static FLAGS_DT_SPARC: &[Flag<u32>] = &flags!(DT_SPARC_REGISTER);
3092     static FLAGS_DT_MIPS: &[Flag<u32>] = &flags!(
3093         DT_MIPS_RLD_VERSION,
3094         DT_MIPS_TIME_STAMP,
3095         DT_MIPS_ICHECKSUM,
3096         DT_MIPS_IVERSION,
3097         DT_MIPS_FLAGS,
3098         DT_MIPS_BASE_ADDRESS,
3099         DT_MIPS_MSYM,
3100         DT_MIPS_CONFLICT,
3101         DT_MIPS_LIBLIST,
3102         DT_MIPS_LOCAL_GOTNO,
3103         DT_MIPS_CONFLICTNO,
3104         DT_MIPS_LIBLISTNO,
3105         DT_MIPS_SYMTABNO,
3106         DT_MIPS_UNREFEXTNO,
3107         DT_MIPS_GOTSYM,
3108         DT_MIPS_HIPAGENO,
3109         DT_MIPS_RLD_MAP,
3110         DT_MIPS_DELTA_CLASS,
3111         DT_MIPS_DELTA_CLASS_NO,
3112         DT_MIPS_DELTA_INSTANCE,
3113         DT_MIPS_DELTA_INSTANCE_NO,
3114         DT_MIPS_DELTA_RELOC,
3115         DT_MIPS_DELTA_RELOC_NO,
3116         DT_MIPS_DELTA_SYM,
3117         DT_MIPS_DELTA_SYM_NO,
3118         DT_MIPS_DELTA_CLASSSYM,
3119         DT_MIPS_DELTA_CLASSSYM_NO,
3120         DT_MIPS_CXX_FLAGS,
3121         DT_MIPS_PIXIE_INIT,
3122         DT_MIPS_SYMBOL_LIB,
3123         DT_MIPS_LOCALPAGE_GOTIDX,
3124         DT_MIPS_LOCAL_GOTIDX,
3125         DT_MIPS_HIDDEN_GOTIDX,
3126         DT_MIPS_PROTECTED_GOTIDX,
3127         DT_MIPS_OPTIONS,
3128         DT_MIPS_INTERFACE,
3129         DT_MIPS_DYNSTR_ALIGN,
3130         DT_MIPS_INTERFACE_SIZE,
3131         DT_MIPS_RLD_TEXT_RESOLVE_ADDR,
3132         DT_MIPS_PERF_SUFFIX,
3133         DT_MIPS_COMPACT_SIZE,
3134         DT_MIPS_GP_VALUE,
3135         DT_MIPS_AUX_DYNAMIC,
3136         DT_MIPS_PLTGOT,
3137         DT_MIPS_RWPLT,
3138         DT_MIPS_RLD_MAP_REL,
3139     );
3140     static FLAGS_DT_ALPHA: &[Flag<u32>] = &flags!(DT_ALPHA_PLTRO);
3141     static FLAGS_DT_PPC: &[Flag<u32>] = &flags!(DT_PPC_GOT, DT_PPC_OPT);
3142     static FLAGS_DT_PPC64: &[Flag<u32>] =
3143         &flags!(DT_PPC64_GLINK, DT_PPC64_OPD, DT_PPC64_OPDSZ, DT_PPC64_OPT);
3144     static FLAGS_DT_IA_64: &[Flag<u32>] = &flags!(DT_IA_64_PLT_RESERVE);
3145     static FLAGS_DT_NIOS2: &[Flag<u32>] = &flags!(DT_NIOS2_GP);
3146     static FLAGS_DF: &[Flag<u32>] = &flags!(
3147         DF_ORIGIN,
3148         DF_SYMBOLIC,
3149         DF_TEXTREL,
3150         DF_BIND_NOW,
3151         DF_STATIC_TLS,
3152     );
3153     static FLAGS_DF_1: &[Flag<u32>] = &flags!(
3154         DF_1_NOW,
3155         DF_1_GLOBAL,
3156         DF_1_GROUP,
3157         DF_1_NODELETE,
3158         DF_1_LOADFLTR,
3159         DF_1_INITFIRST,
3160         DF_1_NOOPEN,
3161         DF_1_ORIGIN,
3162         DF_1_DIRECT,
3163         DF_1_TRANS,
3164         DF_1_INTERPOSE,
3165         DF_1_NODEFLIB,
3166         DF_1_NODUMP,
3167         DF_1_CONFALT,
3168         DF_1_ENDFILTEE,
3169         DF_1_DISPRELDNE,
3170         DF_1_DISPRELPND,
3171         DF_1_NODIRECT,
3172         DF_1_IGNMULDEF,
3173         DF_1_NOKSYMS,
3174         DF_1_NOHDR,
3175         DF_1_EDITED,
3176         DF_1_NORELOC,
3177         DF_1_SYMINTPOSE,
3178         DF_1_GLOBAUDIT,
3179         DF_1_SINGLETON,
3180         DF_1_STUB,
3181         DF_1_PIE,
3182     );
3183 }
3184 
3185 mod macho {
3186     use super::*;
3187     use object::macho::*;
3188     use object::read::macho::*;
3189     use object::BigEndian;
3190 
print_dyld_cache(p: &mut Printer<impl Write>, data: &[u8])3191     pub(super) fn print_dyld_cache(p: &mut Printer<impl Write>, data: &[u8]) {
3192         if let Ok(header) = DyldCacheHeader::<Endianness>::parse(data) {
3193             if let Ok((_, endian)) = header.parse_magic() {
3194                 print_dyld_cache_header(p, endian, header);
3195                 let mappings = header.mappings(endian, data).ok();
3196                 if let Some(mappings) = mappings {
3197                     print_dyld_cache_mappings(p, endian, mappings);
3198                 }
3199                 if let Ok(images) = header.images(endian, data) {
3200                     print_dyld_cache_images(p, endian, data, mappings, images);
3201                 }
3202             }
3203         }
3204     }
3205 
print_dyld_cache_header( p: &mut Printer<impl Write>, endian: Endianness, header: &DyldCacheHeader<Endianness>, )3206     pub(super) fn print_dyld_cache_header(
3207         p: &mut Printer<impl Write>,
3208         endian: Endianness,
3209         header: &DyldCacheHeader<Endianness>,
3210     ) {
3211         p.group("DyldCacheHeader", |p| {
3212             p.field_bytes("Magic", &header.magic);
3213             p.field_hex("MappingOffset", header.mapping_offset.get(endian));
3214             p.field("MappingCount", header.mapping_count.get(endian));
3215             p.field_hex("ImagesOffset", header.images_offset.get(endian));
3216             p.field("ImagesCount", header.images_count.get(endian));
3217             p.field_hex("DyldBaseAddress", header.dyld_base_address.get(endian));
3218         });
3219     }
3220 
print_dyld_cache_mappings( p: &mut Printer<impl Write>, endian: Endianness, mappings: &[DyldCacheMappingInfo<Endianness>], )3221     pub(super) fn print_dyld_cache_mappings(
3222         p: &mut Printer<impl Write>,
3223         endian: Endianness,
3224         mappings: &[DyldCacheMappingInfo<Endianness>],
3225     ) {
3226         for mapping in mappings {
3227             p.group("DyldCacheMappingInfo", |p| {
3228                 p.field_hex("Address", mapping.address.get(endian));
3229                 p.field_hex("Size", mapping.size.get(endian));
3230                 p.field_hex("FileOffset", mapping.file_offset.get(endian));
3231                 p.field_hex("MaxProt", mapping.max_prot.get(endian));
3232                 p.flags(mapping.max_prot.get(endian), 0, FLAGS_VM);
3233                 p.field_hex("InitProt", mapping.init_prot.get(endian));
3234                 p.flags(mapping.init_prot.get(endian), 0, FLAGS_VM);
3235             });
3236         }
3237     }
3238 
print_dyld_cache_images( p: &mut Printer<impl Write>, endian: Endianness, data: &[u8], mappings: Option<&[DyldCacheMappingInfo<Endianness>]>, images: &[DyldCacheImageInfo<Endianness>], )3239     pub(super) fn print_dyld_cache_images(
3240         p: &mut Printer<impl Write>,
3241         endian: Endianness,
3242         data: &[u8],
3243         mappings: Option<&[DyldCacheMappingInfo<Endianness>]>,
3244         images: &[DyldCacheImageInfo<Endianness>],
3245     ) {
3246         for image in images {
3247             p.group("DyldCacheImageInfo", |p| {
3248                 p.field_hex("Address", image.address.get(endian));
3249                 p.field_hex("ModTime", image.mod_time.get(endian));
3250                 p.field_hex("Inode", image.inode.get(endian));
3251                 p.field_string(
3252                     "Path",
3253                     image.path_file_offset.get(endian),
3254                     image.path(endian, data).ok(),
3255                 );
3256                 p.field_hex("Pad", image.pad.get(endian));
3257             });
3258             if let Some(offset) =
3259                 mappings.and_then(|mappings| image.file_offset(endian, mappings).ok())
3260             {
3261                 p.blank();
3262                 print_object_at(p, data, offset);
3263                 p.blank();
3264             }
3265         }
3266     }
3267 
print_macho_fat32(p: &mut Printer<impl Write>, data: &[u8])3268     pub(super) fn print_macho_fat32(p: &mut Printer<impl Write>, data: &[u8]) {
3269         if let Ok(arches) = FatHeader::parse_arch32(data) {
3270             println!("Format: Mach-O Fat 32-bit");
3271             print_fat_header(p, data);
3272             for arch in arches {
3273                 print_fat_arch(p, arch);
3274             }
3275             for arch in arches {
3276                 if let Ok(data) = arch.data(data) {
3277                     p.blank();
3278                     print_object(p, data);
3279                 }
3280             }
3281         }
3282     }
3283 
print_macho_fat64(p: &mut Printer<impl Write>, data: &[u8])3284     pub(super) fn print_macho_fat64(p: &mut Printer<impl Write>, data: &[u8]) {
3285         if let Ok(arches) = FatHeader::parse_arch64(data) {
3286             println!("Format: Mach-O Fat 64-bit");
3287             print_fat_header(p, data);
3288             for arch in arches {
3289                 print_fat_arch(p, arch);
3290             }
3291             for arch in arches {
3292                 if let Ok(data) = arch.data(data) {
3293                     p.blank();
3294                     print_object(p, data);
3295                 }
3296             }
3297         }
3298     }
3299 
print_fat_header(p: &mut Printer<impl Write>, data: &[u8])3300     pub(super) fn print_fat_header(p: &mut Printer<impl Write>, data: &[u8]) {
3301         if let Ok(header) = FatHeader::parse(data) {
3302             p.group("FatHeader", |p| {
3303                 p.field_hex("Magic", header.magic.get(BigEndian));
3304                 p.field("NumberOfFatArch", header.nfat_arch.get(BigEndian));
3305             });
3306         }
3307     }
3308 
print_fat_arch<Arch: FatArch>(p: &mut Printer<impl Write>, arch: &Arch)3309     pub(super) fn print_fat_arch<Arch: FatArch>(p: &mut Printer<impl Write>, arch: &Arch) {
3310         p.group("FatArch", |p| {
3311             print_cputype(p, arch.cputype(), arch.cpusubtype());
3312             p.field_hex("Offset", arch.offset().into());
3313             p.field_hex("Size", arch.size().into());
3314             p.field("Align", arch.align());
3315         });
3316     }
3317 
print_macho32(p: &mut Printer<impl Write>, data: &[u8], offset: u64)3318     pub(super) fn print_macho32(p: &mut Printer<impl Write>, data: &[u8], offset: u64) {
3319         if let Ok(header) = MachHeader32::parse(data, offset) {
3320             println!("Format: Mach-O 32-bit");
3321             print_macho(p, header, data, offset);
3322         }
3323     }
3324 
print_macho64(p: &mut Printer<impl Write>, data: &[u8], offset: u64)3325     pub(super) fn print_macho64(p: &mut Printer<impl Write>, data: &[u8], offset: u64) {
3326         if let Ok(header) = MachHeader64::parse(data, offset) {
3327             println!("Format: Mach-O 64-bit");
3328             print_macho(p, header, data, offset);
3329         }
3330     }
3331 
3332     #[derive(Default)]
3333     struct MachState {
3334         section_index: usize,
3335     }
3336 
print_macho<Mach: MachHeader<Endian = Endianness>>( p: &mut Printer<impl Write>, header: &Mach, data: &[u8], offset: u64, )3337     fn print_macho<Mach: MachHeader<Endian = Endianness>>(
3338         p: &mut Printer<impl Write>,
3339         header: &Mach,
3340         data: &[u8],
3341         offset: u64,
3342     ) {
3343         if let Ok(endian) = header.endian() {
3344             let mut state = MachState::default();
3345             print_mach_header(p, endian, header);
3346             if let Ok(mut commands) = header.load_commands(endian, data, offset) {
3347                 while let Ok(Some(command)) = commands.next() {
3348                     print_load_command(p, endian, data, header, command, &mut state);
3349                 }
3350             }
3351         }
3352     }
3353 
print_mach_header<Mach: MachHeader>( p: &mut Printer<impl Write>, endian: Mach::Endian, header: &Mach, )3354     fn print_mach_header<Mach: MachHeader>(
3355         p: &mut Printer<impl Write>,
3356         endian: Mach::Endian,
3357         header: &Mach,
3358     ) {
3359         p.group("MachHeader", |p| {
3360             p.field_hex("Magic", header.magic().to_be());
3361             print_cputype(p, header.cputype(endian), header.cpusubtype(endian));
3362             p.field_enum("FileType", header.filetype(endian), FLAGS_MH_FILETYPE);
3363             p.field("NumberOfCmds", header.ncmds(endian));
3364             p.field_hex("SizeOfCmds", header.sizeofcmds(endian));
3365             p.field_enum("Flags", header.flags(endian), FLAGS_MH);
3366         });
3367     }
3368 
print_load_command<Mach: MachHeader>( p: &mut Printer<impl Write>, endian: Mach::Endian, data: &[u8], header: &Mach, command: LoadCommandData<Mach::Endian>, state: &mut MachState, )3369     fn print_load_command<Mach: MachHeader>(
3370         p: &mut Printer<impl Write>,
3371         endian: Mach::Endian,
3372         data: &[u8],
3373         header: &Mach,
3374         command: LoadCommandData<Mach::Endian>,
3375         state: &mut MachState,
3376     ) {
3377         if let Ok(variant) = command.variant() {
3378             match variant {
3379                 LoadCommandVariant::Segment32(segment, section_data) => {
3380                     print_segment(
3381                         p,
3382                         endian,
3383                         data,
3384                         header.cputype(endian),
3385                         segment,
3386                         section_data,
3387                         state,
3388                     );
3389                 }
3390                 LoadCommandVariant::Segment64(segment, section_data) => {
3391                     print_segment(
3392                         p,
3393                         endian,
3394                         data,
3395                         header.cputype(endian),
3396                         segment,
3397                         section_data,
3398                         state,
3399                     );
3400                 }
3401                 LoadCommandVariant::Symtab(symtab) => {
3402                     print_symtab::<Mach, _>(p, endian, data, symtab);
3403                 }
3404                 LoadCommandVariant::Thread(x, _thread_data) => {
3405                     p.group("ThreadCommand", |p| {
3406                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3407                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3408                         // TODO: thread_data
3409                     });
3410                 }
3411                 LoadCommandVariant::Dysymtab(x) => {
3412                     p.group("DysymtabCommand", |p| {
3413                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3414                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3415                         // TODO: dump the tables these are all pointing to
3416                         p.field("IndexOfLocalSymbols", x.ilocalsym.get(endian));
3417                         p.field("NumberOfLocalSymbols", x.nlocalsym.get(endian));
3418                         p.field("IndexOfExternallyDefinedSymbols", x.iextdefsym.get(endian));
3419                         p.field("NumberOfExternallyDefinedSymbols", x.nextdefsym.get(endian));
3420                         p.field("IndexOfUndefinedSymbols", x.iundefsym.get(endian));
3421                         p.field("NumberOfUndefinedSymbols", x.nundefsym.get(endian));
3422                         p.field_hex("TocOffset", x.tocoff.get(endian));
3423                         p.field("NumberOfTocEntries", x.ntoc.get(endian));
3424                         p.field_hex("ModuleTableOffset", x.modtaboff.get(endian));
3425                         p.field("NumberOfModuleTableEntries", x.nmodtab.get(endian));
3426                         p.field_hex("ExternalRefSymbolOffset", x.extrefsymoff.get(endian));
3427                         p.field("NumberOfExternalRefSymbols", x.nextrefsyms.get(endian));
3428                         p.field_hex("IndirectSymbolOffset", x.indirectsymoff.get(endian));
3429                         p.field("NumberOfIndirectSymbols", x.nindirectsyms.get(endian));
3430                         p.field_hex("ExternalRelocationOffset", x.extreloff.get(endian));
3431                         p.field("NumberOfExternalRelocations", x.nextrel.get(endian));
3432                         p.field_hex("LocalRelocationOffset", x.locreloff.get(endian));
3433                         p.field("NumberOfLocalRelocations", x.nlocrel.get(endian));
3434                     });
3435                 }
3436                 LoadCommandVariant::Dylib(x) | LoadCommandVariant::IdDylib(x) => {
3437                     p.group("DylibCommand", |p| {
3438                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3439                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3440                         p.group("Dylib", |p| {
3441                             p.field_string(
3442                                 "Name",
3443                                 x.dylib.name.offset.get(endian),
3444                                 command.string(endian, x.dylib.name).ok(),
3445                             );
3446                             p.field("Timestamp", x.dylib.timestamp.get(endian));
3447                             p.field_hex("CurrentVersion", x.dylib.current_version.get(endian));
3448                             p.field_hex(
3449                                 "CompatibilityVersion",
3450                                 x.dylib.compatibility_version.get(endian),
3451                             );
3452                         });
3453                     });
3454                 }
3455                 LoadCommandVariant::LoadDylinker(x)
3456                 | LoadCommandVariant::IdDylinker(x)
3457                 | LoadCommandVariant::DyldEnvironment(x) => {
3458                     p.group("DylinkerCommand", |p| {
3459                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3460                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3461                         p.field_string(
3462                             "Name",
3463                             x.name.offset.get(endian),
3464                             command.string(endian, x.name).ok(),
3465                         );
3466                     });
3467                 }
3468                 LoadCommandVariant::PreboundDylib(x) => {
3469                     p.group("PreboundDylibCommand", |p| {
3470                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3471                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3472                         p.field_string(
3473                             "Name",
3474                             x.name.offset.get(endian),
3475                             command.string(endian, x.name).ok(),
3476                         );
3477                         p.field("NumberOfModules", x.nmodules.get(endian));
3478                         // TODO: display bit vector
3479                         p.field_hex("LinkedModules", x.linked_modules.offset.get(endian));
3480                     });
3481                 }
3482                 LoadCommandVariant::Routines32(x) => {
3483                     p.group("RoutinesCommand32", |p| {
3484                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3485                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3486                         p.field_hex("InitAddress", x.init_address.get(endian));
3487                         p.field_hex("InitModule", x.init_module.get(endian));
3488                         p.field_hex("Reserved1", x.reserved1.get(endian));
3489                         p.field_hex("Reserved2", x.reserved2.get(endian));
3490                         p.field_hex("Reserved3", x.reserved3.get(endian));
3491                         p.field_hex("Reserved4", x.reserved4.get(endian));
3492                         p.field_hex("Reserved5", x.reserved5.get(endian));
3493                         p.field_hex("Reserved6", x.reserved6.get(endian));
3494                     });
3495                 }
3496                 LoadCommandVariant::Routines64(x) => {
3497                     p.group("RoutinesCommand64", |p| {
3498                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3499                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3500                         p.field_hex("InitAddress", x.init_address.get(endian));
3501                         p.field_hex("InitModule", x.init_module.get(endian));
3502                         p.field_hex("Reserved1", x.reserved1.get(endian));
3503                         p.field_hex("Reserved2", x.reserved2.get(endian));
3504                         p.field_hex("Reserved3", x.reserved3.get(endian));
3505                         p.field_hex("Reserved4", x.reserved4.get(endian));
3506                         p.field_hex("Reserved5", x.reserved5.get(endian));
3507                         p.field_hex("Reserved6", x.reserved6.get(endian));
3508                     });
3509                 }
3510                 LoadCommandVariant::SubFramework(x) => {
3511                     p.group("SubFrameworkCommand", |p| {
3512                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3513                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3514                         p.field_string(
3515                             "Umbrella",
3516                             x.umbrella.offset.get(endian),
3517                             command.string(endian, x.umbrella).ok(),
3518                         );
3519                     });
3520                 }
3521                 LoadCommandVariant::SubUmbrella(x) => {
3522                     p.group("SubUmbrellaCommand", |p| {
3523                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3524                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3525                         p.field_string(
3526                             "SubUmbrella",
3527                             x.sub_umbrella.offset.get(endian),
3528                             command.string(endian, x.sub_umbrella).ok(),
3529                         );
3530                     });
3531                 }
3532                 LoadCommandVariant::SubClient(x) => {
3533                     p.group("SubClientCommand", |p| {
3534                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3535                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3536                         p.field_string(
3537                             "Client",
3538                             x.client.offset.get(endian),
3539                             command.string(endian, x.client).ok(),
3540                         );
3541                     });
3542                 }
3543                 LoadCommandVariant::SubLibrary(x) => {
3544                     p.group("SubLibraryCommand", |p| {
3545                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3546                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3547                         p.field_string(
3548                             "SubLibrary",
3549                             x.sub_library.offset.get(endian),
3550                             command.string(endian, x.sub_library).ok(),
3551                         );
3552                     });
3553                 }
3554                 LoadCommandVariant::TwolevelHints(x) => {
3555                     p.group("TwolevelHintsCommand", |p| {
3556                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3557                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3558                         p.field_hex("Offset", x.offset.get(endian));
3559                         p.field_hex("NumberOfHints", x.nhints.get(endian));
3560                         // TODO: display hints
3561                     });
3562                 }
3563                 LoadCommandVariant::PrebindCksum(x) => {
3564                     p.group("PrebindCksumCommand", |p| {
3565                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3566                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3567                         p.field_hex("Cksum", x.cksum.get(endian));
3568                     });
3569                 }
3570                 LoadCommandVariant::Uuid(x) => {
3571                     p.group("UuidCommand", |p| {
3572                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3573                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3574                         p.field("Uuid", format!("{:X?}", x.uuid));
3575                     });
3576                 }
3577                 LoadCommandVariant::Rpath(x) => {
3578                     p.group("RpathCommand", |p| {
3579                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3580                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3581                         p.field_string(
3582                             "Path",
3583                             x.path.offset.get(endian),
3584                             command.string(endian, x.path).ok(),
3585                         );
3586                     });
3587                 }
3588                 LoadCommandVariant::LinkeditData(x) => {
3589                     p.group("LinkeditDataCommand", |p| {
3590                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3591                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3592                         p.field_hex("DataOffset", x.dataoff.get(endian));
3593                         p.field_hex("DataSize", x.datasize.get(endian));
3594                     });
3595                 }
3596                 LoadCommandVariant::EncryptionInfo32(x) => {
3597                     p.group("EncryptionInfoCommand32", |p| {
3598                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3599                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3600                         p.field_hex("CryptOffset", x.cryptoff.get(endian));
3601                         p.field_hex("CryptSize", x.cryptsize.get(endian));
3602                         p.field_hex("CryptId", x.cryptid.get(endian));
3603                     });
3604                 }
3605                 LoadCommandVariant::EncryptionInfo64(x) => {
3606                     p.group("EncryptionInfoCommand64", |p| {
3607                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3608                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3609                         p.field_hex("CryptOffset", x.cryptoff.get(endian));
3610                         p.field_hex("CryptSize", x.cryptsize.get(endian));
3611                         p.field_hex("CryptId", x.cryptid.get(endian));
3612                         p.field_hex("Pad", x.pad.get(endian));
3613                     });
3614                 }
3615                 LoadCommandVariant::DyldInfo(x) => {
3616                     p.group("DyldInfoCommand", |p| {
3617                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3618                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3619                         // TODO: dump the tables these are all pointing to
3620                         p.field_hex("RebaseOffset", x.rebase_off.get(endian));
3621                         p.field_hex("RebaseSize", x.rebase_size.get(endian));
3622                         p.field_hex("BindOffset", x.bind_off.get(endian));
3623                         p.field_hex("BindSize", x.bind_size.get(endian));
3624                         p.field_hex("WeakBindOffset", x.weak_bind_off.get(endian));
3625                         p.field_hex("WeakBindSize", x.weak_bind_size.get(endian));
3626                         p.field_hex("LazyBindOffset", x.lazy_bind_off.get(endian));
3627                         p.field_hex("LazyBindSize", x.lazy_bind_size.get(endian));
3628                         p.field_hex("ExportOffset", x.export_off.get(endian));
3629                         p.field_hex("ExportSize", x.export_size.get(endian));
3630                     });
3631                 }
3632                 LoadCommandVariant::VersionMin(x) => {
3633                     p.group("VersionMinCommand", |p| {
3634                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3635                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3636                         p.field_hex("Version", x.version.get(endian));
3637                         p.field_hex("Sdk", x.sdk.get(endian));
3638                     });
3639                 }
3640                 LoadCommandVariant::EntryPoint(x) => {
3641                     p.group("EntryPointCommand", |p| {
3642                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3643                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3644                         p.field_hex("EntryOffset", x.entryoff.get(endian));
3645                         p.field_hex("StackSize", x.stacksize.get(endian));
3646                     });
3647                 }
3648                 LoadCommandVariant::SourceVersion(x) => {
3649                     p.group("SourceVersionCommand", |p| {
3650                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3651                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3652                         p.field_hex("Version", x.version.get(endian));
3653                     });
3654                 }
3655                 LoadCommandVariant::LinkerOption(x) => {
3656                     p.group("LinkerOptionCommand", |p| {
3657                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3658                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3659                         p.field_hex("Count", x.count.get(endian));
3660                         // TODO: dump strings
3661                     });
3662                 }
3663                 LoadCommandVariant::Note(x) => {
3664                     p.group("NoteCommand", |p| {
3665                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3666                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3667                         // TODO: string?
3668                         p.field("DataOwner", format!("{:X?}", x.data_owner));
3669                         p.field_hex("Offset", x.offset.get(endian));
3670                         p.field_hex("Size", x.size.get(endian));
3671                     });
3672                 }
3673                 LoadCommandVariant::BuildVersion(x) => {
3674                     p.group("BuildVersionCommand", |p| {
3675                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3676                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3677                         p.field_enum("Platform", x.platform.get(endian), FLAGS_PLATFORM);
3678                         p.field_hex("MinOs", x.minos.get(endian));
3679                         p.field_hex("Sdk", x.sdk.get(endian));
3680                         p.field_hex("NumberOfTools", x.ntools.get(endian));
3681                         // TODO: dump tools
3682                     });
3683                 }
3684                 LoadCommandVariant::FilesetEntry(x) => {
3685                     p.group("FilesetEntryCommand", |p| {
3686                         p.field_enum("Cmd", x.cmd.get(endian), FLAGS_LC);
3687                         p.field_hex("CmdSize", x.cmdsize.get(endian));
3688                         p.field_hex("VmAddress", x.vmaddr.get(endian));
3689                         p.field_hex("FileOffset", x.fileoff.get(endian));
3690                         p.field_string(
3691                             "EntryId",
3692                             x.entry_id.offset.get(endian),
3693                             command.string(endian, x.entry_id).ok(),
3694                         );
3695                         p.field_hex("Reserved", x.reserved.get(endian));
3696                     });
3697                 }
3698                 _ => {
3699                     p.group("LoadCommand", |p| {
3700                         p.field_enum("Cmd", command.cmd(), FLAGS_LC);
3701                         p.field_hex("CmdSize", command.cmdsize());
3702                     });
3703                 }
3704             }
3705         } else {
3706             p.group("LoadCommand", |p| {
3707                 p.field_enum("Cmd", command.cmd(), FLAGS_LC);
3708                 p.field_hex("CmdSize", command.cmdsize());
3709             });
3710         }
3711     }
3712 
print_segment<S: Segment>( p: &mut Printer<impl Write>, endian: S::Endian, data: &[u8], cputype: u32, segment: &S, section_data: &[u8], state: &mut MachState, )3713     fn print_segment<S: Segment>(
3714         p: &mut Printer<impl Write>,
3715         endian: S::Endian,
3716         data: &[u8],
3717         cputype: u32,
3718         segment: &S,
3719         section_data: &[u8],
3720         state: &mut MachState,
3721     ) {
3722         p.group("SegmentCommand", |p| {
3723             p.field_enum("Cmd", segment.cmd(endian), FLAGS_LC);
3724             p.field_hex("CmdSize", segment.cmdsize(endian));
3725             p.field_inline_string("SegmentName", segment.name());
3726             p.field_hex("VmAddress", segment.vmaddr(endian).into());
3727             p.field_hex("VmSize", segment.vmsize(endian).into());
3728             p.field_hex("FileOffset", segment.fileoff(endian).into());
3729             p.field_hex("FileSize", segment.filesize(endian).into());
3730             p.field_hex("MaxProt", segment.maxprot(endian));
3731             p.flags(segment.maxprot(endian), 0, FLAGS_VM);
3732             p.field_hex("InitProt", segment.initprot(endian));
3733             p.flags(segment.initprot(endian), 0, FLAGS_VM);
3734             p.field("NumberOfSections", segment.nsects(endian));
3735             p.field_hex("Flags", segment.flags(endian));
3736             p.flags(segment.flags(endian), 0, FLAGS_SG);
3737             if let Ok(sections) = segment.sections(endian, section_data) {
3738                 for section in sections {
3739                     print_section(p, endian, data, cputype, section, state);
3740                 }
3741             }
3742         });
3743     }
3744 
print_section<S: Section>( p: &mut Printer<impl Write>, endian: S::Endian, data: &[u8], cputype: u32, section: &S, state: &mut MachState, )3745     fn print_section<S: Section>(
3746         p: &mut Printer<impl Write>,
3747         endian: S::Endian,
3748         data: &[u8],
3749         cputype: u32,
3750         section: &S,
3751         state: &mut MachState,
3752     ) {
3753         p.group("Section", |p| {
3754             p.field("Index", state.section_index);
3755             state.section_index += 1;
3756             p.field_inline_string("SectionName", section.name());
3757             p.field_inline_string("SegmentName", section.segment_name());
3758             p.field_hex("Address", section.addr(endian).into());
3759             p.field_hex("Size", section.size(endian).into());
3760             p.field_hex("Offset", section.offset(endian));
3761             p.field_hex("Align", section.align(endian));
3762             p.field_hex("RelocationOffset", section.reloff(endian));
3763             p.field_hex("NumberOfRelocations", section.nreloc(endian));
3764             let flags = section.flags(endian);
3765             if flags & SECTION_TYPE == flags {
3766                 p.field_enum("Flags", flags, FLAGS_S_TYPE);
3767             } else {
3768                 p.field_hex("Flags", section.flags(endian));
3769                 p.flags(flags, SECTION_TYPE, FLAGS_S_TYPE);
3770                 p.flags(flags, 0, FLAGS_S_ATTR);
3771             }
3772             if let Ok(relocations) = section.relocations(endian, data) {
3773                 let proc = match cputype {
3774                     CPU_TYPE_X86 => FLAGS_GENERIC_RELOC,
3775                     CPU_TYPE_X86_64 => FLAGS_X86_64_RELOC,
3776                     CPU_TYPE_ARM => FLAGS_ARM_RELOC,
3777                     CPU_TYPE_ARM64 | CPU_TYPE_ARM64_32 => FLAGS_ARM64_RELOC,
3778                     CPU_TYPE_POWERPC | CPU_TYPE_POWERPC64 => FLAGS_PPC_RELOC,
3779                     _ => &[],
3780                 };
3781                 for relocation in relocations {
3782                     if relocation.r_scattered(endian, cputype) {
3783                         let info = relocation.scattered_info(endian);
3784                         p.group("ScatteredRelocationInfo", |p| {
3785                             p.field_hex("Address", info.r_address);
3786                             p.field("PcRel", if info.r_pcrel { "yes" } else { "no" });
3787                             p.field("Length", info.r_length);
3788                             p.field_enum("Type", info.r_type, proc);
3789                             p.field_hex("Value", info.r_value);
3790                         });
3791                     } else {
3792                         let info = relocation.info(endian);
3793                         p.group("RelocationInfo", |p| {
3794                             p.field_hex("Address", info.r_address);
3795                             if info.r_extern {
3796                                 // TODO: symbol name
3797                                 p.field("Symbol", info.r_symbolnum);
3798                             } else {
3799                                 p.field("Section", info.r_symbolnum);
3800                             }
3801                             p.field("PcRel", if info.r_pcrel { "yes" } else { "no" });
3802                             p.field("Length", info.r_length);
3803                             p.field("Extern", if info.r_extern { "yes" } else { "no" });
3804                             p.field_enum("Type", info.r_type, proc);
3805                         });
3806                     }
3807                 }
3808             }
3809         });
3810     }
3811 
print_symtab<Mach: MachHeader, W: Write>( p: &mut Printer<W>, endian: Mach::Endian, data: &[u8], symtab: &SymtabCommand<Mach::Endian>, )3812     fn print_symtab<Mach: MachHeader, W: Write>(
3813         p: &mut Printer<W>,
3814         endian: Mach::Endian,
3815         data: &[u8],
3816         symtab: &SymtabCommand<Mach::Endian>,
3817     ) {
3818         p.group("SymtabCommand", |p| {
3819             p.field_enum("Cmd", symtab.cmd.get(endian), FLAGS_LC);
3820             p.field_hex("CmdSize", symtab.cmdsize.get(endian));
3821             p.field_hex("SymbolOffset", symtab.symoff.get(endian));
3822             p.field_hex("NumberOfSymbols", symtab.nsyms.get(endian));
3823             p.field_hex("StringOffset", symtab.stroff.get(endian));
3824             p.field_hex("StringSize", symtab.strsize.get(endian));
3825             if let Ok(symbols) = symtab.symbols::<Mach, _>(endian, data) {
3826                 for (index, nlist) in symbols.iter().enumerate() {
3827                     p.group("Nlist", |p| {
3828                         p.field("Index", index);
3829                         p.field_string(
3830                             "String",
3831                             nlist.n_strx(endian),
3832                             nlist.name(endian, symbols.strings()).ok(),
3833                         );
3834                         let n_type = nlist.n_type();
3835                         if nlist.is_stab() {
3836                             p.field_enum("Type", n_type, FLAGS_N_STAB);
3837                         } else if n_type & N_TYPE == n_type {
3838                             // Avoid an extra line if no flags.
3839                             p.field_enum("Type", n_type, FLAGS_N_TYPE);
3840                         } else {
3841                             p.field_hex("Type", n_type);
3842                             p.flags(n_type, N_TYPE, FLAGS_N_TYPE);
3843                             p.flags(n_type, 0, FLAGS_N_EXT);
3844                         }
3845                         p.field("Section", nlist.n_sect());
3846                         let n_desc = nlist.n_desc(endian);
3847                         p.field_hex("Desc", n_desc);
3848                         if nlist.is_undefined() {
3849                             p.flags(n_desc, REFERENCE_TYPE, FLAGS_REFERENCE);
3850                         }
3851                         if !nlist.is_stab() {
3852                             p.flags(n_desc, 0, FLAGS_N_DESC);
3853                         }
3854                         p.field_hex("Value", nlist.n_value(endian).into());
3855                     });
3856                 }
3857             }
3858         });
3859     }
3860 
print_cputype(p: &mut Printer<impl Write>, cputype: u32, cpusubtype: u32)3861     fn print_cputype(p: &mut Printer<impl Write>, cputype: u32, cpusubtype: u32) {
3862         let proc = match cputype {
3863             CPU_TYPE_ANY => FLAGS_CPU_SUBTYPE_ANY,
3864             CPU_TYPE_VAX => FLAGS_CPU_SUBTYPE_VAX,
3865             CPU_TYPE_MC680X0 => FLAGS_CPU_SUBTYPE_MC680X0,
3866             CPU_TYPE_X86 => FLAGS_CPU_SUBTYPE_X86,
3867             CPU_TYPE_X86_64 => FLAGS_CPU_SUBTYPE_X86_64,
3868             CPU_TYPE_MIPS => FLAGS_CPU_SUBTYPE_MIPS,
3869             CPU_TYPE_MC98000 => FLAGS_CPU_SUBTYPE_MC98000,
3870             CPU_TYPE_HPPA => FLAGS_CPU_SUBTYPE_HPPA,
3871             CPU_TYPE_ARM => FLAGS_CPU_SUBTYPE_ARM,
3872             CPU_TYPE_ARM64 => FLAGS_CPU_SUBTYPE_ARM64,
3873             CPU_TYPE_ARM64_32 => FLAGS_CPU_SUBTYPE_ARM64_32,
3874             CPU_TYPE_MC88000 => FLAGS_CPU_SUBTYPE_MC88000,
3875             CPU_TYPE_SPARC => FLAGS_CPU_SUBTYPE_SPARC,
3876             CPU_TYPE_I860 => FLAGS_CPU_SUBTYPE_I860,
3877             CPU_TYPE_POWERPC | CPU_TYPE_POWERPC64 => FLAGS_CPU_SUBTYPE_POWERPC,
3878             _ => &[],
3879         };
3880         p.field_enum("CpuType", cputype, FLAGS_CPU_TYPE);
3881         p.field_hex("CpuSubtype", cpusubtype);
3882         p.flags(cpusubtype, !CPU_SUBTYPE_MASK, proc);
3883         p.flags(cpusubtype, 0, FLAGS_CPU_SUBTYPE);
3884     }
3885 
3886     static FLAGS_CPU_TYPE: &[Flag<u32>] = &flags!(
3887         CPU_TYPE_ANY,
3888         CPU_TYPE_VAX,
3889         CPU_TYPE_MC680X0,
3890         CPU_TYPE_X86,
3891         CPU_TYPE_X86_64,
3892         CPU_TYPE_MIPS,
3893         CPU_TYPE_MC98000,
3894         CPU_TYPE_HPPA,
3895         CPU_TYPE_ARM,
3896         CPU_TYPE_ARM64,
3897         CPU_TYPE_ARM64_32,
3898         CPU_TYPE_MC88000,
3899         CPU_TYPE_SPARC,
3900         CPU_TYPE_I860,
3901         CPU_TYPE_ALPHA,
3902         CPU_TYPE_POWERPC,
3903         CPU_TYPE_POWERPC64,
3904     );
3905     static FLAGS_CPU_SUBTYPE: &[Flag<u32>] = &flags!(CPU_SUBTYPE_LIB64);
3906     static FLAGS_CPU_SUBTYPE_ANY: &[Flag<u32>] = &flags!(
3907         CPU_SUBTYPE_MULTIPLE,
3908         CPU_SUBTYPE_LITTLE_ENDIAN,
3909         CPU_SUBTYPE_BIG_ENDIAN,
3910     );
3911     static FLAGS_CPU_SUBTYPE_VAX: &[Flag<u32>] = &flags!(
3912         CPU_SUBTYPE_VAX_ALL,
3913         CPU_SUBTYPE_VAX780,
3914         CPU_SUBTYPE_VAX785,
3915         CPU_SUBTYPE_VAX750,
3916         CPU_SUBTYPE_VAX730,
3917         CPU_SUBTYPE_UVAXI,
3918         CPU_SUBTYPE_UVAXII,
3919         CPU_SUBTYPE_VAX8200,
3920         CPU_SUBTYPE_VAX8500,
3921         CPU_SUBTYPE_VAX8600,
3922         CPU_SUBTYPE_VAX8650,
3923         CPU_SUBTYPE_VAX8800,
3924         CPU_SUBTYPE_UVAXIII,
3925     );
3926     static FLAGS_CPU_SUBTYPE_MC680X0: &[Flag<u32>] = &flags!(
3927         CPU_SUBTYPE_MC680X0_ALL,
3928         CPU_SUBTYPE_MC68040,
3929         CPU_SUBTYPE_MC68030_ONLY,
3930     );
3931     static FLAGS_CPU_SUBTYPE_X86: &[Flag<u32>] = &flags!(
3932         CPU_SUBTYPE_I386_ALL,
3933         CPU_SUBTYPE_386,
3934         CPU_SUBTYPE_486,
3935         CPU_SUBTYPE_486SX,
3936         CPU_SUBTYPE_586,
3937         CPU_SUBTYPE_PENT,
3938         CPU_SUBTYPE_PENTPRO,
3939         CPU_SUBTYPE_PENTII_M3,
3940         CPU_SUBTYPE_PENTII_M5,
3941         CPU_SUBTYPE_CELERON,
3942         CPU_SUBTYPE_CELERON_MOBILE,
3943         CPU_SUBTYPE_PENTIUM_3,
3944         CPU_SUBTYPE_PENTIUM_3_M,
3945         CPU_SUBTYPE_PENTIUM_3_XEON,
3946         CPU_SUBTYPE_PENTIUM_M,
3947         CPU_SUBTYPE_PENTIUM_4,
3948         CPU_SUBTYPE_PENTIUM_4_M,
3949         CPU_SUBTYPE_ITANIUM,
3950         CPU_SUBTYPE_ITANIUM_2,
3951         CPU_SUBTYPE_XEON,
3952         CPU_SUBTYPE_XEON_MP,
3953     );
3954     static FLAGS_CPU_SUBTYPE_X86_64: &[Flag<u32>] = &flags!(
3955         CPU_SUBTYPE_X86_64_ALL,
3956         CPU_SUBTYPE_X86_ARCH1,
3957         CPU_SUBTYPE_X86_64_H,
3958     );
3959     static FLAGS_CPU_SUBTYPE_MIPS: &[Flag<u32>] = &flags!(
3960         CPU_SUBTYPE_MIPS_ALL,
3961         CPU_SUBTYPE_MIPS_R2300,
3962         CPU_SUBTYPE_MIPS_R2600,
3963         CPU_SUBTYPE_MIPS_R2800,
3964         CPU_SUBTYPE_MIPS_R2000A,
3965         CPU_SUBTYPE_MIPS_R2000,
3966         CPU_SUBTYPE_MIPS_R3000A,
3967         CPU_SUBTYPE_MIPS_R3000,
3968     );
3969     static FLAGS_CPU_SUBTYPE_MC98000: &[Flag<u32>] =
3970         &flags!(CPU_SUBTYPE_MC98000_ALL, CPU_SUBTYPE_MC98601);
3971     static FLAGS_CPU_SUBTYPE_HPPA: &[Flag<u32>] =
3972         &flags!(CPU_SUBTYPE_HPPA_ALL, CPU_SUBTYPE_HPPA_7100LC);
3973     static FLAGS_CPU_SUBTYPE_MC88000: &[Flag<u32>] = &flags!(
3974         CPU_SUBTYPE_MC88000_ALL,
3975         CPU_SUBTYPE_MC88100,
3976         CPU_SUBTYPE_MC88110,
3977     );
3978     static FLAGS_CPU_SUBTYPE_SPARC: &[Flag<u32>] = &flags!(CPU_SUBTYPE_SPARC_ALL);
3979     static FLAGS_CPU_SUBTYPE_I860: &[Flag<u32>] =
3980         &flags!(CPU_SUBTYPE_I860_ALL, CPU_SUBTYPE_I860_860);
3981     static FLAGS_CPU_SUBTYPE_POWERPC: &[Flag<u32>] = &flags!(
3982         CPU_SUBTYPE_POWERPC_ALL,
3983         CPU_SUBTYPE_POWERPC_601,
3984         CPU_SUBTYPE_POWERPC_602,
3985         CPU_SUBTYPE_POWERPC_603,
3986         CPU_SUBTYPE_POWERPC_603E,
3987         CPU_SUBTYPE_POWERPC_603EV,
3988         CPU_SUBTYPE_POWERPC_604,
3989         CPU_SUBTYPE_POWERPC_604E,
3990         CPU_SUBTYPE_POWERPC_620,
3991         CPU_SUBTYPE_POWERPC_750,
3992         CPU_SUBTYPE_POWERPC_7400,
3993         CPU_SUBTYPE_POWERPC_7450,
3994         CPU_SUBTYPE_POWERPC_970,
3995     );
3996     static FLAGS_CPU_SUBTYPE_ARM: &[Flag<u32>] = &flags!(
3997         CPU_SUBTYPE_ARM_ALL,
3998         CPU_SUBTYPE_ARM_V4T,
3999         CPU_SUBTYPE_ARM_V6,
4000         CPU_SUBTYPE_ARM_V5TEJ,
4001         CPU_SUBTYPE_ARM_XSCALE,
4002         CPU_SUBTYPE_ARM_V7,
4003         CPU_SUBTYPE_ARM_V7F,
4004         CPU_SUBTYPE_ARM_V7S,
4005         CPU_SUBTYPE_ARM_V7K,
4006         CPU_SUBTYPE_ARM_V8,
4007         CPU_SUBTYPE_ARM_V6M,
4008         CPU_SUBTYPE_ARM_V7M,
4009         CPU_SUBTYPE_ARM_V7EM,
4010         CPU_SUBTYPE_ARM_V8M,
4011     );
4012     static FLAGS_CPU_SUBTYPE_ARM64: &[Flag<u32>] = &flags!(
4013         CPU_SUBTYPE_ARM64_ALL,
4014         CPU_SUBTYPE_ARM64_V8,
4015         CPU_SUBTYPE_ARM64E,
4016     );
4017     static FLAGS_CPU_SUBTYPE_ARM64_32: &[Flag<u32>] =
4018         &flags!(CPU_SUBTYPE_ARM64_32_ALL, CPU_SUBTYPE_ARM64_32_V8);
4019     static FLAGS_MH_FILETYPE: &[Flag<u32>] = &flags!(
4020         MH_OBJECT,
4021         MH_EXECUTE,
4022         MH_FVMLIB,
4023         MH_CORE,
4024         MH_PRELOAD,
4025         MH_DYLIB,
4026         MH_DYLINKER,
4027         MH_BUNDLE,
4028         MH_DYLIB_STUB,
4029         MH_DSYM,
4030         MH_KEXT_BUNDLE,
4031         MH_FILESET,
4032     );
4033     static FLAGS_MH: &[Flag<u32>] = &flags!(
4034         MH_NOUNDEFS,
4035         MH_INCRLINK,
4036         MH_DYLDLINK,
4037         MH_BINDATLOAD,
4038         MH_PREBOUND,
4039         MH_SPLIT_SEGS,
4040         MH_LAZY_INIT,
4041         MH_TWOLEVEL,
4042         MH_FORCE_FLAT,
4043         MH_NOMULTIDEFS,
4044         MH_NOFIXPREBINDING,
4045         MH_PREBINDABLE,
4046         MH_ALLMODSBOUND,
4047         MH_SUBSECTIONS_VIA_SYMBOLS,
4048         MH_CANONICAL,
4049         MH_WEAK_DEFINES,
4050         MH_BINDS_TO_WEAK,
4051         MH_ALLOW_STACK_EXECUTION,
4052         MH_ROOT_SAFE,
4053         MH_SETUID_SAFE,
4054         MH_NO_REEXPORTED_DYLIBS,
4055         MH_PIE,
4056         MH_DEAD_STRIPPABLE_DYLIB,
4057         MH_HAS_TLV_DESCRIPTORS,
4058         MH_NO_HEAP_EXECUTION,
4059         MH_APP_EXTENSION_SAFE,
4060         MH_NLIST_OUTOFSYNC_WITH_DYLDINFO,
4061         MH_SIM_SUPPORT,
4062         MH_DYLIB_IN_CACHE,
4063     );
4064     static FLAGS_LC: &[Flag<u32>] = &flags!(
4065         LC_SEGMENT,
4066         LC_SYMTAB,
4067         LC_SYMSEG,
4068         LC_THREAD,
4069         LC_UNIXTHREAD,
4070         LC_LOADFVMLIB,
4071         LC_IDFVMLIB,
4072         LC_IDENT,
4073         LC_FVMFILE,
4074         LC_PREPAGE,
4075         LC_DYSYMTAB,
4076         LC_LOAD_DYLIB,
4077         LC_ID_DYLIB,
4078         LC_LOAD_DYLINKER,
4079         LC_ID_DYLINKER,
4080         LC_PREBOUND_DYLIB,
4081         LC_ROUTINES,
4082         LC_SUB_FRAMEWORK,
4083         LC_SUB_UMBRELLA,
4084         LC_SUB_CLIENT,
4085         LC_SUB_LIBRARY,
4086         LC_TWOLEVEL_HINTS,
4087         LC_PREBIND_CKSUM,
4088         LC_LOAD_WEAK_DYLIB,
4089         LC_SEGMENT_64,
4090         LC_ROUTINES_64,
4091         LC_UUID,
4092         LC_RPATH,
4093         LC_CODE_SIGNATURE,
4094         LC_SEGMENT_SPLIT_INFO,
4095         LC_REEXPORT_DYLIB,
4096         LC_LAZY_LOAD_DYLIB,
4097         LC_ENCRYPTION_INFO,
4098         LC_DYLD_INFO,
4099         LC_DYLD_INFO_ONLY,
4100         LC_LOAD_UPWARD_DYLIB,
4101         LC_VERSION_MIN_MACOSX,
4102         LC_VERSION_MIN_IPHONEOS,
4103         LC_FUNCTION_STARTS,
4104         LC_DYLD_ENVIRONMENT,
4105         LC_MAIN,
4106         LC_DATA_IN_CODE,
4107         LC_SOURCE_VERSION,
4108         LC_DYLIB_CODE_SIGN_DRS,
4109         LC_ENCRYPTION_INFO_64,
4110         LC_LINKER_OPTION,
4111         LC_LINKER_OPTIMIZATION_HINT,
4112         LC_VERSION_MIN_TVOS,
4113         LC_VERSION_MIN_WATCHOS,
4114         LC_NOTE,
4115         LC_BUILD_VERSION,
4116         LC_DYLD_EXPORTS_TRIE,
4117         LC_DYLD_CHAINED_FIXUPS,
4118         LC_FILESET_ENTRY,
4119     );
4120     static FLAGS_VM: &[Flag<u32>] = &flags!(VM_PROT_READ, VM_PROT_WRITE, VM_PROT_EXECUTE);
4121     static FLAGS_SG: &[Flag<u32>] = &flags!(
4122         SG_HIGHVM,
4123         SG_FVMLIB,
4124         SG_NORELOC,
4125         SG_PROTECTED_VERSION_1,
4126         SG_READ_ONLY,
4127     );
4128     static FLAGS_S_TYPE: &[Flag<u32>] = &flags!(
4129         S_REGULAR,
4130         S_ZEROFILL,
4131         S_CSTRING_LITERALS,
4132         S_4BYTE_LITERALS,
4133         S_8BYTE_LITERALS,
4134         S_LITERAL_POINTERS,
4135         S_NON_LAZY_SYMBOL_POINTERS,
4136         S_LAZY_SYMBOL_POINTERS,
4137         S_SYMBOL_STUBS,
4138         S_MOD_INIT_FUNC_POINTERS,
4139         S_MOD_TERM_FUNC_POINTERS,
4140         S_COALESCED,
4141         S_GB_ZEROFILL,
4142         S_INTERPOSING,
4143         S_16BYTE_LITERALS,
4144         S_DTRACE_DOF,
4145         S_LAZY_DYLIB_SYMBOL_POINTERS,
4146         S_THREAD_LOCAL_REGULAR,
4147         S_THREAD_LOCAL_ZEROFILL,
4148         S_THREAD_LOCAL_VARIABLES,
4149         S_THREAD_LOCAL_VARIABLE_POINTERS,
4150         S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
4151         S_INIT_FUNC_OFFSETS,
4152     );
4153     static FLAGS_S_ATTR: &[Flag<u32>] = &flags!(
4154         S_ATTR_PURE_INSTRUCTIONS,
4155         S_ATTR_NO_TOC,
4156         S_ATTR_STRIP_STATIC_SYMS,
4157         S_ATTR_NO_DEAD_STRIP,
4158         S_ATTR_LIVE_SUPPORT,
4159         S_ATTR_SELF_MODIFYING_CODE,
4160         S_ATTR_DEBUG,
4161         S_ATTR_SOME_INSTRUCTIONS,
4162         S_ATTR_EXT_RELOC,
4163         S_ATTR_LOC_RELOC,
4164     );
4165     static FLAGS_PLATFORM: &[Flag<u32>] = &flags!(
4166         PLATFORM_MACOS,
4167         PLATFORM_IOS,
4168         PLATFORM_TVOS,
4169         PLATFORM_WATCHOS,
4170         PLATFORM_BRIDGEOS,
4171         PLATFORM_MACCATALYST,
4172         PLATFORM_IOSSIMULATOR,
4173         PLATFORM_TVOSSIMULATOR,
4174         PLATFORM_WATCHOSSIMULATOR,
4175         PLATFORM_DRIVERKIT,
4176     );
4177     static FLAGS_N_EXT: &[Flag<u8>] = &flags!(N_PEXT, N_EXT);
4178     static FLAGS_N_TYPE: &[Flag<u8>] = &flags!(N_UNDF, N_ABS, N_SECT, N_PBUD, N_INDR);
4179     static FLAGS_N_STAB: &[Flag<u8>] = &flags!(
4180         N_GSYM, N_FNAME, N_FUN, N_STSYM, N_LCSYM, N_BNSYM, N_AST, N_OPT, N_RSYM, N_SLINE, N_ENSYM,
4181         N_SSYM, N_SO, N_OSO, N_LSYM, N_BINCL, N_SOL, N_PARAMS, N_VERSION, N_OLEVEL, N_PSYM,
4182         N_EINCL, N_ENTRY, N_LBRAC, N_EXCL, N_RBRAC, N_BCOMM, N_ECOMM, N_ECOML, N_LENG, N_PC,
4183     );
4184     static FLAGS_REFERENCE: &[Flag<u16>] = &flags!(
4185         REFERENCE_FLAG_UNDEFINED_NON_LAZY,
4186         REFERENCE_FLAG_UNDEFINED_LAZY,
4187         REFERENCE_FLAG_DEFINED,
4188         REFERENCE_FLAG_PRIVATE_DEFINED,
4189         REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY,
4190         REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY,
4191     );
4192     static FLAGS_N_DESC: &[Flag<u16>] = &flags!(
4193         REFERENCED_DYNAMICALLY,
4194         N_NO_DEAD_STRIP,
4195         N_DESC_DISCARDED,
4196         N_WEAK_REF,
4197         N_WEAK_DEF,
4198         N_REF_TO_WEAK,
4199         N_ARM_THUMB_DEF,
4200         N_SYMBOL_RESOLVER,
4201         N_ALT_ENTRY,
4202     );
4203     static FLAGS_GENERIC_RELOC: &[Flag<u8>] = &flags!(
4204         GENERIC_RELOC_VANILLA,
4205         GENERIC_RELOC_PAIR,
4206         GENERIC_RELOC_SECTDIFF,
4207         GENERIC_RELOC_PB_LA_PTR,
4208         GENERIC_RELOC_LOCAL_SECTDIFF,
4209         GENERIC_RELOC_TLV,
4210     );
4211     static FLAGS_ARM_RELOC: &[Flag<u8>] = &flags!(
4212         ARM_RELOC_VANILLA,
4213         ARM_RELOC_PAIR,
4214         ARM_RELOC_SECTDIFF,
4215         ARM_RELOC_LOCAL_SECTDIFF,
4216         ARM_RELOC_PB_LA_PTR,
4217         ARM_RELOC_BR24,
4218         ARM_THUMB_RELOC_BR22,
4219         ARM_THUMB_32BIT_BRANCH,
4220         ARM_RELOC_HALF,
4221         ARM_RELOC_HALF_SECTDIFF,
4222     );
4223     static FLAGS_ARM64_RELOC: &[Flag<u8>] = &flags!(
4224         ARM64_RELOC_UNSIGNED,
4225         ARM64_RELOC_SUBTRACTOR,
4226         ARM64_RELOC_BRANCH26,
4227         ARM64_RELOC_PAGE21,
4228         ARM64_RELOC_PAGEOFF12,
4229         ARM64_RELOC_GOT_LOAD_PAGE21,
4230         ARM64_RELOC_GOT_LOAD_PAGEOFF12,
4231         ARM64_RELOC_POINTER_TO_GOT,
4232         ARM64_RELOC_TLVP_LOAD_PAGE21,
4233         ARM64_RELOC_TLVP_LOAD_PAGEOFF12,
4234         ARM64_RELOC_ADDEND,
4235         ARM64_RELOC_AUTHENTICATED_POINTER,
4236     );
4237     static FLAGS_PPC_RELOC: &[Flag<u8>] = &flags!(
4238         PPC_RELOC_VANILLA,
4239         PPC_RELOC_PAIR,
4240         PPC_RELOC_BR14,
4241         PPC_RELOC_BR24,
4242         PPC_RELOC_HI16,
4243         PPC_RELOC_LO16,
4244         PPC_RELOC_HA16,
4245         PPC_RELOC_LO14,
4246         PPC_RELOC_SECTDIFF,
4247         PPC_RELOC_PB_LA_PTR,
4248         PPC_RELOC_HI16_SECTDIFF,
4249         PPC_RELOC_LO16_SECTDIFF,
4250         PPC_RELOC_HA16_SECTDIFF,
4251         PPC_RELOC_JBSR,
4252         PPC_RELOC_LO14_SECTDIFF,
4253         PPC_RELOC_LOCAL_SECTDIFF,
4254     );
4255     static FLAGS_X86_64_RELOC: &[Flag<u8>] = &flags!(
4256         X86_64_RELOC_UNSIGNED,
4257         X86_64_RELOC_SIGNED,
4258         X86_64_RELOC_BRANCH,
4259         X86_64_RELOC_GOT_LOAD,
4260         X86_64_RELOC_GOT,
4261         X86_64_RELOC_SUBTRACTOR,
4262         X86_64_RELOC_SIGNED_1,
4263         X86_64_RELOC_SIGNED_2,
4264         X86_64_RELOC_SIGNED_4,
4265         X86_64_RELOC_TLV,
4266     );
4267 }
4268 
4269 mod pe {
4270     use super::*;
4271     use object::pe::*;
4272     use object::read::pe::*;
4273     use object::LittleEndian as LE;
4274 
print_coff(p: &mut Printer<impl Write>, data: &[u8])4275     pub(super) fn print_coff(p: &mut Printer<impl Write>, data: &[u8]) {
4276         let mut offset = 0;
4277         if let Ok(header) = ImageFileHeader::parse(data, &mut offset) {
4278             println!("Format: COFF");
4279             print_file(p, header);
4280             let sections = header.sections(data, offset).ok();
4281             let symbols = header.symbols(data).ok();
4282             if let Some(ref sections) = sections {
4283                 print_sections(p, data, header.machine.get(LE), symbols.as_ref(), &sections);
4284             }
4285             if let Some(ref symbols) = symbols {
4286                 print_symbols(p, sections.as_ref(), &symbols);
4287             }
4288         }
4289     }
4290 
print_pe32(p: &mut Printer<impl Write>, data: &[u8])4291     pub(super) fn print_pe32(p: &mut Printer<impl Write>, data: &[u8]) {
4292         println!("Format: PE 32-bit");
4293         print_pe::<ImageNtHeaders32, _>(p, data);
4294     }
4295 
print_pe64(p: &mut Printer<impl Write>, data: &[u8])4296     pub(super) fn print_pe64(p: &mut Printer<impl Write>, data: &[u8]) {
4297         println!("Format: PE 64-bit");
4298         print_pe::<ImageNtHeaders64, _>(p, data);
4299     }
4300 
print_pe<Pe: ImageNtHeaders, W: Write>(p: &mut Printer<W>, data: &[u8])4301     fn print_pe<Pe: ImageNtHeaders, W: Write>(p: &mut Printer<W>, data: &[u8]) {
4302         if let Ok(dos_header) = ImageDosHeader::parse(data) {
4303             p.group("ImageDosHeader", |p| {
4304                 p.field_hex("Magic", dos_header.e_magic.get(LE));
4305                 p.field_hex("CountBytesLastPage", dos_header.e_cblp.get(LE));
4306                 p.field_hex("CountPages", dos_header.e_cp.get(LE));
4307                 p.field_hex("CountRelocations", dos_header.e_crlc.get(LE));
4308                 p.field_hex("CountHeaderParagraphs", dos_header.e_cparhdr.get(LE));
4309                 p.field_hex("MinAllocParagraphs", dos_header.e_minalloc.get(LE));
4310                 p.field_hex("MaxAllocParagraphs", dos_header.e_maxalloc.get(LE));
4311                 p.field_hex("StackSegment", dos_header.e_ss.get(LE));
4312                 p.field_hex("StackPointer", dos_header.e_sp.get(LE));
4313                 p.field_hex("Checksum", dos_header.e_csum.get(LE));
4314                 p.field_hex("InstructionPointer", dos_header.e_ip.get(LE));
4315                 p.field_hex("CodeSegment", dos_header.e_cs.get(LE));
4316                 p.field_hex("AddressOfRelocations", dos_header.e_lfarlc.get(LE));
4317                 p.field_hex("OverlayNumber", dos_header.e_ovno.get(LE));
4318                 p.field_hex("OemId", dos_header.e_oemid.get(LE));
4319                 p.field_hex("OemInfo", dos_header.e_oeminfo.get(LE));
4320                 p.field_hex("AddressOfNewHeader", dos_header.e_lfanew.get(LE));
4321             });
4322             let mut offset = dos_header.nt_headers_offset().into();
4323             if let Ok((nt_headers, data_directories)) = Pe::parse(data, &mut offset) {
4324                 p.group("ImageNtHeaders", |p| {
4325                     p.field_hex("Signature", nt_headers.signature());
4326                 });
4327                 let header = nt_headers.file_header();
4328                 let sections = header.sections(data, offset).ok();
4329                 let symbols = header.symbols(data).ok();
4330                 print_file(p, header);
4331                 print_optional(p, nt_headers.optional_header());
4332                 for (index, dir) in data_directories.iter().enumerate() {
4333                     p.group("ImageDataDirectory", |p| {
4334                         p.field_enum("Index", index, FLAGS_IMAGE_DIRECTORY_ENTRY);
4335                         p.field_hex("VirtualAddress", dir.virtual_address.get(LE));
4336                         p.field_hex("Size", dir.size.get(LE));
4337                         if let Some(dir_data) = sections
4338                             .as_ref()
4339                             .and_then(|sections| dir.data(data, sections).ok())
4340                         {
4341                             match index {
4342                                 IMAGE_DIRECTORY_ENTRY_EXPORT => print_export_dir(p, dir, dir_data),
4343                                 // TODO
4344                                 _ => {}
4345                             }
4346                         }
4347                     });
4348                 }
4349                 if let Some(ref sections) = sections {
4350                     print_sections(p, data, header.machine.get(LE), symbols.as_ref(), &sections);
4351                 }
4352                 if let Some(ref symbols) = symbols {
4353                     print_symbols(p, sections.as_ref(), &symbols);
4354                 }
4355             }
4356         }
4357     }
4358 
print_file(p: &mut Printer<impl Write>, header: &ImageFileHeader)4359     fn print_file(p: &mut Printer<impl Write>, header: &ImageFileHeader) {
4360         p.group("ImageFileHeader", |p| {
4361             p.field_enum("Machine", header.machine.get(LE), FLAGS_IMAGE_FILE_MACHINE);
4362             p.field("NumberOfSections", header.number_of_sections.get(LE));
4363             p.field("TimeDateStamp", header.time_date_stamp.get(LE));
4364             p.field_hex(
4365                 "PointerToSymbolTable",
4366                 header.pointer_to_symbol_table.get(LE),
4367             );
4368             p.field("NumberOfSymbols", header.number_of_symbols.get(LE));
4369             p.field_hex(
4370                 "SizeOfOptionalHeader",
4371                 header.size_of_optional_header.get(LE),
4372             );
4373             p.field_hex("Characteristics", header.characteristics.get(LE));
4374             p.flags(header.characteristics.get(LE), 0, FLAGS_IMAGE_FILE);
4375         });
4376     }
4377 
print_optional(p: &mut Printer<impl Write>, header: &impl ImageOptionalHeader)4378     fn print_optional(p: &mut Printer<impl Write>, header: &impl ImageOptionalHeader) {
4379         p.group("ImageOptionalHeader", |p| {
4380             p.field_hex("Magic", header.magic());
4381             p.field("MajorLinkerVersion", header.major_linker_version());
4382             p.field("MinorLinkerVersion", header.minor_linker_version());
4383             p.field_hex("SizeOfCode", header.size_of_code());
4384             p.field_hex("SizeOfInitializedData", header.size_of_initialized_data());
4385             p.field_hex(
4386                 "SizeOfUninitializedData",
4387                 header.size_of_uninitialized_data(),
4388             );
4389             p.field_hex("AddressOfEntryPoint", header.address_of_entry_point());
4390             p.field_hex("BaseOfCode", header.base_of_code());
4391             p.field_hex("ImageBase", header.image_base());
4392             p.field_hex("SectionAlignment", header.section_alignment());
4393             p.field(
4394                 "MajorOperatingSystemVersion",
4395                 header.major_operating_system_version(),
4396             );
4397             p.field(
4398                 "MinorOperatingSystemVersion",
4399                 header.minor_operating_system_version(),
4400             );
4401             p.field("MajorImageVersion", header.major_image_version());
4402             p.field("MinorImageVersion", header.minor_image_version());
4403             p.field("MajorSubsystemVersion", header.major_subsystem_version());
4404             p.field("MinorSubsystemVersion", header.minor_subsystem_version());
4405             p.field("Win32VersionValue", header.win32_version_value());
4406             p.field_hex("SizeOfImage", header.size_of_image());
4407             p.field_hex("SizeOfHeaders", header.size_of_headers());
4408             p.field_hex("CheckSum", header.check_sum());
4409             p.field_enum("Subsystem", header.subsystem(), FLAGS_IMAGE_SUBSYSTEM);
4410             p.field_hex("DllCharacteristics", header.dll_characteristics());
4411             p.flags(
4412                 header.dll_characteristics(),
4413                 0,
4414                 FLAGS_IMAGE_DLLCHARACTERISTICS,
4415             );
4416             p.field_hex("SizeOfStackReserve", header.size_of_stack_reserve());
4417             p.field_hex("SizeOfStackCommit", header.size_of_stack_commit());
4418             p.field_hex("SizeOfHeapReserve", header.size_of_heap_reserve());
4419             p.field_hex("SizeOfHeapCommit", header.size_of_heap_commit());
4420             p.field_hex("LoaderFlags", header.loader_flags());
4421             p.field_hex("NumberOfRvaAndSizes", header.number_of_rva_and_sizes());
4422         });
4423     }
4424 
print_export_dir(p: &mut Printer<impl Write>, _dir: &ImageDataDirectory, dir_data: &[u8])4425     fn print_export_dir(p: &mut Printer<impl Write>, _dir: &ImageDataDirectory, dir_data: &[u8]) {
4426         if let Ok((export_dir, _)) = object::from_bytes::<pe::ImageExportDirectory>(dir_data) {
4427             p.group("ImageExportDirectory", |p| {
4428                 p.field_hex("Characteristics", export_dir.characteristics.get(LE));
4429                 p.field_hex("TimeDateStamp", export_dir.time_date_stamp.get(LE));
4430                 p.field("MajorVersion", export_dir.major_version.get(LE));
4431                 p.field("MinorVersion", export_dir.minor_version.get(LE));
4432                 p.field_hex("Name", export_dir.name.get(LE));
4433                 p.field("Base", export_dir.base.get(LE));
4434                 p.field("NumberOfFunctions", export_dir.number_of_functions.get(LE));
4435                 p.field("NumberOfNames", export_dir.number_of_names.get(LE));
4436                 p.field_hex(
4437                     "AddressOfFunctions",
4438                     export_dir.address_of_functions.get(LE),
4439                 );
4440                 p.field_hex("AddressOfNames", export_dir.address_of_names.get(LE));
4441                 p.field_hex(
4442                     "AddressOfNameOrdinals",
4443                     export_dir.address_of_name_ordinals.get(LE),
4444                 );
4445                 // TODO: display tables
4446             });
4447         }
4448     }
4449 
print_sections( p: &mut Printer<impl Write>, data: &[u8], machine: u16, symbols: Option<&SymbolTable>, sections: &SectionTable, )4450     fn print_sections(
4451         p: &mut Printer<impl Write>,
4452         data: &[u8],
4453         machine: u16,
4454         symbols: Option<&SymbolTable>,
4455         sections: &SectionTable,
4456     ) {
4457         for (index, section) in sections.iter().enumerate() {
4458             p.group("ImageSectionHeader", |p| {
4459                 p.field("Index", index + 1);
4460                 if let Some(name) = symbols.and_then(|symbols| section.name(symbols.strings()).ok())
4461                 {
4462                     p.field_inline_string("Name", name);
4463                 } else {
4464                     p.field_inline_string("Name", section.raw_name());
4465                 }
4466                 p.field_hex("VirtualSize", section.virtual_size.get(LE));
4467                 p.field_hex("VirtualAddress", section.virtual_address.get(LE));
4468                 p.field_hex("SizeOfRawData", section.size_of_raw_data.get(LE));
4469                 p.field_hex("PointerToRawData", section.pointer_to_raw_data.get(LE));
4470                 p.field_hex(
4471                     "PointerToRelocations",
4472                     section.pointer_to_relocations.get(LE),
4473                 );
4474                 p.field_hex(
4475                     "PointerToLinenumbers",
4476                     section.pointer_to_linenumbers.get(LE),
4477                 );
4478                 p.field("NumberOfRelocations", section.number_of_relocations.get(LE));
4479                 p.field("NumberOfLinenumbers", section.number_of_linenumbers.get(LE));
4480                 p.field_hex("Characteristics", section.characteristics.get(LE));
4481                 p.flags(section.characteristics.get(LE), 0, FLAGS_IMAGE_SCN);
4482                 p.flags(
4483                     section.characteristics.get(LE),
4484                     IMAGE_SCN_ALIGN_MASK,
4485                     FLAGS_IMAGE_SCN_ALIGN,
4486                 );
4487                 if let Ok(relocations) = section.coff_relocations(data) {
4488                     for relocation in relocations {
4489                         p.group("ImageRelocation", |p| {
4490                             p.field_hex("VirtualAddress", relocation.virtual_address.get(LE));
4491                             let index = relocation.symbol_table_index.get(LE);
4492                             let name = symbols.and_then(|symbols| {
4493                                 symbols
4494                                     .symbol(index as usize)
4495                                     .and_then(|symbol| symbol.name(symbols.strings()))
4496                                     .ok()
4497                             });
4498                             p.field_string("Symbol", index, name);
4499                             let proc = match machine {
4500                                 IMAGE_FILE_MACHINE_I386 => FLAGS_IMAGE_REL_I386,
4501                                 IMAGE_FILE_MACHINE_MIPS16
4502                                 | IMAGE_FILE_MACHINE_MIPSFPU
4503                                 | IMAGE_FILE_MACHINE_MIPSFPU16 => FLAGS_IMAGE_REL_MIPS,
4504                                 IMAGE_FILE_MACHINE_ALPHA | IMAGE_FILE_MACHINE_ALPHA64 => {
4505                                     FLAGS_IMAGE_REL_ALPHA
4506                                 }
4507                                 IMAGE_FILE_MACHINE_POWERPC | IMAGE_FILE_MACHINE_POWERPCFP => {
4508                                     FLAGS_IMAGE_REL_PPC
4509                                 }
4510                                 IMAGE_FILE_MACHINE_SH3
4511                                 | IMAGE_FILE_MACHINE_SH3DSP
4512                                 | IMAGE_FILE_MACHINE_SH3E
4513                                 | IMAGE_FILE_MACHINE_SH4
4514                                 | IMAGE_FILE_MACHINE_SH5 => FLAGS_IMAGE_REL_SH,
4515                                 IMAGE_FILE_MACHINE_ARM => FLAGS_IMAGE_REL_ARM,
4516                                 IMAGE_FILE_MACHINE_AM33 => FLAGS_IMAGE_REL_AM,
4517                                 IMAGE_FILE_MACHINE_ARM64 => FLAGS_IMAGE_REL_ARM64,
4518                                 IMAGE_FILE_MACHINE_AMD64 => FLAGS_IMAGE_REL_AMD64,
4519                                 IMAGE_FILE_MACHINE_IA64 => FLAGS_IMAGE_REL_IA64,
4520                                 IMAGE_FILE_MACHINE_CEF => FLAGS_IMAGE_REL_CEF,
4521                                 IMAGE_FILE_MACHINE_CEE => FLAGS_IMAGE_REL_CEE,
4522                                 IMAGE_FILE_MACHINE_M32R => FLAGS_IMAGE_REL_M32R,
4523                                 IMAGE_FILE_MACHINE_EBC => FLAGS_IMAGE_REL_EBC,
4524                                 _ => &[],
4525                             };
4526                             let typ = relocation.typ.get(LE);
4527                             p.field_enum("Type", typ, proc);
4528                             match machine {
4529                                 IMAGE_FILE_MACHINE_POWERPC | IMAGE_FILE_MACHINE_POWERPCFP => {
4530                                     p.flags(typ, 0, FLAGS_IMAGE_REL_PPC_BITS)
4531                                 }
4532                                 IMAGE_FILE_MACHINE_SH3
4533                                 | IMAGE_FILE_MACHINE_SH3DSP
4534                                 | IMAGE_FILE_MACHINE_SH3E
4535                                 | IMAGE_FILE_MACHINE_SH4
4536                                 | IMAGE_FILE_MACHINE_SH5 => {
4537                                     p.flags(typ, 0, FLAGS_IMAGE_REL_SH_BITS)
4538                                 }
4539                                 _ => {}
4540                             }
4541                         });
4542                     }
4543                 }
4544             });
4545         }
4546     }
4547 
print_symbols( p: &mut Printer<impl Write>, sections: Option<&SectionTable>, symbols: &SymbolTable, )4548     fn print_symbols(
4549         p: &mut Printer<impl Write>,
4550         sections: Option<&SectionTable>,
4551         symbols: &SymbolTable,
4552     ) {
4553         for (index, symbol) in symbols.iter() {
4554             p.group("ImageSymbol", |p| {
4555                 p.field("Index", index);
4556                 if let Ok(name) = symbol.name(symbols.strings()) {
4557                     p.field_inline_string("Name", name);
4558                 } else {
4559                     p.field("Name", format!("{:X?}", symbol.name));
4560                 }
4561                 p.field_hex("Value", symbol.value.get(LE));
4562                 let section = symbol.section_number.get(LE);
4563                 if section == 0 || section >= IMAGE_SYM_SECTION_MAX {
4564                     p.field_enum("Section", section, FLAGS_IMAGE_SYM);
4565                 } else {
4566                     let section_name = sections.and_then(|sections| {
4567                         sections
4568                             .section(section.into())
4569                             .and_then(|section| section.name(symbols.strings()))
4570                             .ok()
4571                     });
4572                     p.field_string("Section", section, section_name);
4573                 }
4574                 p.field_hex("Type", symbol.typ.get(LE));
4575                 p.field_enum("BaseType", symbol.base_type(), FLAGS_IMAGE_SYM_TYPE);
4576                 p.field_enum("DerivedType", symbol.derived_type(), FLAGS_IMAGE_SYM_DTYPE);
4577                 p.field_enum("StorageClass", symbol.storage_class, FLAGS_IMAGE_SYM_CLASS);
4578                 p.field_hex("NumberOfAuxSymbols", symbol.number_of_aux_symbols);
4579                 if symbol.has_aux_file_name() {
4580                     if let Ok(name) = symbols.aux_file_name(index, symbol.number_of_aux_symbols) {
4581                         p.group("ImageAuxSymbolFile", |p| {
4582                             p.field_inline_string("Name", name);
4583                         });
4584                     }
4585                 } else if symbol.has_aux_function() {
4586                     if let Ok(aux) = symbols.aux_function(index) {
4587                         p.group("ImageAuxSymbolFunction", |p| {
4588                             p.field("TagIndex", aux.tag_index.get(LE));
4589                             p.field("TotalSize", aux.total_size.get(LE));
4590                             p.field_hex("PointerToLinenumber", aux.pointer_to_linenumber.get(LE));
4591                             p.field(
4592                                 "PointerToNextFunction",
4593                                 aux.pointer_to_next_function.get(LE),
4594                             );
4595                             p.field("Unused", format!("{:X?}", aux.unused));
4596                         });
4597                     }
4598                 } else if symbol.has_aux_section() {
4599                     if let Ok(aux) = symbols.aux_section(index) {
4600                         p.group("ImageAuxSymbolSection", |p| {
4601                             p.field_hex("Length", aux.length.get(LE));
4602                             p.field("NumberOfRelocations", aux.number_of_relocations.get(LE));
4603                             p.field("NumberOfLinenumbers", aux.number_of_linenumbers.get(LE));
4604                             p.field_hex("CheckSum", aux.check_sum.get(LE));
4605                             p.field("Number", aux.number.get(LE));
4606                             p.field_enum("Selection", aux.selection, FLAGS_IMAGE_COMDAT_SELECT);
4607                             p.field_hex("Reserved", aux.reserved);
4608                             p.field("HighNumber", aux.high_number.get(LE));
4609                         });
4610                     }
4611                 }
4612                 // TODO: ImageAuxSymbolFunctionBeginEnd
4613                 // TODO: ImageAuxSymbolWeak
4614             });
4615         }
4616     }
4617 
4618     static FLAGS_IMAGE_FILE: &[Flag<u16>] = &flags!(
4619         IMAGE_FILE_RELOCS_STRIPPED,
4620         IMAGE_FILE_EXECUTABLE_IMAGE,
4621         IMAGE_FILE_LINE_NUMS_STRIPPED,
4622         IMAGE_FILE_LOCAL_SYMS_STRIPPED,
4623         IMAGE_FILE_AGGRESIVE_WS_TRIM,
4624         IMAGE_FILE_LARGE_ADDRESS_AWARE,
4625         IMAGE_FILE_BYTES_REVERSED_LO,
4626         IMAGE_FILE_32BIT_MACHINE,
4627         IMAGE_FILE_DEBUG_STRIPPED,
4628         IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP,
4629         IMAGE_FILE_NET_RUN_FROM_SWAP,
4630         IMAGE_FILE_SYSTEM,
4631         IMAGE_FILE_DLL,
4632         IMAGE_FILE_UP_SYSTEM_ONLY,
4633         IMAGE_FILE_BYTES_REVERSED_HI,
4634     );
4635     static FLAGS_IMAGE_FILE_MACHINE: &[Flag<u16>] = &flags!(
4636         IMAGE_FILE_MACHINE_UNKNOWN,
4637         IMAGE_FILE_MACHINE_TARGET_HOST,
4638         IMAGE_FILE_MACHINE_I386,
4639         IMAGE_FILE_MACHINE_R3000,
4640         IMAGE_FILE_MACHINE_R4000,
4641         IMAGE_FILE_MACHINE_R10000,
4642         IMAGE_FILE_MACHINE_WCEMIPSV2,
4643         IMAGE_FILE_MACHINE_ALPHA,
4644         IMAGE_FILE_MACHINE_SH3,
4645         IMAGE_FILE_MACHINE_SH3DSP,
4646         IMAGE_FILE_MACHINE_SH3E,
4647         IMAGE_FILE_MACHINE_SH4,
4648         IMAGE_FILE_MACHINE_SH5,
4649         IMAGE_FILE_MACHINE_ARM,
4650         IMAGE_FILE_MACHINE_THUMB,
4651         IMAGE_FILE_MACHINE_ARMNT,
4652         IMAGE_FILE_MACHINE_AM33,
4653         IMAGE_FILE_MACHINE_POWERPC,
4654         IMAGE_FILE_MACHINE_POWERPCFP,
4655         IMAGE_FILE_MACHINE_IA64,
4656         IMAGE_FILE_MACHINE_MIPS16,
4657         IMAGE_FILE_MACHINE_ALPHA64,
4658         IMAGE_FILE_MACHINE_MIPSFPU,
4659         IMAGE_FILE_MACHINE_MIPSFPU16,
4660         IMAGE_FILE_MACHINE_AXP64,
4661         IMAGE_FILE_MACHINE_TRICORE,
4662         IMAGE_FILE_MACHINE_CEF,
4663         IMAGE_FILE_MACHINE_EBC,
4664         IMAGE_FILE_MACHINE_AMD64,
4665         IMAGE_FILE_MACHINE_M32R,
4666         IMAGE_FILE_MACHINE_ARM64,
4667         IMAGE_FILE_MACHINE_CEE,
4668     );
4669     static FLAGS_IMAGE_SCN: &[Flag<u32>] = &flags!(
4670         IMAGE_SCN_TYPE_NO_PAD,
4671         IMAGE_SCN_CNT_CODE,
4672         IMAGE_SCN_CNT_INITIALIZED_DATA,
4673         IMAGE_SCN_CNT_UNINITIALIZED_DATA,
4674         IMAGE_SCN_LNK_OTHER,
4675         IMAGE_SCN_LNK_INFO,
4676         IMAGE_SCN_LNK_REMOVE,
4677         IMAGE_SCN_LNK_COMDAT,
4678         IMAGE_SCN_NO_DEFER_SPEC_EXC,
4679         IMAGE_SCN_GPREL,
4680         IMAGE_SCN_MEM_FARDATA,
4681         IMAGE_SCN_MEM_PURGEABLE,
4682         IMAGE_SCN_MEM_16BIT,
4683         IMAGE_SCN_MEM_LOCKED,
4684         IMAGE_SCN_MEM_PRELOAD,
4685         IMAGE_SCN_LNK_NRELOC_OVFL,
4686         IMAGE_SCN_MEM_DISCARDABLE,
4687         IMAGE_SCN_MEM_NOT_CACHED,
4688         IMAGE_SCN_MEM_NOT_PAGED,
4689         IMAGE_SCN_MEM_SHARED,
4690         IMAGE_SCN_MEM_EXECUTE,
4691         IMAGE_SCN_MEM_READ,
4692         IMAGE_SCN_MEM_WRITE,
4693     );
4694     static FLAGS_IMAGE_SCN_ALIGN: &[Flag<u32>] = &flags!(
4695         IMAGE_SCN_ALIGN_1BYTES,
4696         IMAGE_SCN_ALIGN_2BYTES,
4697         IMAGE_SCN_ALIGN_4BYTES,
4698         IMAGE_SCN_ALIGN_8BYTES,
4699         IMAGE_SCN_ALIGN_16BYTES,
4700         IMAGE_SCN_ALIGN_32BYTES,
4701         IMAGE_SCN_ALIGN_64BYTES,
4702         IMAGE_SCN_ALIGN_128BYTES,
4703         IMAGE_SCN_ALIGN_256BYTES,
4704         IMAGE_SCN_ALIGN_512BYTES,
4705         IMAGE_SCN_ALIGN_1024BYTES,
4706         IMAGE_SCN_ALIGN_2048BYTES,
4707         IMAGE_SCN_ALIGN_4096BYTES,
4708         IMAGE_SCN_ALIGN_8192BYTES,
4709     );
4710     static FLAGS_IMAGE_REL_I386: &[Flag<u16>] = &flags!(
4711         IMAGE_REL_I386_ABSOLUTE,
4712         IMAGE_REL_I386_DIR16,
4713         IMAGE_REL_I386_REL16,
4714         IMAGE_REL_I386_DIR32,
4715         IMAGE_REL_I386_DIR32NB,
4716         IMAGE_REL_I386_SEG12,
4717         IMAGE_REL_I386_SECTION,
4718         IMAGE_REL_I386_SECREL,
4719         IMAGE_REL_I386_TOKEN,
4720         IMAGE_REL_I386_SECREL7,
4721         IMAGE_REL_I386_REL32,
4722     );
4723     static FLAGS_IMAGE_REL_MIPS: &[Flag<u16>] = &flags!(
4724         IMAGE_REL_MIPS_ABSOLUTE,
4725         IMAGE_REL_MIPS_REFHALF,
4726         IMAGE_REL_MIPS_REFWORD,
4727         IMAGE_REL_MIPS_JMPADDR,
4728         IMAGE_REL_MIPS_REFHI,
4729         IMAGE_REL_MIPS_REFLO,
4730         IMAGE_REL_MIPS_GPREL,
4731         IMAGE_REL_MIPS_LITERAL,
4732         IMAGE_REL_MIPS_SECTION,
4733         IMAGE_REL_MIPS_SECREL,
4734         IMAGE_REL_MIPS_SECRELLO,
4735         IMAGE_REL_MIPS_SECRELHI,
4736         IMAGE_REL_MIPS_TOKEN,
4737         IMAGE_REL_MIPS_JMPADDR16,
4738         IMAGE_REL_MIPS_REFWORDNB,
4739         IMAGE_REL_MIPS_PAIR,
4740     );
4741     static FLAGS_IMAGE_REL_ALPHA: &[Flag<u16>] = &flags!(
4742         IMAGE_REL_ALPHA_ABSOLUTE,
4743         IMAGE_REL_ALPHA_REFLONG,
4744         IMAGE_REL_ALPHA_REFQUAD,
4745         IMAGE_REL_ALPHA_GPREL32,
4746         IMAGE_REL_ALPHA_LITERAL,
4747         IMAGE_REL_ALPHA_LITUSE,
4748         IMAGE_REL_ALPHA_GPDISP,
4749         IMAGE_REL_ALPHA_BRADDR,
4750         IMAGE_REL_ALPHA_HINT,
4751         IMAGE_REL_ALPHA_INLINE_REFLONG,
4752         IMAGE_REL_ALPHA_REFHI,
4753         IMAGE_REL_ALPHA_REFLO,
4754         IMAGE_REL_ALPHA_PAIR,
4755         IMAGE_REL_ALPHA_MATCH,
4756         IMAGE_REL_ALPHA_SECTION,
4757         IMAGE_REL_ALPHA_SECREL,
4758         IMAGE_REL_ALPHA_REFLONGNB,
4759         IMAGE_REL_ALPHA_SECRELLO,
4760         IMAGE_REL_ALPHA_SECRELHI,
4761         IMAGE_REL_ALPHA_REFQ3,
4762         IMAGE_REL_ALPHA_REFQ2,
4763         IMAGE_REL_ALPHA_REFQ1,
4764         IMAGE_REL_ALPHA_GPRELLO,
4765         IMAGE_REL_ALPHA_GPRELHI,
4766     );
4767     static FLAGS_IMAGE_REL_PPC: &[Flag<u16>] = &flags!(
4768         IMAGE_REL_PPC_ABSOLUTE,
4769         IMAGE_REL_PPC_ADDR64,
4770         IMAGE_REL_PPC_ADDR32,
4771         IMAGE_REL_PPC_ADDR24,
4772         IMAGE_REL_PPC_ADDR16,
4773         IMAGE_REL_PPC_ADDR14,
4774         IMAGE_REL_PPC_REL24,
4775         IMAGE_REL_PPC_REL14,
4776         IMAGE_REL_PPC_TOCREL16,
4777         IMAGE_REL_PPC_TOCREL14,
4778         IMAGE_REL_PPC_ADDR32NB,
4779         IMAGE_REL_PPC_SECREL,
4780         IMAGE_REL_PPC_SECTION,
4781         IMAGE_REL_PPC_IFGLUE,
4782         IMAGE_REL_PPC_IMGLUE,
4783         IMAGE_REL_PPC_SECREL16,
4784         IMAGE_REL_PPC_REFHI,
4785         IMAGE_REL_PPC_REFLO,
4786         IMAGE_REL_PPC_PAIR,
4787         IMAGE_REL_PPC_SECRELLO,
4788         IMAGE_REL_PPC_SECRELHI,
4789         IMAGE_REL_PPC_GPREL,
4790         IMAGE_REL_PPC_TOKEN,
4791     );
4792     static FLAGS_IMAGE_REL_PPC_BITS: &[Flag<u16>] = &flags!(
4793         IMAGE_REL_PPC_NEG,
4794         IMAGE_REL_PPC_BRTAKEN,
4795         IMAGE_REL_PPC_BRNTAKEN,
4796         IMAGE_REL_PPC_TOCDEFN,
4797     );
4798     static FLAGS_IMAGE_REL_SH: &[Flag<u16>] = &flags!(
4799         IMAGE_REL_SH3_ABSOLUTE,
4800         IMAGE_REL_SH3_DIRECT16,
4801         IMAGE_REL_SH3_DIRECT32,
4802         IMAGE_REL_SH3_DIRECT8,
4803         IMAGE_REL_SH3_DIRECT8_WORD,
4804         IMAGE_REL_SH3_DIRECT8_LONG,
4805         IMAGE_REL_SH3_DIRECT4,
4806         IMAGE_REL_SH3_DIRECT4_WORD,
4807         IMAGE_REL_SH3_DIRECT4_LONG,
4808         IMAGE_REL_SH3_PCREL8_WORD,
4809         IMAGE_REL_SH3_PCREL8_LONG,
4810         IMAGE_REL_SH3_PCREL12_WORD,
4811         IMAGE_REL_SH3_STARTOF_SECTION,
4812         IMAGE_REL_SH3_SIZEOF_SECTION,
4813         IMAGE_REL_SH3_SECTION,
4814         IMAGE_REL_SH3_SECREL,
4815         IMAGE_REL_SH3_DIRECT32_NB,
4816         IMAGE_REL_SH3_GPREL4_LONG,
4817         IMAGE_REL_SH3_TOKEN,
4818         IMAGE_REL_SHM_PCRELPT,
4819         IMAGE_REL_SHM_REFLO,
4820         IMAGE_REL_SHM_REFHALF,
4821         IMAGE_REL_SHM_RELLO,
4822         IMAGE_REL_SHM_RELHALF,
4823         IMAGE_REL_SHM_PAIR,
4824     );
4825     static FLAGS_IMAGE_REL_SH_BITS: &[Flag<u16>] = &flags!(IMAGE_REL_SH_NOMODE,);
4826     static FLAGS_IMAGE_REL_ARM: &[Flag<u16>] = &flags!(
4827         IMAGE_REL_ARM_ABSOLUTE,
4828         IMAGE_REL_ARM_ADDR32,
4829         IMAGE_REL_ARM_ADDR32NB,
4830         IMAGE_REL_ARM_BRANCH24,
4831         IMAGE_REL_ARM_BRANCH11,
4832         IMAGE_REL_ARM_TOKEN,
4833         IMAGE_REL_ARM_GPREL12,
4834         IMAGE_REL_ARM_GPREL7,
4835         IMAGE_REL_ARM_BLX24,
4836         IMAGE_REL_ARM_BLX11,
4837         IMAGE_REL_ARM_SECTION,
4838         IMAGE_REL_ARM_SECREL,
4839         IMAGE_REL_ARM_MOV32A,
4840         IMAGE_REL_ARM_MOV32T,
4841         IMAGE_REL_ARM_BRANCH20T,
4842         IMAGE_REL_ARM_BRANCH24T,
4843         IMAGE_REL_ARM_BLX23T,
4844     );
4845     static FLAGS_IMAGE_REL_AM: &[Flag<u16>] = &flags!(
4846         IMAGE_REL_AM_ABSOLUTE,
4847         IMAGE_REL_AM_ADDR32,
4848         IMAGE_REL_AM_ADDR32NB,
4849         IMAGE_REL_AM_CALL32,
4850         IMAGE_REL_AM_FUNCINFO,
4851         IMAGE_REL_AM_REL32_1,
4852         IMAGE_REL_AM_REL32_2,
4853         IMAGE_REL_AM_SECREL,
4854         IMAGE_REL_AM_SECTION,
4855         IMAGE_REL_AM_TOKEN,
4856     );
4857     static FLAGS_IMAGE_REL_ARM64: &[Flag<u16>] = &flags!(
4858         IMAGE_REL_ARM64_ABSOLUTE,
4859         IMAGE_REL_ARM64_ADDR32,
4860         IMAGE_REL_ARM64_ADDR32NB,
4861         IMAGE_REL_ARM64_BRANCH26,
4862         IMAGE_REL_ARM64_PAGEBASE_REL21,
4863         IMAGE_REL_ARM64_REL21,
4864         IMAGE_REL_ARM64_PAGEOFFSET_12A,
4865         IMAGE_REL_ARM64_PAGEOFFSET_12L,
4866         IMAGE_REL_ARM64_SECREL,
4867         IMAGE_REL_ARM64_SECREL_LOW12A,
4868         IMAGE_REL_ARM64_SECREL_HIGH12A,
4869         IMAGE_REL_ARM64_SECREL_LOW12L,
4870         IMAGE_REL_ARM64_TOKEN,
4871         IMAGE_REL_ARM64_SECTION,
4872         IMAGE_REL_ARM64_ADDR64,
4873         IMAGE_REL_ARM64_BRANCH19,
4874     );
4875     static FLAGS_IMAGE_REL_AMD64: &[Flag<u16>] = &flags!(
4876         IMAGE_REL_AMD64_ABSOLUTE,
4877         IMAGE_REL_AMD64_ADDR64,
4878         IMAGE_REL_AMD64_ADDR32,
4879         IMAGE_REL_AMD64_ADDR32NB,
4880         IMAGE_REL_AMD64_REL32,
4881         IMAGE_REL_AMD64_REL32_1,
4882         IMAGE_REL_AMD64_REL32_2,
4883         IMAGE_REL_AMD64_REL32_3,
4884         IMAGE_REL_AMD64_REL32_4,
4885         IMAGE_REL_AMD64_REL32_5,
4886         IMAGE_REL_AMD64_SECTION,
4887         IMAGE_REL_AMD64_SECREL,
4888         IMAGE_REL_AMD64_SECREL7,
4889         IMAGE_REL_AMD64_TOKEN,
4890         IMAGE_REL_AMD64_SREL32,
4891         IMAGE_REL_AMD64_PAIR,
4892         IMAGE_REL_AMD64_SSPAN32,
4893         IMAGE_REL_AMD64_EHANDLER,
4894         IMAGE_REL_AMD64_IMPORT_BR,
4895         IMAGE_REL_AMD64_IMPORT_CALL,
4896         IMAGE_REL_AMD64_CFG_BR,
4897         IMAGE_REL_AMD64_CFG_BR_REX,
4898         IMAGE_REL_AMD64_CFG_CALL,
4899         IMAGE_REL_AMD64_INDIR_BR,
4900         IMAGE_REL_AMD64_INDIR_BR_REX,
4901         IMAGE_REL_AMD64_INDIR_CALL,
4902         IMAGE_REL_AMD64_INDIR_BR_SWITCHTABLE_FIRST,
4903         IMAGE_REL_AMD64_INDIR_BR_SWITCHTABLE_LAST,
4904     );
4905     static FLAGS_IMAGE_REL_IA64: &[Flag<u16>] = &flags!(
4906         IMAGE_REL_IA64_ABSOLUTE,
4907         IMAGE_REL_IA64_IMM14,
4908         IMAGE_REL_IA64_IMM22,
4909         IMAGE_REL_IA64_IMM64,
4910         IMAGE_REL_IA64_DIR32,
4911         IMAGE_REL_IA64_DIR64,
4912         IMAGE_REL_IA64_PCREL21B,
4913         IMAGE_REL_IA64_PCREL21M,
4914         IMAGE_REL_IA64_PCREL21F,
4915         IMAGE_REL_IA64_GPREL22,
4916         IMAGE_REL_IA64_LTOFF22,
4917         IMAGE_REL_IA64_SECTION,
4918         IMAGE_REL_IA64_SECREL22,
4919         IMAGE_REL_IA64_SECREL64I,
4920         IMAGE_REL_IA64_SECREL32,
4921         IMAGE_REL_IA64_DIR32NB,
4922         IMAGE_REL_IA64_SREL14,
4923         IMAGE_REL_IA64_SREL22,
4924         IMAGE_REL_IA64_SREL32,
4925         IMAGE_REL_IA64_UREL32,
4926         IMAGE_REL_IA64_PCREL60X,
4927         IMAGE_REL_IA64_PCREL60B,
4928         IMAGE_REL_IA64_PCREL60F,
4929         IMAGE_REL_IA64_PCREL60I,
4930         IMAGE_REL_IA64_PCREL60M,
4931         IMAGE_REL_IA64_IMMGPREL64,
4932         IMAGE_REL_IA64_TOKEN,
4933         IMAGE_REL_IA64_GPREL32,
4934         IMAGE_REL_IA64_ADDEND,
4935     );
4936     static FLAGS_IMAGE_REL_CEF: &[Flag<u16>] = &flags!(
4937         IMAGE_REL_CEF_ABSOLUTE,
4938         IMAGE_REL_CEF_ADDR32,
4939         IMAGE_REL_CEF_ADDR64,
4940         IMAGE_REL_CEF_ADDR32NB,
4941         IMAGE_REL_CEF_SECTION,
4942         IMAGE_REL_CEF_SECREL,
4943         IMAGE_REL_CEF_TOKEN,
4944     );
4945     static FLAGS_IMAGE_REL_CEE: &[Flag<u16>] = &flags!(
4946         IMAGE_REL_CEE_ABSOLUTE,
4947         IMAGE_REL_CEE_ADDR32,
4948         IMAGE_REL_CEE_ADDR64,
4949         IMAGE_REL_CEE_ADDR32NB,
4950         IMAGE_REL_CEE_SECTION,
4951         IMAGE_REL_CEE_SECREL,
4952         IMAGE_REL_CEE_TOKEN,
4953     );
4954     static FLAGS_IMAGE_REL_M32R: &[Flag<u16>] = &flags!(
4955         IMAGE_REL_M32R_ABSOLUTE,
4956         IMAGE_REL_M32R_ADDR32,
4957         IMAGE_REL_M32R_ADDR32NB,
4958         IMAGE_REL_M32R_ADDR24,
4959         IMAGE_REL_M32R_GPREL16,
4960         IMAGE_REL_M32R_PCREL24,
4961         IMAGE_REL_M32R_PCREL16,
4962         IMAGE_REL_M32R_PCREL8,
4963         IMAGE_REL_M32R_REFHALF,
4964         IMAGE_REL_M32R_REFHI,
4965         IMAGE_REL_M32R_REFLO,
4966         IMAGE_REL_M32R_PAIR,
4967         IMAGE_REL_M32R_SECTION,
4968         IMAGE_REL_M32R_SECREL32,
4969         IMAGE_REL_M32R_TOKEN,
4970     );
4971     static FLAGS_IMAGE_REL_EBC: &[Flag<u16>] = &flags!(
4972         IMAGE_REL_EBC_ABSOLUTE,
4973         IMAGE_REL_EBC_ADDR32NB,
4974         IMAGE_REL_EBC_REL32,
4975         IMAGE_REL_EBC_SECTION,
4976         IMAGE_REL_EBC_SECREL,
4977     );
4978     static FLAGS_IMAGE_SYM: &[Flag<u16>] =
4979         &flags!(IMAGE_SYM_UNDEFINED, IMAGE_SYM_ABSOLUTE, IMAGE_SYM_DEBUG,);
4980     static FLAGS_IMAGE_SYM_TYPE: &[Flag<u16>] = &flags!(
4981         IMAGE_SYM_TYPE_NULL,
4982         IMAGE_SYM_TYPE_VOID,
4983         IMAGE_SYM_TYPE_CHAR,
4984         IMAGE_SYM_TYPE_SHORT,
4985         IMAGE_SYM_TYPE_INT,
4986         IMAGE_SYM_TYPE_LONG,
4987         IMAGE_SYM_TYPE_FLOAT,
4988         IMAGE_SYM_TYPE_DOUBLE,
4989         IMAGE_SYM_TYPE_STRUCT,
4990         IMAGE_SYM_TYPE_UNION,
4991         IMAGE_SYM_TYPE_ENUM,
4992         IMAGE_SYM_TYPE_MOE,
4993         IMAGE_SYM_TYPE_BYTE,
4994         IMAGE_SYM_TYPE_WORD,
4995         IMAGE_SYM_TYPE_UINT,
4996         IMAGE_SYM_TYPE_DWORD,
4997         IMAGE_SYM_TYPE_PCODE,
4998     );
4999     static FLAGS_IMAGE_SYM_DTYPE: &[Flag<u16>] = &flags!(
5000         IMAGE_SYM_DTYPE_NULL,
5001         IMAGE_SYM_DTYPE_POINTER,
5002         IMAGE_SYM_DTYPE_FUNCTION,
5003         IMAGE_SYM_DTYPE_ARRAY,
5004     );
5005     static FLAGS_IMAGE_SYM_CLASS: &[Flag<u8>] = &flags!(
5006         IMAGE_SYM_CLASS_END_OF_FUNCTION,
5007         IMAGE_SYM_CLASS_NULL,
5008         IMAGE_SYM_CLASS_AUTOMATIC,
5009         IMAGE_SYM_CLASS_EXTERNAL,
5010         IMAGE_SYM_CLASS_STATIC,
5011         IMAGE_SYM_CLASS_REGISTER,
5012         IMAGE_SYM_CLASS_EXTERNAL_DEF,
5013         IMAGE_SYM_CLASS_LABEL,
5014         IMAGE_SYM_CLASS_UNDEFINED_LABEL,
5015         IMAGE_SYM_CLASS_MEMBER_OF_STRUCT,
5016         IMAGE_SYM_CLASS_ARGUMENT,
5017         IMAGE_SYM_CLASS_STRUCT_TAG,
5018         IMAGE_SYM_CLASS_MEMBER_OF_UNION,
5019         IMAGE_SYM_CLASS_UNION_TAG,
5020         IMAGE_SYM_CLASS_TYPE_DEFINITION,
5021         IMAGE_SYM_CLASS_UNDEFINED_STATIC,
5022         IMAGE_SYM_CLASS_ENUM_TAG,
5023         IMAGE_SYM_CLASS_MEMBER_OF_ENUM,
5024         IMAGE_SYM_CLASS_REGISTER_PARAM,
5025         IMAGE_SYM_CLASS_BIT_FIELD,
5026         IMAGE_SYM_CLASS_FAR_EXTERNAL,
5027         IMAGE_SYM_CLASS_BLOCK,
5028         IMAGE_SYM_CLASS_FUNCTION,
5029         IMAGE_SYM_CLASS_END_OF_STRUCT,
5030         IMAGE_SYM_CLASS_FILE,
5031         IMAGE_SYM_CLASS_SECTION,
5032         IMAGE_SYM_CLASS_WEAK_EXTERNAL,
5033         IMAGE_SYM_CLASS_CLR_TOKEN,
5034     );
5035     static FLAGS_IMAGE_COMDAT_SELECT: &[Flag<u8>] = &flags!(
5036         IMAGE_COMDAT_SELECT_NODUPLICATES,
5037         IMAGE_COMDAT_SELECT_ANY,
5038         IMAGE_COMDAT_SELECT_SAME_SIZE,
5039         IMAGE_COMDAT_SELECT_EXACT_MATCH,
5040         IMAGE_COMDAT_SELECT_ASSOCIATIVE,
5041         IMAGE_COMDAT_SELECT_LARGEST,
5042         IMAGE_COMDAT_SELECT_NEWEST,
5043     );
5044     static FLAGS_IMAGE_SUBSYSTEM: &[Flag<u16>] = &flags!(
5045         IMAGE_SUBSYSTEM_UNKNOWN,
5046         IMAGE_SUBSYSTEM_NATIVE,
5047         IMAGE_SUBSYSTEM_WINDOWS_GUI,
5048         IMAGE_SUBSYSTEM_WINDOWS_CUI,
5049         IMAGE_SUBSYSTEM_OS2_CUI,
5050         IMAGE_SUBSYSTEM_POSIX_CUI,
5051         IMAGE_SUBSYSTEM_NATIVE_WINDOWS,
5052         IMAGE_SUBSYSTEM_WINDOWS_CE_GUI,
5053         IMAGE_SUBSYSTEM_EFI_APPLICATION,
5054         IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER,
5055         IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER,
5056         IMAGE_SUBSYSTEM_EFI_ROM,
5057         IMAGE_SUBSYSTEM_XBOX,
5058         IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION,
5059         IMAGE_SUBSYSTEM_XBOX_CODE_CATALOG,
5060     );
5061     static FLAGS_IMAGE_DLLCHARACTERISTICS: &[Flag<u16>] = &flags!(
5062         IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA,
5063         IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE,
5064         IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY,
5065         IMAGE_DLLCHARACTERISTICS_NX_COMPAT,
5066         IMAGE_DLLCHARACTERISTICS_NO_ISOLATION,
5067         IMAGE_DLLCHARACTERISTICS_NO_SEH,
5068         IMAGE_DLLCHARACTERISTICS_NO_BIND,
5069         IMAGE_DLLCHARACTERISTICS_APPCONTAINER,
5070         IMAGE_DLLCHARACTERISTICS_WDM_DRIVER,
5071         IMAGE_DLLCHARACTERISTICS_GUARD_CF,
5072         IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE,
5073     );
5074     static FLAGS_IMAGE_DIRECTORY_ENTRY: &[Flag<usize>] = &flags!(
5075         IMAGE_DIRECTORY_ENTRY_EXPORT,
5076         IMAGE_DIRECTORY_ENTRY_IMPORT,
5077         IMAGE_DIRECTORY_ENTRY_RESOURCE,
5078         IMAGE_DIRECTORY_ENTRY_EXCEPTION,
5079         IMAGE_DIRECTORY_ENTRY_SECURITY,
5080         IMAGE_DIRECTORY_ENTRY_BASERELOC,
5081         IMAGE_DIRECTORY_ENTRY_DEBUG,
5082         IMAGE_DIRECTORY_ENTRY_ARCHITECTURE,
5083         IMAGE_DIRECTORY_ENTRY_GLOBALPTR,
5084         IMAGE_DIRECTORY_ENTRY_TLS,
5085         IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG,
5086         IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
5087         IMAGE_DIRECTORY_ENTRY_IAT,
5088         IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT,
5089         IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR,
5090     );
5091 }
5092