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, §ions);
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(), §ions);
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(), §ions);
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