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::{Bytes, 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 { memmap::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, "{:?}", Bytes(s)).unwrap();
69         }
70     }
71 
group<F: FnOnce(&mut Self)>(&mut self, name: &str, f: F)72     fn group<F: FnOnce(&mut Self)>(&mut self, name: &str, f: F) {
73         self.print_indent();
74         writeln!(self.w, "{} {{", name).unwrap();
75         self.indent += 1;
76         f(self);
77         self.indent -= 1;
78         self.print_indent();
79         writeln!(self.w, "}}").unwrap();
80     }
81 
field_name(&mut self, name: &str)82     fn field_name(&mut self, name: &str) {
83         self.print_indent();
84         if !name.is_empty() {
85             write!(self.w, "{}: ", name).unwrap();
86         }
87     }
88 
field<T: fmt::Display>(&mut self, name: &str, value: T)89     fn field<T: fmt::Display>(&mut self, name: &str, value: T) {
90         self.field_name(name);
91         writeln!(self.w, "{}", value).unwrap();
92     }
93 
field_hex<T: Into<u64>>(&mut self, name: &str, value: T)94     fn field_hex<T: Into<u64>>(&mut self, name: &str, value: T) {
95         self.field_name(name);
96         writeln!(self.w, "0x{:X}", value.into()).unwrap();
97     }
98 
field_bytes(&mut self, name: &str, value: &[u8])99     fn field_bytes(&mut self, name: &str, value: &[u8]) {
100         self.field_name(name);
101         writeln!(self.w, "{:X?}", value).unwrap();
102     }
103 
field_string<T: Into<u64>>(&mut self, name: &str, value: T, s: Option<&[u8]>)104     fn field_string<T: Into<u64>>(&mut self, name: &str, value: T, s: Option<&[u8]>) {
105         if let Some(s) = s {
106             self.field_name(name);
107             self.print_string(s);
108             writeln!(self.w, " (0x{:X})", value.into()).unwrap();
109         } else {
110             self.field_hex(name, value);
111         }
112     }
113 
field_enum<T: Eq + Into<u64>>(&mut self, name: &str, value: T, flags: &[Flag<T>])114     fn field_enum<T: Eq + Into<u64>>(&mut self, name: &str, value: T, flags: &[Flag<T>]) {
115         for flag in flags {
116             if value == flag.value {
117                 self.field_name(name);
118                 writeln!(self.w, "{} (0x{:X})", flag.name, value.into()).unwrap();
119                 return;
120             }
121         }
122         self.field_hex(name, value);
123     }
124 
field_enums<T: Eq + Into<u64>>(&mut self, name: &str, value: T, enums: &[&[Flag<T>]])125     fn field_enums<T: Eq + Into<u64>>(&mut self, name: &str, value: T, enums: &[&[Flag<T>]]) {
126         for flags in enums {
127             for flag in *flags {
128                 if value == flag.value {
129                     self.field_name(name);
130                     writeln!(self.w, "{} (0x{:X})", flag.name, value.into()).unwrap();
131                     return;
132                 }
133             }
134         }
135         self.field_hex(name, value);
136     }
137 
flags<T: Into<u64>, U: Copy + Into<u64>>(&mut self, value: T, mask: U, flags: &[Flag<U>])138     fn flags<T: Into<u64>, U: Copy + Into<u64>>(&mut self, value: T, mask: U, flags: &[Flag<U>]) {
139         let value = value.into();
140         let mask = mask.into();
141         self.indent += 1;
142         if mask != 0 {
143             for flag in flags {
144                 if value & mask == flag.value.into() {
145                     self.print_indent();
146                     writeln!(self.w, "{} (0x{:X})", flag.name, flag.value.into()).unwrap();
147                 }
148             }
149         } else {
150             for flag in flags {
151                 if value & flag.value.into() == flag.value.into() {
152                     self.print_indent();
153                     writeln!(self.w, "{} (0x{:X})", flag.name, flag.value.into()).unwrap();
154                 }
155             }
156         }
157         self.indent -= 1;
158     }
159 }
160 
161 struct Flag<T> {
162     value: T,
163     name: &'static str,
164 }
165 
166 macro_rules! flags {
167     ($($name:ident),+ $(,)?) => ( [ $(Flag { value: $name, name: stringify!($name), }),+ ] )
168 }
169 
print_object(p: &mut Printer<impl Write>, data: &[u8])170 fn print_object(p: &mut Printer<impl Write>, data: &[u8]) {
171     let kind = match object::FileKind::parse(data) {
172         Ok(file) => file,
173         Err(err) => {
174             println!("Failed to parse file: {}", err);
175             return;
176         }
177     };
178     match kind {
179         object::FileKind::Archive => print_archive(p, data),
180         object::FileKind::Elf32 => elf::print_elf32(p, Bytes(data)),
181         object::FileKind::Elf64 => elf::print_elf64(p, Bytes(data)),
182         object::FileKind::MachOFat32 => print_macho_fat32(p, data),
183         object::FileKind::MachOFat64 => print_macho_fat64(p, data),
184         // TODO
185         _ => {}
186     }
187 }
188 
print_archive(p: &mut Printer<impl Write>, data: &[u8])189 fn print_archive(p: &mut Printer<impl Write>, data: &[u8]) {
190     if let Ok(archive) = ArchiveFile::parse(data) {
191         p.field("Format", format!("Archive ({:?})", archive.kind()));
192         for member in archive.members() {
193             if let Ok(member) = member {
194                 p.blank();
195                 p.field("Member", String::from_utf8_lossy(member.name()));
196                 print_object(p, member.data());
197             }
198         }
199     }
200 }
201 
print_macho_fat32(p: &mut Printer<impl Write>, data: &[u8])202 fn print_macho_fat32(p: &mut Printer<impl Write>, data: &[u8]) {
203     if let Ok(arches) = FatHeader::parse_arch32(data) {
204         p.field("Format", "Mach-O Fat 32");
205         for arch in arches {
206             p.blank();
207             p.field("Fat Arch", format!("{:?}", arch.architecture()));
208             if let Ok(data) = arch.data(data) {
209                 print_object(p, data);
210             }
211         }
212     }
213 }
214 
print_macho_fat64(p: &mut Printer<impl Write>, data: &[u8])215 fn print_macho_fat64(p: &mut Printer<impl Write>, data: &[u8]) {
216     if let Ok(arches) = FatHeader::parse_arch64(data) {
217         p.field("Format", "Mach-O Fat 64");
218         for arch in arches {
219             p.blank();
220             p.field("Fat Arch", format!("{:?}", arch.architecture()));
221             if let Ok(data) = arch.data(data) {
222                 print_object(p, data);
223             }
224         }
225     }
226 }
227 
228 mod elf {
229     use super::*;
230     use object::elf::*;
231     use object::read::elf::*;
232 
print_elf32(p: &mut Printer<impl Write>, data: Bytes)233     pub(super) fn print_elf32(p: &mut Printer<impl Write>, data: Bytes) {
234         if let Ok(elf) = object::elf::FileHeader32::<Endianness>::parse(data) {
235             println!("Format: ELF 32-bit");
236             print_elf(p, elf, data);
237         }
238     }
239 
print_elf64(p: &mut Printer<impl Write>, data: Bytes)240     pub(super) fn print_elf64(p: &mut Printer<impl Write>, data: Bytes) {
241         if let Ok(elf) = object::elf::FileHeader64::<Endianness>::parse(data) {
242             println!("Format: ELF 64-bit");
243             print_elf(p, elf, data);
244         }
245     }
246 
print_elf<Elf: FileHeader<Endian = Endianness>>( p: &mut Printer<impl Write>, elf: &Elf, data: Bytes, )247     fn print_elf<Elf: FileHeader<Endian = Endianness>>(
248         p: &mut Printer<impl Write>,
249         elf: &Elf,
250         data: Bytes,
251     ) {
252         if let Ok(endian) = elf.endian() {
253             print_file_header(p, endian, elf);
254             if let Ok(segments) = elf.program_headers(endian, data) {
255                 print_program_headers(p, endian, data, elf, segments);
256             }
257             if let Ok(sections) = elf.sections(endian, data) {
258                 print_section_headers(p, endian, data, elf, &sections);
259             }
260         }
261     }
262 
print_file_header<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, elf: &Elf, )263     fn print_file_header<Elf: FileHeader>(
264         p: &mut Printer<impl Write>,
265         endian: Elf::Endian,
266         elf: &Elf,
267     ) {
268         p.group("FileHeader", |p| {
269             p.group("Ident", |p| print_ident(p, elf.e_ident()));
270             p.field_enum("Type", elf.e_type(endian), &FLAGS_ET);
271             p.field_enum("Machine", elf.e_machine(endian), &FLAGS_EM);
272             let version = elf.e_version(endian);
273             if version < 256 {
274                 p.field_enum("Version", version as u8, &FLAGS_EV);
275             } else {
276                 p.field_hex("Version", version);
277             }
278             p.field_enum("Type", elf.e_type(endian), &FLAGS_ET);
279             p.field_hex("Entry", elf.e_entry(endian));
280             p.field_hex("ProgramHeaderOffset", elf.e_phoff(endian));
281             p.field_hex("SectionHeaderOffset", elf.e_shoff(endian));
282             let flags = elf.e_flags(endian);
283             p.field_hex("Flags", flags);
284             match elf.e_machine(endian) {
285                 EM_SPARC => p.flags(flags, 0, &FLAGS_EF_SPARC),
286                 EM_SPARCV9 => p.flags(flags, 0, &FLAGS_EF_SPARCV9),
287                 EM_MIPS => {
288                     p.flags(flags, 0, &FLAGS_EF_MIPS);
289                     p.flags(flags, EF_MIPS_ARCH, &FLAGS_EF_MIPS_ARCH);
290                 }
291                 EM_PARISC => {
292                     p.flags(flags, 0, &FLAGS_EF_PARISC);
293                     p.flags(flags, EF_PARISC_ARCH, &FLAGS_EF_PARISC_ARCH);
294                 }
295                 EM_ALPHA => p.flags(flags, 0, &FLAGS_EF_ALPHA),
296                 EM_PPC => p.flags(flags, 0, &FLAGS_EF_PPC),
297                 EM_PPC64 => p.flags(flags, 0, &FLAGS_EF_PPC64),
298                 EM_ARM => {
299                     p.flags(flags, 0, &FLAGS_EF_ARM);
300                     p.flags(flags, EF_ARM_EABIMASK, &FLAGS_EF_ARM_EABI);
301                 }
302                 EM_CSKY => p.flags(flags, EF_CSKY_ABIMASK, &FLAGS_EF_CSKY_ABI),
303                 EM_IA_64 => p.flags(flags, 0, &FLAGS_EF_IA_64),
304                 EM_SH => p.flags(flags, EF_SH_MACH_MASK, &FLAGS_EF_SH_MACH),
305                 EM_S390 => p.flags(flags, 0, &FLAGS_EF_S390),
306                 EM_RISCV => {
307                     p.flags(flags, 0, &FLAGS_EF_RISCV);
308                     p.flags(flags, EF_RISCV_FLOAT_ABI, &FLAGS_EF_RISCV_FLOAT_ABI);
309                 }
310                 _ => {}
311             };
312             p.field_hex("HeaderSize", elf.e_ehsize(endian));
313             p.field_hex("ProgramHeaderEntrySize", elf.e_phentsize(endian));
314             p.field("ProgramHeaderCount", elf.e_phnum(endian));
315             p.field_hex("SectionHeaderEntrySize", elf.e_shentsize(endian));
316             p.field("SectionHeaderCount", elf.e_shnum(endian));
317             p.field("SectionHeaderStringTableIndex", elf.e_shstrndx(endian));
318         });
319     }
320 
print_ident(p: &mut Printer<impl Write>, ident: &Ident)321     fn print_ident(p: &mut Printer<impl Write>, ident: &Ident) {
322         p.field("Magic", format!("{:X?}", ident.magic));
323         p.field_enum("Class", ident.class, &FLAGS_EI_CLASS);
324         p.field_enum("Data", ident.data, &FLAGS_EI_DATA);
325         p.field_enum("Version", ident.version, &FLAGS_EV);
326         p.field_enum("OsAbi", ident.os_abi, &FLAGS_EI_OSABI);
327         p.field_hex("AbiVersion", ident.abi_version);
328         p.field("Unused", format!("{:X?}", ident.padding));
329     }
330 
print_program_headers<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: Bytes, elf: &Elf, segments: &[Elf::ProgramHeader], )331     fn print_program_headers<Elf: FileHeader>(
332         p: &mut Printer<impl Write>,
333         endian: Elf::Endian,
334         data: Bytes,
335         elf: &Elf,
336         segments: &[Elf::ProgramHeader],
337     ) {
338         for segment in segments {
339             p.group("ProgramHeader", |p| {
340                 let proc = match elf.e_machine(endian) {
341                     EM_MIPS => FLAGS_PT_MIPS,
342                     EM_PARISC => FLAGS_PT_PARISC,
343                     EM_ARM => FLAGS_PT_ARM,
344                     EM_IA_64 => FLAGS_PT_IA_64,
345                     _ => &[],
346                 };
347                 let os = match elf.e_ident().os_abi {
348                     ELFOSABI_HPUX => FLAGS_PT_HP,
349                     _ => &[],
350                 };
351                 p.field_enums("Type", segment.p_type(endian), &[FLAGS_PT, proc, os]);
352 
353                 p.field_hex("Offset", segment.p_offset(endian));
354                 p.field_hex("VirtualAddress", segment.p_vaddr(endian));
355                 p.field_hex("PhysicalAddress", segment.p_paddr(endian));
356                 p.field_hex("FileSize", segment.p_filesz(endian));
357                 p.field_hex("MemorySize", segment.p_memsz(endian));
358 
359                 let flags = segment.p_flags(endian);
360                 p.field_hex("Flags", flags);
361                 p.flags(flags, 0, FLAGS_PF);
362                 match elf.e_ident().os_abi {
363                     ELFOSABI_HPUX => p.flags(flags, 0, FLAGS_PF_HP),
364                     _ => {}
365                 };
366                 match elf.e_machine(endian) {
367                     EM_MIPS => p.flags(flags, 0, FLAGS_PF_MIPS),
368                     EM_PARISC => p.flags(flags, 0, FLAGS_PF_PARISC),
369                     EM_ARM => p.flags(flags, 0, FLAGS_PF_ARM),
370                     EM_IA_64 => p.flags(flags, 0, FLAGS_PF_IA_64),
371                     _ => {}
372                 };
373 
374                 p.field_hex("Align", segment.p_align(endian));
375 
376                 match segment.p_type(endian) {
377                     PT_NOTE => print_segment_notes(p, endian, data, elf, segment),
378                     PT_DYNAMIC => print_segment_dynamic(p, endian, data, elf, segments, segment),
379                     // TODO:
380                     //PT_INTERP =>
381                     //PT_SHLIB =>
382                     //PT_PHDR =>
383                     //PT_TLS =>
384                     //PT_GNU_EH_FRAME =>
385                     //PT_GNU_STACK =>
386                     //PT_GNU_RELRO =>
387                     _ => {}
388                 }
389             });
390         }
391     }
392 
print_segment_notes<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: Bytes, _elf: &Elf, segment: &Elf::ProgramHeader, )393     fn print_segment_notes<Elf: FileHeader>(
394         p: &mut Printer<impl Write>,
395         endian: Elf::Endian,
396         data: Bytes,
397         _elf: &Elf,
398         segment: &Elf::ProgramHeader,
399     ) {
400         if let Ok(Some(notes)) = segment.notes(endian, data) {
401             print_notes(p, endian, notes);
402         }
403     }
404 
print_segment_dynamic<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: Bytes, elf: &Elf, segments: &[Elf::ProgramHeader], segment: &Elf::ProgramHeader, )405     fn print_segment_dynamic<Elf: FileHeader>(
406         p: &mut Printer<impl Write>,
407         endian: Elf::Endian,
408         data: Bytes,
409         elf: &Elf,
410         segments: &[Elf::ProgramHeader],
411         segment: &Elf::ProgramHeader,
412     ) {
413         if let Ok(Some(dynamic)) = segment.dynamic(endian, data) {
414             // TODO: add a helper API for this and the other mandatory tags?
415             let mut strtab = 0;
416             let mut strsz = 0;
417             for d in dynamic {
418                 let tag = d.d_tag(endian).into();
419                 if tag == DT_STRTAB.into() {
420                     strtab = d.d_val(endian).into();
421                 } else if tag == DT_STRSZ.into() {
422                     strsz = d.d_val(endian).into();
423                 }
424             }
425             let mut dynstr = object::StringTable::default();
426             for s in segments {
427                 if let Ok(Some(data)) = s.data_range(endian, data, strtab, strsz) {
428                     dynstr = object::StringTable::new(data);
429                     break;
430                 }
431             }
432 
433             let proc = match elf.e_machine(endian) {
434                 EM_SPARC => FLAGS_DT_SPARC,
435                 EM_MIPS => FLAGS_DT_MIPS,
436                 EM_ALPHA => FLAGS_DT_ALPHA,
437                 EM_PPC => FLAGS_DT_PPC,
438                 EM_PPC64 => FLAGS_DT_PPC64,
439                 EM_IA_64 => FLAGS_DT_IA_64,
440                 EM_ALTERA_NIOS2 => FLAGS_DT_NIOS2,
441                 _ => &[],
442             };
443             for d in dynamic {
444                 let tag = d.d_tag(endian).into();
445                 let val = d.d_val(endian).into();
446                 p.group("Dynamic", |p| {
447                     if let Ok(tag) = tag.try_into() {
448                         p.field_enums("Tag", tag, &[FLAGS_DT, proc]);
449                         if tag == DT_NEEDED {
450                             p.field_string(
451                                 "Value",
452                                 val,
453                                 val.try_into().ok().and_then(|val| dynstr.get(val).ok()),
454                             );
455                         } else {
456                             p.field_hex("Value", val);
457                             if tag == DT_FLAGS {
458                                 p.flags(val, 0, FLAGS_DF);
459                             } else if tag == DT_FLAGS_1 {
460                                 p.flags(val, 0, FLAGS_DF_1);
461                             }
462                         }
463                     } else {
464                         p.field_hex("Tag", tag);
465                         p.field_hex("Value", val);
466                     }
467                 });
468                 if tag == DT_NULL.into() {
469                     break;
470                 }
471             }
472         }
473     }
474 
print_section_headers<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: Bytes, elf: &Elf, sections: &SectionTable<Elf>, )475     fn print_section_headers<Elf: FileHeader>(
476         p: &mut Printer<impl Write>,
477         endian: Elf::Endian,
478         data: Bytes,
479         elf: &Elf,
480         sections: &SectionTable<Elf>,
481     ) {
482         for (index, section) in sections.iter().enumerate() {
483             p.group("SectionHeader", |p| {
484                 p.field("Index", index);
485                 p.field_string(
486                     "Name",
487                     section.sh_name(endian),
488                     sections.section_name(endian, section).ok(),
489                 );
490 
491                 let proc = match elf.e_machine(endian) {
492                     EM_MIPS => FLAGS_SHT_MIPS,
493                     EM_PARISC => FLAGS_SHT_PARISC,
494                     EM_ALPHA => FLAGS_SHT_ALPHA,
495                     EM_ARM => FLAGS_SHT_ARM,
496                     EM_CSKY => FLAGS_SHT_CSKY,
497                     EM_IA_64 => FLAGS_SHT_IA_64,
498                     EM_X86_64 => FLAGS_SHT_X86_64,
499                     _ => &[],
500                 };
501                 p.field_enums("Type", section.sh_type(endian), &[FLAGS_SHT, proc]);
502 
503                 let flags = section.sh_flags(endian).into();
504                 p.field_hex("Flags", flags);
505                 p.flags(flags, 0, FLAGS_SHF);
506                 match elf.e_machine(endian) {
507                     EM_MIPS => p.flags(flags, 0, FLAGS_SHF_MIPS),
508                     EM_PARISC => p.flags(flags, 0, FLAGS_SHF_PARISC),
509                     EM_ALPHA => p.flags(flags, 0, FLAGS_SHF_ALPHA),
510                     EM_ARM => p.flags(flags, 0, FLAGS_SHF_ARM),
511                     EM_IA_64 => p.flags(flags, 0, FLAGS_SHF_IA_64),
512                     _ => {}
513                 }
514 
515                 p.field_hex("Address", section.sh_addr(endian));
516                 p.field_hex("Offset", section.sh_offset(endian));
517                 p.field_hex("Size", section.sh_size(endian));
518                 p.field("Link", section.sh_link(endian));
519                 p.field("Info", section.sh_info(endian));
520                 p.field_hex("AddressAlign", section.sh_addralign(endian));
521                 p.field_hex("EntrySize", section.sh_entsize(endian));
522 
523                 match section.sh_type(endian) {
524                     SHT_SYMTAB | SHT_DYNSYM => {
525                         print_section_symbols(p, endian, data, elf, sections, index, section)
526                     }
527                     SHT_REL => print_section_rel(p, endian, data, elf, sections, section),
528                     SHT_RELA => print_section_rela(p, endian, data, elf, sections, section),
529                     SHT_NOTE => print_section_notes(p, endian, data, elf, section),
530                     SHT_GROUP => print_section_group(p, endian, data, elf, sections, section),
531                     // TODO:
532                     //SHT_HASH =>
533                     //SHT_DYNAMIC =>
534                     //SHT_SHLIB =>
535                     //SHT_INIT_ARRAY =>
536                     //SHT_FINI_ARRAY =>
537                     //SHT_PREINIT_ARRAY =>
538                     _ => {}
539                 }
540             });
541         }
542     }
543 
print_section_symbols<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: Bytes, elf: &Elf, sections: &SectionTable<Elf>, section_index: usize, section: &Elf::SectionHeader, )544     fn print_section_symbols<Elf: FileHeader>(
545         p: &mut Printer<impl Write>,
546         endian: Elf::Endian,
547         data: Bytes,
548         elf: &Elf,
549         sections: &SectionTable<Elf>,
550         section_index: usize,
551         section: &Elf::SectionHeader,
552     ) {
553         if let Ok(Some(symbols)) = section.symbols(endian, data, sections, section_index) {
554             let os_stt = match elf.e_ident().os_abi {
555                 ELFOSABI_GNU => FLAGS_STT_GNU,
556                 ELFOSABI_HPUX => FLAGS_STT_HP,
557                 _ => &[],
558             };
559             let proc_stt = match elf.e_machine(endian) {
560                 EM_SPARC => FLAGS_STT_SPARC,
561                 EM_PARISC => FLAGS_STT_PARISC,
562                 EM_ARM => FLAGS_STT_ARM,
563                 _ => &[],
564             };
565             let os_stb = match elf.e_ident().os_abi {
566                 ELFOSABI_GNU => FLAGS_STB_GNU,
567                 _ => &[],
568             };
569             let proc_stb = match elf.e_machine(endian) {
570                 EM_MIPS => FLAGS_STB_MIPS,
571                 _ => &[],
572             };
573             let proc_shn = match elf.e_machine(endian) {
574                 EM_MIPS => FLAGS_SHN_MIPS,
575                 EM_PARISC => FLAGS_SHN_PARISC,
576                 _ => &[],
577             };
578             for (index, symbol) in symbols.iter().enumerate() {
579                 p.group("Symbol", |p| {
580                     p.field("Index", index);
581                     p.field_string(
582                         "Name",
583                         symbol.st_name(endian),
584                         symbol.name(endian, symbols.strings()).ok(),
585                     );
586                     p.field_hex("Value", symbol.st_value(endian));
587                     p.field_hex("Size", symbol.st_size(endian));
588                     p.field_enums("Type", symbol.st_type(), &[FLAGS_STT, os_stt, proc_stt]);
589                     p.field_enums("Bind", symbol.st_bind(), &[FLAGS_STB, os_stb, proc_stb]);
590 
591                     let other = symbol.st_other();
592                     if other & !0x3 == 0 {
593                         p.field_enum("Other", other, FLAGS_STV);
594                     } else {
595                         p.field_hex("Other", other);
596                         p.flags(other, 0x3, FLAGS_STV);
597                         match elf.e_machine(endian) {
598                             EM_MIPS => p.flags(other, 0, FLAGS_STO_MIPS),
599                             EM_ALPHA => p.flags(other, 0, FLAGS_STO_ALPHA),
600                             EM_PPC64 => p.field_hex(
601                                 "Local",
602                                 (other & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT,
603                             ),
604                             _ => {}
605                         }
606                     }
607 
608                     let shndx = symbol.st_shndx(endian);
609                     if shndx == SHN_UNDEF || shndx >= SHN_LORESERVE {
610                         p.field_enums("SectionIndex", shndx, &[FLAGS_SHN, proc_shn]);
611                     } else {
612                         p.field("SectionIndex", shndx);
613                     }
614                     if let Some(shndx) = symbols.shndx(index) {
615                         p.field("ExtendedSectionIndex", shndx);
616                     }
617                 });
618             }
619         }
620     }
621 
print_section_rel<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: Bytes, elf: &Elf, sections: &SectionTable<Elf>, section: &Elf::SectionHeader, )622     fn print_section_rel<Elf: FileHeader>(
623         p: &mut Printer<impl Write>,
624         endian: Elf::Endian,
625         data: Bytes,
626         elf: &Elf,
627         sections: &SectionTable<Elf>,
628         section: &Elf::SectionHeader,
629     ) {
630         if let Ok(Some(relocations)) = section.rel(endian, data) {
631             let symbols = section.relocation_symbols(endian, data, sections).ok();
632             let proc = rel_flag_type(endian, elf);
633             for relocation in relocations {
634                 p.group("Relocation", |p| {
635                     p.field_hex("Offset", relocation.r_offset(endian));
636                     p.field_enum("Type", relocation.r_type(endian), proc);
637                     let sym = relocation.r_sym(endian);
638                     p.field_string("Symbol", sym, rel_symbol(endian, symbols, sym as usize));
639                 });
640             }
641         }
642     }
643 
print_section_rela<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: Bytes, elf: &Elf, sections: &SectionTable<Elf>, section: &Elf::SectionHeader, )644     fn print_section_rela<Elf: FileHeader>(
645         p: &mut Printer<impl Write>,
646         endian: Elf::Endian,
647         data: Bytes,
648         elf: &Elf,
649         sections: &SectionTable<Elf>,
650         section: &Elf::SectionHeader,
651     ) {
652         if let Ok(Some(relocations)) = section.rela(endian, data) {
653             let symbols = section.relocation_symbols(endian, data, sections).ok();
654             let proc = rel_flag_type(endian, elf);
655             for relocation in relocations {
656                 p.group("Relocation", |p| {
657                     p.field_hex("Offset", relocation.r_offset(endian));
658                     p.field_enum("Type", relocation.r_type(endian), proc);
659                     let sym = relocation.r_sym(endian);
660                     p.field_string("Symbol", sym, rel_symbol(endian, symbols, sym as usize));
661                     let addend = relocation.r_addend(endian).into() as u64;
662                     if addend != 0 {
663                         p.field_hex("Addend", addend);
664                     }
665                 });
666             }
667         }
668     }
669 
rel_symbol<'data, Elf: FileHeader>( endian: Elf::Endian, symbols: Option<SymbolTable<'data, Elf>>, sym: usize, ) -> Option<&'data [u8]>670     fn rel_symbol<'data, Elf: FileHeader>(
671         endian: Elf::Endian,
672         symbols: Option<SymbolTable<'data, Elf>>,
673         sym: usize,
674     ) -> Option<&'data [u8]> {
675         let symbols = symbols?;
676         let symbol = symbols.symbol(sym as usize).ok()?;
677         symbol.name(endian, symbols.strings()).ok()
678     }
679 
rel_flag_type<Elf: FileHeader>(endian: Elf::Endian, elf: &Elf) -> &'static [Flag<u32>]680     fn rel_flag_type<Elf: FileHeader>(endian: Elf::Endian, elf: &Elf) -> &'static [Flag<u32>] {
681         match elf.e_machine(endian) {
682             EM_68K => FLAGS_R_68K,
683             EM_386 => FLAGS_R_386,
684             EM_SPARC => FLAGS_R_SPARC,
685             EM_MIPS => FLAGS_R_MIPS,
686             EM_PARISC => FLAGS_R_PARISC,
687             EM_ALPHA => FLAGS_R_ALPHA,
688             EM_PPC => FLAGS_R_PPC,
689             EM_PPC64 => FLAGS_R_PPC64,
690             EM_AARCH64 => FLAGS_R_AARCH64,
691             EM_ARM => FLAGS_R_ARM,
692             EM_CSKY => FLAGS_R_CKCORE,
693             EM_IA_64 => FLAGS_R_IA64,
694             EM_SH => FLAGS_R_SH,
695             EM_S390 => FLAGS_R_390,
696             EM_CRIS => FLAGS_R_CRIS,
697             EM_X86_64 => FLAGS_R_X86_64,
698             EM_MN10300 => FLAGS_R_MN10300,
699             EM_M32R => FLAGS_R_M32R,
700             EM_MICROBLAZE => FLAGS_R_MICROBLAZE,
701             EM_ALTERA_NIOS2 => FLAGS_R_NIOS2,
702             EM_TILEPRO => FLAGS_R_TILEPRO,
703             EM_TILEGX => FLAGS_R_TILEGX,
704             EM_RISCV => FLAGS_R_RISCV,
705             EM_BPF => FLAGS_R_BPF,
706             EM_METAG => FLAGS_R_METAG,
707             EM_NDS32 => FLAGS_R_NDS32,
708             _ => &[],
709         }
710     }
711 
print_section_notes<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: Bytes, _elf: &Elf, section: &Elf::SectionHeader, )712     fn print_section_notes<Elf: FileHeader>(
713         p: &mut Printer<impl Write>,
714         endian: Elf::Endian,
715         data: Bytes,
716         _elf: &Elf,
717         section: &Elf::SectionHeader,
718     ) {
719         if let Ok(Some(notes)) = section.notes(endian, data) {
720             print_notes(p, endian, notes);
721         }
722     }
723 
print_section_group<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, data: Bytes, _elf: &Elf, sections: &SectionTable<Elf>, section: &Elf::SectionHeader, )724     fn print_section_group<Elf: FileHeader>(
725         p: &mut Printer<impl Write>,
726         endian: Elf::Endian,
727         data: Bytes,
728         _elf: &Elf,
729         sections: &SectionTable<Elf>,
730         section: &Elf::SectionHeader,
731     ) {
732         if let Ok(Some((flag, members))) = section.group(endian, data) {
733             p.field_enum("GroupFlag", flag, FLAGS_GRP);
734             p.group("GroupSections", |p| {
735                 for member in members {
736                     let index = member.get(endian);
737                     p.print_indent();
738                     if let Ok(section) = sections.section(index as usize) {
739                         if let Ok(name) = sections.section_name(endian, section) {
740                             p.print_string(name);
741                             writeln!(p.w, " ({})", index).unwrap();
742                         } else {
743                             writeln!(p.w, "{}", index).unwrap();
744                         }
745                     } else {
746                         writeln!(p.w, "{}", index).unwrap();
747                     }
748                 }
749             });
750         }
751     }
752 
print_notes<Elf: FileHeader>( p: &mut Printer<impl Write>, endian: Elf::Endian, mut notes: NoteIterator<Elf>, )753     fn print_notes<Elf: FileHeader>(
754         p: &mut Printer<impl Write>,
755         endian: Elf::Endian,
756         mut notes: NoteIterator<Elf>,
757     ) {
758         while let Ok(Some(note)) = notes.next() {
759             p.group("Note", |p| {
760                 let name = note.name();
761                 p.field_string("Name", note.n_namesz(endian), Some(name));
762                 let flags = if name == ELF_NOTE_CORE || name == ELF_NOTE_LINUX {
763                     FLAGS_NT_CORE
764                 } else if name == ELF_NOTE_SOLARIS {
765                     FLAGS_NT_SOLARIS
766                 } else if name == ELF_NOTE_GNU {
767                     FLAGS_NT_GNU
768                 } else {
769                     // TODO: NT_VERSION
770                     &[]
771                 };
772                 p.field_enum("Type", note.n_type(endian), flags);
773                 // TODO: interpret desc
774                 p.field_bytes("Desc", note.desc());
775             });
776         }
777     }
778 
779     static FLAGS_EI_CLASS: &[Flag<u8>] = &flags!(ELFCLASSNONE, ELFCLASS32, ELFCLASS64);
780     static FLAGS_EI_DATA: &[Flag<u8>] = &flags!(ELFDATANONE, ELFDATA2LSB, ELFDATA2MSB);
781     static FLAGS_EV: &[Flag<u8>] = &flags!(EV_NONE, EV_CURRENT);
782     static FLAGS_EI_OSABI: &[Flag<u8>] = &flags!(
783         ELFOSABI_SYSV,
784         ELFOSABI_HPUX,
785         ELFOSABI_NETBSD,
786         ELFOSABI_GNU,
787         ELFOSABI_SOLARIS,
788         ELFOSABI_AIX,
789         ELFOSABI_IRIX,
790         ELFOSABI_FREEBSD,
791         ELFOSABI_TRU64,
792         ELFOSABI_MODESTO,
793         ELFOSABI_OPENBSD,
794         ELFOSABI_ARM_AEABI,
795         ELFOSABI_ARM,
796         ELFOSABI_STANDALONE,
797     );
798     static FLAGS_ET: &[Flag<u16>] = &flags!(ET_NONE, ET_REL, ET_EXEC, ET_DYN, ET_CORE);
799     static FLAGS_EM: &[Flag<u16>] = &flags!(
800         EM_NONE,
801         EM_M32,
802         EM_SPARC,
803         EM_386,
804         EM_68K,
805         EM_88K,
806         EM_IAMCU,
807         EM_860,
808         EM_MIPS,
809         EM_S370,
810         EM_MIPS_RS3_LE,
811         EM_PARISC,
812         EM_VPP500,
813         EM_SPARC32PLUS,
814         EM_960,
815         EM_PPC,
816         EM_PPC64,
817         EM_S390,
818         EM_SPU,
819         EM_V800,
820         EM_FR20,
821         EM_RH32,
822         EM_RCE,
823         EM_ARM,
824         EM_FAKE_ALPHA,
825         EM_SH,
826         EM_SPARCV9,
827         EM_TRICORE,
828         EM_ARC,
829         EM_H8_300,
830         EM_H8_300H,
831         EM_H8S,
832         EM_H8_500,
833         EM_IA_64,
834         EM_MIPS_X,
835         EM_COLDFIRE,
836         EM_68HC12,
837         EM_MMA,
838         EM_PCP,
839         EM_NCPU,
840         EM_NDR1,
841         EM_STARCORE,
842         EM_ME16,
843         EM_ST100,
844         EM_TINYJ,
845         EM_X86_64,
846         EM_PDSP,
847         EM_PDP10,
848         EM_PDP11,
849         EM_FX66,
850         EM_ST9PLUS,
851         EM_ST7,
852         EM_68HC16,
853         EM_68HC11,
854         EM_68HC08,
855         EM_68HC05,
856         EM_SVX,
857         EM_ST19,
858         EM_VAX,
859         EM_CRIS,
860         EM_JAVELIN,
861         EM_FIREPATH,
862         EM_ZSP,
863         EM_MMIX,
864         EM_HUANY,
865         EM_PRISM,
866         EM_AVR,
867         EM_FR30,
868         EM_D10V,
869         EM_D30V,
870         EM_V850,
871         EM_M32R,
872         EM_MN10300,
873         EM_MN10200,
874         EM_PJ,
875         EM_OPENRISC,
876         EM_ARC_COMPACT,
877         EM_XTENSA,
878         EM_VIDEOCORE,
879         EM_TMM_GPP,
880         EM_NS32K,
881         EM_TPC,
882         EM_SNP1K,
883         EM_ST200,
884         EM_IP2K,
885         EM_MAX,
886         EM_CR,
887         EM_F2MC16,
888         EM_MSP430,
889         EM_BLACKFIN,
890         EM_SE_C33,
891         EM_SEP,
892         EM_ARCA,
893         EM_UNICORE,
894         EM_EXCESS,
895         EM_DXP,
896         EM_ALTERA_NIOS2,
897         EM_CRX,
898         EM_XGATE,
899         EM_C166,
900         EM_M16C,
901         EM_DSPIC30F,
902         EM_CE,
903         EM_M32C,
904         EM_TSK3000,
905         EM_RS08,
906         EM_SHARC,
907         EM_ECOG2,
908         EM_SCORE7,
909         EM_DSP24,
910         EM_VIDEOCORE3,
911         EM_LATTICEMICO32,
912         EM_SE_C17,
913         EM_TI_C6000,
914         EM_TI_C2000,
915         EM_TI_C5500,
916         EM_TI_ARP32,
917         EM_TI_PRU,
918         EM_MMDSP_PLUS,
919         EM_CYPRESS_M8C,
920         EM_R32C,
921         EM_TRIMEDIA,
922         EM_QDSP6,
923         EM_8051,
924         EM_STXP7X,
925         EM_NDS32,
926         EM_ECOG1X,
927         EM_MAXQ30,
928         EM_XIMO16,
929         EM_MANIK,
930         EM_CRAYNV2,
931         EM_RX,
932         EM_METAG,
933         EM_MCST_ELBRUS,
934         EM_ECOG16,
935         EM_CR16,
936         EM_ETPU,
937         EM_SLE9X,
938         EM_L10M,
939         EM_K10M,
940         EM_AARCH64,
941         EM_AVR32,
942         EM_STM8,
943         EM_TILE64,
944         EM_TILEPRO,
945         EM_MICROBLAZE,
946         EM_CUDA,
947         EM_TILEGX,
948         EM_CLOUDSHIELD,
949         EM_COREA_1ST,
950         EM_COREA_2ND,
951         EM_ARC_COMPACT2,
952         EM_OPEN8,
953         EM_RL78,
954         EM_VIDEOCORE5,
955         EM_78KOR,
956         EM_56800EX,
957         EM_BA1,
958         EM_BA2,
959         EM_XCORE,
960         EM_MCHP_PIC,
961         EM_KM32,
962         EM_KMX32,
963         EM_EMX16,
964         EM_EMX8,
965         EM_KVARC,
966         EM_CDP,
967         EM_COGE,
968         EM_COOL,
969         EM_NORC,
970         EM_CSR_KALIMBA,
971         EM_Z80,
972         EM_VISIUM,
973         EM_FT32,
974         EM_MOXIE,
975         EM_AMDGPU,
976         EM_RISCV,
977         EM_BPF,
978         EM_CSKY,
979         EM_ALPHA,
980     );
981     static FLAGS_EF_SPARC: &[Flag<u32>] = &flags!(
982         EF_SPARC_LEDATA,
983         EF_SPARC_EXT_MASK,
984         EF_SPARC_32PLUS,
985         EF_SPARC_SUN_US1,
986         EF_SPARC_HAL_R1,
987         EF_SPARC_SUN_US3,
988     );
989     static FLAGS_EF_SPARCV9: &[Flag<u32>] = &flags!(
990         EF_SPARCV9_MM,
991         EF_SPARCV9_TSO,
992         EF_SPARCV9_PSO,
993         EF_SPARCV9_RMO,
994     );
995     static FLAGS_EF_MIPS: &[Flag<u32>] = &flags!(
996         EF_MIPS_NOREORDER,
997         EF_MIPS_PIC,
998         EF_MIPS_CPIC,
999         EF_MIPS_XGOT,
1000         EF_MIPS_64BIT_WHIRL,
1001         EF_MIPS_ABI2,
1002         EF_MIPS_ABI_ON32,
1003         EF_MIPS_FP64,
1004         EF_MIPS_NAN2008,
1005     );
1006     static FLAGS_EF_MIPS_ARCH: &[Flag<u32>] = &flags!(
1007         EF_MIPS_ARCH_1,
1008         EF_MIPS_ARCH_2,
1009         EF_MIPS_ARCH_3,
1010         EF_MIPS_ARCH_4,
1011         EF_MIPS_ARCH_5,
1012         EF_MIPS_ARCH_32,
1013         EF_MIPS_ARCH_64,
1014         EF_MIPS_ARCH_32R2,
1015         EF_MIPS_ARCH_64R2,
1016     );
1017     static FLAGS_EF_PARISC: &[Flag<u32>] = &flags!(
1018         EF_PARISC_TRAPNIL,
1019         EF_PARISC_EXT,
1020         EF_PARISC_LSB,
1021         EF_PARISC_WIDE,
1022         EF_PARISC_NO_KABP,
1023         EF_PARISC_LAZYSWAP,
1024     );
1025     static FLAGS_EF_PARISC_ARCH: &[Flag<u32>] =
1026         &flags!(EFA_PARISC_1_0, EFA_PARISC_1_1, EFA_PARISC_2_0);
1027     static FLAGS_EF_ALPHA: &[Flag<u32>] = &flags!(EF_ALPHA_32BIT, EF_ALPHA_CANRELAX);
1028     static FLAGS_EF_PPC: &[Flag<u32>] =
1029         &flags!(EF_PPC_EMB, EF_PPC_RELOCATABLE, EF_PPC_RELOCATABLE_LIB);
1030     static FLAGS_EF_PPC64: &[Flag<u32>] = &flags!(EF_PPC64_ABI);
1031     static FLAGS_EF_ARM: &[Flag<u32>] = &flags!(
1032         EF_ARM_RELEXEC,
1033         EF_ARM_HASENTRY,
1034         EF_ARM_INTERWORK,
1035         EF_ARM_APCS_26,
1036         EF_ARM_APCS_FLOAT,
1037         EF_ARM_PIC,
1038         EF_ARM_ALIGN8,
1039         EF_ARM_NEW_ABI,
1040         EF_ARM_OLD_ABI,
1041         EF_ARM_SOFT_FLOAT,
1042         EF_ARM_VFP_FLOAT,
1043         EF_ARM_MAVERICK_FLOAT,
1044         EF_ARM_BE8,
1045         EF_ARM_LE8,
1046     );
1047     static FLAGS_EF_ARM_EABI: &[Flag<u32>] = &flags!(
1048         EF_ARM_EABI_UNKNOWN,
1049         EF_ARM_EABI_VER1,
1050         EF_ARM_EABI_VER2,
1051         EF_ARM_EABI_VER3,
1052         EF_ARM_EABI_VER4,
1053         EF_ARM_EABI_VER5,
1054     );
1055     static FLAGS_EF_CSKY_ABI: &[Flag<u32>] = &flags!(EF_CSKY_ABIV1, EF_CSKY_ABIV2);
1056     static FLAGS_EF_IA_64: &[Flag<u32>] = &flags!(EF_IA_64_ABI64);
1057     static FLAGS_EF_SH_MACH: &[Flag<u32>] = &flags!(
1058         EF_SH_UNKNOWN,
1059         EF_SH1,
1060         EF_SH2,
1061         EF_SH3,
1062         EF_SH_DSP,
1063         EF_SH3_DSP,
1064         EF_SH4AL_DSP,
1065         EF_SH3E,
1066         EF_SH4,
1067         EF_SH2E,
1068         EF_SH4A,
1069         EF_SH2A,
1070         EF_SH4_NOFPU,
1071         EF_SH4A_NOFPU,
1072         EF_SH4_NOMMU_NOFPU,
1073         EF_SH2A_NOFPU,
1074         EF_SH3_NOMMU,
1075         EF_SH2A_SH4_NOFPU,
1076         EF_SH2A_SH3_NOFPU,
1077         EF_SH2A_SH4,
1078         EF_SH2A_SH3E,
1079     );
1080     static FLAGS_EF_S390: &[Flag<u32>] = &flags!(EF_S390_HIGH_GPRS);
1081     static FLAGS_EF_RISCV: &[Flag<u32>] = &flags!(EF_RISCV_RVC);
1082     static FLAGS_EF_RISCV_FLOAT_ABI: &[Flag<u32>] = &flags!(
1083         EF_RISCV_FLOAT_ABI_SOFT,
1084         EF_RISCV_FLOAT_ABI_SINGLE,
1085         EF_RISCV_FLOAT_ABI_DOUBLE,
1086         EF_RISCV_FLOAT_ABI_QUAD,
1087     );
1088     static FLAGS_PT: &[Flag<u32>] = &flags!(
1089         PT_NULL,
1090         PT_LOAD,
1091         PT_DYNAMIC,
1092         PT_INTERP,
1093         PT_NOTE,
1094         PT_SHLIB,
1095         PT_PHDR,
1096         PT_TLS,
1097         PT_LOOS,
1098         PT_GNU_EH_FRAME,
1099         PT_GNU_STACK,
1100         PT_GNU_RELRO,
1101     );
1102     static FLAGS_PT_HP: &[Flag<u32>] = &flags!(
1103         PT_HP_TLS,
1104         PT_HP_CORE_NONE,
1105         PT_HP_CORE_VERSION,
1106         PT_HP_CORE_KERNEL,
1107         PT_HP_CORE_COMM,
1108         PT_HP_CORE_PROC,
1109         PT_HP_CORE_LOADABLE,
1110         PT_HP_CORE_STACK,
1111         PT_HP_CORE_SHM,
1112         PT_HP_CORE_MMF,
1113         PT_HP_PARALLEL,
1114         PT_HP_FASTBIND,
1115         PT_HP_OPT_ANNOT,
1116         PT_HP_HSL_ANNOT,
1117         PT_HP_STACK,
1118     );
1119     static FLAGS_PT_MIPS: &[Flag<u32>] = &flags!(
1120         PT_MIPS_REGINFO,
1121         PT_MIPS_RTPROC,
1122         PT_MIPS_OPTIONS,
1123         PT_MIPS_ABIFLAGS,
1124     );
1125     static FLAGS_PT_PARISC: &[Flag<u32>] = &flags!(PT_PARISC_ARCHEXT, PT_PARISC_UNWIND);
1126     static FLAGS_PT_ARM: &[Flag<u32>] = &flags!(PT_ARM_EXIDX);
1127     static FLAGS_PT_IA_64: &[Flag<u32>] = &flags!(PT_IA_64_ARCHEXT, PT_IA_64_UNWIND);
1128     static FLAGS_PF: &[Flag<u32>] = &flags!(PF_X, PF_W, PF_R);
1129     static FLAGS_PF_HP: &[Flag<u32>] = &flags!(
1130         PF_HP_PAGE_SIZE,
1131         PF_HP_FAR_SHARED,
1132         PF_HP_NEAR_SHARED,
1133         PF_HP_CODE,
1134         PF_HP_MODIFY,
1135         PF_HP_LAZYSWAP,
1136         PF_HP_SBP,
1137     );
1138     static FLAGS_PF_MIPS: &[Flag<u32>] = &flags!(PF_MIPS_LOCAL);
1139     static FLAGS_PF_PARISC: &[Flag<u32>] = &flags!(PF_PARISC_SBP);
1140     static FLAGS_PF_ARM: &[Flag<u32>] = &flags!(PF_ARM_SB, PF_ARM_PI, PF_ARM_ABS);
1141     static FLAGS_PF_IA_64: &[Flag<u32>] = &flags!(PF_IA_64_NORECOV);
1142     static FLAGS_SHT: &[Flag<u32>] = &flags!(
1143         SHT_NULL,
1144         SHT_PROGBITS,
1145         SHT_SYMTAB,
1146         SHT_STRTAB,
1147         SHT_RELA,
1148         SHT_HASH,
1149         SHT_DYNAMIC,
1150         SHT_NOTE,
1151         SHT_NOBITS,
1152         SHT_REL,
1153         SHT_SHLIB,
1154         SHT_DYNSYM,
1155         SHT_INIT_ARRAY,
1156         SHT_FINI_ARRAY,
1157         SHT_PREINIT_ARRAY,
1158         SHT_GROUP,
1159         SHT_SYMTAB_SHNDX,
1160     );
1161     static FLAGS_SHT_MIPS: &[Flag<u32>] = &flags!(
1162         SHT_MIPS_LIBLIST,
1163         SHT_MIPS_MSYM,
1164         SHT_MIPS_CONFLICT,
1165         SHT_MIPS_GPTAB,
1166         SHT_MIPS_UCODE,
1167         SHT_MIPS_DEBUG,
1168         SHT_MIPS_REGINFO,
1169         SHT_MIPS_PACKAGE,
1170         SHT_MIPS_PACKSYM,
1171         SHT_MIPS_RELD,
1172         SHT_MIPS_IFACE,
1173         SHT_MIPS_CONTENT,
1174         SHT_MIPS_OPTIONS,
1175         SHT_MIPS_SHDR,
1176         SHT_MIPS_FDESC,
1177         SHT_MIPS_EXTSYM,
1178         SHT_MIPS_DENSE,
1179         SHT_MIPS_PDESC,
1180         SHT_MIPS_LOCSYM,
1181         SHT_MIPS_AUXSYM,
1182         SHT_MIPS_OPTSYM,
1183         SHT_MIPS_LOCSTR,
1184         SHT_MIPS_LINE,
1185         SHT_MIPS_RFDESC,
1186         SHT_MIPS_DELTASYM,
1187         SHT_MIPS_DELTAINST,
1188         SHT_MIPS_DELTACLASS,
1189         SHT_MIPS_DWARF,
1190         SHT_MIPS_DELTADECL,
1191         SHT_MIPS_SYMBOL_LIB,
1192         SHT_MIPS_EVENTS,
1193         SHT_MIPS_TRANSLATE,
1194         SHT_MIPS_PIXIE,
1195         SHT_MIPS_XLATE,
1196         SHT_MIPS_XLATE_DEBUG,
1197         SHT_MIPS_WHIRL,
1198         SHT_MIPS_EH_REGION,
1199         SHT_MIPS_XLATE_OLD,
1200         SHT_MIPS_PDR_EXCEPTION,
1201     );
1202     static FLAGS_SHT_PARISC: &[Flag<u32>] =
1203         &flags!(SHT_PARISC_EXT, SHT_PARISC_UNWIND, SHT_PARISC_DOC);
1204     static FLAGS_SHT_ALPHA: &[Flag<u32>] = &flags!(SHT_ALPHA_DEBUG, SHT_ALPHA_REGINFO);
1205     static FLAGS_SHT_ARM: &[Flag<u32>] =
1206         &flags!(SHT_ARM_EXIDX, SHT_ARM_PREEMPTMAP, SHT_ARM_ATTRIBUTES);
1207     static FLAGS_SHT_CSKY: &[Flag<u32>] = &flags!(SHT_CSKY_ATTRIBUTES);
1208     static FLAGS_SHT_IA_64: &[Flag<u32>] = &flags!(SHT_IA_64_EXT, SHT_IA_64_UNWIND);
1209     static FLAGS_SHT_X86_64: &[Flag<u32>] = &flags!(SHT_X86_64_UNWIND);
1210     static FLAGS_SHF: &[Flag<u32>] = &flags!(
1211         SHF_WRITE,
1212         SHF_ALLOC,
1213         SHF_EXECINSTR,
1214         SHF_MERGE,
1215         SHF_STRINGS,
1216         SHF_INFO_LINK,
1217         SHF_LINK_ORDER,
1218         SHF_OS_NONCONFORMING,
1219         SHF_GROUP,
1220         SHF_TLS,
1221         SHF_COMPRESSED,
1222     );
1223     static FLAGS_SHF_MIPS: &[Flag<u32>] = &flags!(
1224         SHF_MIPS_GPREL,
1225         SHF_MIPS_MERGE,
1226         SHF_MIPS_ADDR,
1227         SHF_MIPS_STRINGS,
1228         SHF_MIPS_NOSTRIP,
1229         SHF_MIPS_LOCAL,
1230         SHF_MIPS_NAMES,
1231         SHF_MIPS_NODUPE,
1232     );
1233     static FLAGS_SHF_PARISC: &[Flag<u32>] =
1234         &flags!(SHF_PARISC_SHORT, SHF_PARISC_HUGE, SHF_PARISC_SBP);
1235     static FLAGS_SHF_ALPHA: &[Flag<u32>] = &flags!(SHF_ALPHA_GPREL);
1236     static FLAGS_SHF_ARM: &[Flag<u32>] = &flags!(SHF_ARM_ENTRYSECT, SHF_ARM_COMDEF);
1237     static FLAGS_SHF_IA_64: &[Flag<u32>] = &flags!(SHF_IA_64_SHORT, SHF_IA_64_NORECOV);
1238     static FLAGS_STT: &[Flag<u8>] = &flags!(
1239         STT_NOTYPE,
1240         STT_OBJECT,
1241         STT_FUNC,
1242         STT_SECTION,
1243         STT_FILE,
1244         STT_COMMON,
1245         STT_TLS,
1246     );
1247     static FLAGS_STT_GNU: &[Flag<u8>] = &flags!(STT_GNU_IFUNC);
1248     static FLAGS_STT_HP: &[Flag<u8>] = &flags!(STT_HP_OPAQUE, STT_HP_STUB);
1249     static FLAGS_STT_SPARC: &[Flag<u8>] = &flags!(STT_SPARC_REGISTER);
1250     static FLAGS_STT_PARISC: &[Flag<u8>] = &flags!(STT_PARISC_MILLICODE);
1251     static FLAGS_STT_ARM: &[Flag<u8>] = &flags!(STT_ARM_TFUNC, STT_ARM_16BIT);
1252     static FLAGS_STB: &[Flag<u8>] = &flags!(STB_LOCAL, STB_GLOBAL, STB_WEAK);
1253     static FLAGS_STB_GNU: &[Flag<u8>] = &flags!(STB_GNU_UNIQUE);
1254     static FLAGS_STB_MIPS: &[Flag<u8>] = &flags!(STB_MIPS_SPLIT_COMMON);
1255     static FLAGS_STV: &[Flag<u8>] = &flags!(STV_DEFAULT, STV_INTERNAL, STV_HIDDEN, STV_PROTECTED);
1256     static FLAGS_STO_MIPS: &[Flag<u8>] = &flags!(STO_MIPS_PLT);
1257     static FLAGS_STO_ALPHA: &[Flag<u8>] = &flags!(STO_ALPHA_NOPV, STO_ALPHA_STD_GPLOAD);
1258     static FLAGS_SHN: &[Flag<u16>] = &flags!(SHN_UNDEF, SHN_ABS, SHN_COMMON, SHN_XINDEX);
1259     static FLAGS_SHN_MIPS: &[Flag<u16>] = &flags!(
1260         SHN_MIPS_ACOMMON,
1261         SHN_MIPS_TEXT,
1262         SHN_MIPS_DATA,
1263         SHN_MIPS_SCOMMON,
1264         SHN_MIPS_SUNDEFINED,
1265     );
1266     static FLAGS_SHN_PARISC: &[Flag<u16>] = &flags!(SHN_PARISC_ANSI_COMMON, SHN_PARISC_HUGE_COMMON);
1267     static FLAGS_R_68K: &[Flag<u32>] = &flags!(
1268         R_68K_NONE,
1269         R_68K_32,
1270         R_68K_16,
1271         R_68K_8,
1272         R_68K_PC32,
1273         R_68K_PC16,
1274         R_68K_PC8,
1275         R_68K_GOT32,
1276         R_68K_GOT16,
1277         R_68K_GOT8,
1278         R_68K_GOT32O,
1279         R_68K_GOT16O,
1280         R_68K_GOT8O,
1281         R_68K_PLT32,
1282         R_68K_PLT16,
1283         R_68K_PLT8,
1284         R_68K_PLT32O,
1285         R_68K_PLT16O,
1286         R_68K_PLT8O,
1287         R_68K_COPY,
1288         R_68K_GLOB_DAT,
1289         R_68K_JMP_SLOT,
1290         R_68K_RELATIVE,
1291         R_68K_TLS_GD32,
1292         R_68K_TLS_GD16,
1293         R_68K_TLS_GD8,
1294         R_68K_TLS_LDM32,
1295         R_68K_TLS_LDM16,
1296         R_68K_TLS_LDM8,
1297         R_68K_TLS_LDO32,
1298         R_68K_TLS_LDO16,
1299         R_68K_TLS_LDO8,
1300         R_68K_TLS_IE32,
1301         R_68K_TLS_IE16,
1302         R_68K_TLS_IE8,
1303         R_68K_TLS_LE32,
1304         R_68K_TLS_LE16,
1305         R_68K_TLS_LE8,
1306         R_68K_TLS_DTPMOD32,
1307         R_68K_TLS_DTPREL32,
1308         R_68K_TLS_TPREL32,
1309     );
1310     static FLAGS_R_386: &[Flag<u32>] = &flags!(
1311         R_386_NONE,
1312         R_386_32,
1313         R_386_PC32,
1314         R_386_GOT32,
1315         R_386_PLT32,
1316         R_386_COPY,
1317         R_386_GLOB_DAT,
1318         R_386_JMP_SLOT,
1319         R_386_RELATIVE,
1320         R_386_GOTOFF,
1321         R_386_GOTPC,
1322         R_386_32PLT,
1323         R_386_TLS_TPOFF,
1324         R_386_TLS_IE,
1325         R_386_TLS_GOTIE,
1326         R_386_TLS_LE,
1327         R_386_TLS_GD,
1328         R_386_TLS_LDM,
1329         R_386_16,
1330         R_386_PC16,
1331         R_386_8,
1332         R_386_PC8,
1333         R_386_TLS_GD_32,
1334         R_386_TLS_GD_PUSH,
1335         R_386_TLS_GD_CALL,
1336         R_386_TLS_GD_POP,
1337         R_386_TLS_LDM_32,
1338         R_386_TLS_LDM_PUSH,
1339         R_386_TLS_LDM_CALL,
1340         R_386_TLS_LDM_POP,
1341         R_386_TLS_LDO_32,
1342         R_386_TLS_IE_32,
1343         R_386_TLS_LE_32,
1344         R_386_TLS_DTPMOD32,
1345         R_386_TLS_DTPOFF32,
1346         R_386_TLS_TPOFF32,
1347         R_386_SIZE32,
1348         R_386_TLS_GOTDESC,
1349         R_386_TLS_DESC_CALL,
1350         R_386_TLS_DESC,
1351         R_386_IRELATIVE,
1352         R_386_GOT32X,
1353     );
1354     static FLAGS_R_SPARC: &[Flag<u32>] = &flags!(
1355         R_SPARC_NONE,
1356         R_SPARC_8,
1357         R_SPARC_16,
1358         R_SPARC_32,
1359         R_SPARC_DISP8,
1360         R_SPARC_DISP16,
1361         R_SPARC_DISP32,
1362         R_SPARC_WDISP30,
1363         R_SPARC_WDISP22,
1364         R_SPARC_HI22,
1365         R_SPARC_22,
1366         R_SPARC_13,
1367         R_SPARC_LO10,
1368         R_SPARC_GOT10,
1369         R_SPARC_GOT13,
1370         R_SPARC_GOT22,
1371         R_SPARC_PC10,
1372         R_SPARC_PC22,
1373         R_SPARC_WPLT30,
1374         R_SPARC_COPY,
1375         R_SPARC_GLOB_DAT,
1376         R_SPARC_JMP_SLOT,
1377         R_SPARC_RELATIVE,
1378         R_SPARC_UA32,
1379         R_SPARC_PLT32,
1380         R_SPARC_HIPLT22,
1381         R_SPARC_LOPLT10,
1382         R_SPARC_PCPLT32,
1383         R_SPARC_PCPLT22,
1384         R_SPARC_PCPLT10,
1385         R_SPARC_10,
1386         R_SPARC_11,
1387         R_SPARC_64,
1388         R_SPARC_OLO10,
1389         R_SPARC_HH22,
1390         R_SPARC_HM10,
1391         R_SPARC_LM22,
1392         R_SPARC_PC_HH22,
1393         R_SPARC_PC_HM10,
1394         R_SPARC_PC_LM22,
1395         R_SPARC_WDISP16,
1396         R_SPARC_WDISP19,
1397         R_SPARC_GLOB_JMP,
1398         R_SPARC_7,
1399         R_SPARC_5,
1400         R_SPARC_6,
1401         R_SPARC_DISP64,
1402         R_SPARC_PLT64,
1403         R_SPARC_HIX22,
1404         R_SPARC_LOX10,
1405         R_SPARC_H44,
1406         R_SPARC_M44,
1407         R_SPARC_L44,
1408         R_SPARC_REGISTER,
1409         R_SPARC_UA64,
1410         R_SPARC_UA16,
1411         R_SPARC_TLS_GD_HI22,
1412         R_SPARC_TLS_GD_LO10,
1413         R_SPARC_TLS_GD_ADD,
1414         R_SPARC_TLS_GD_CALL,
1415         R_SPARC_TLS_LDM_HI22,
1416         R_SPARC_TLS_LDM_LO10,
1417         R_SPARC_TLS_LDM_ADD,
1418         R_SPARC_TLS_LDM_CALL,
1419         R_SPARC_TLS_LDO_HIX22,
1420         R_SPARC_TLS_LDO_LOX10,
1421         R_SPARC_TLS_LDO_ADD,
1422         R_SPARC_TLS_IE_HI22,
1423         R_SPARC_TLS_IE_LO10,
1424         R_SPARC_TLS_IE_LD,
1425         R_SPARC_TLS_IE_LDX,
1426         R_SPARC_TLS_IE_ADD,
1427         R_SPARC_TLS_LE_HIX22,
1428         R_SPARC_TLS_LE_LOX10,
1429         R_SPARC_TLS_DTPMOD32,
1430         R_SPARC_TLS_DTPMOD64,
1431         R_SPARC_TLS_DTPOFF32,
1432         R_SPARC_TLS_DTPOFF64,
1433         R_SPARC_TLS_TPOFF32,
1434         R_SPARC_TLS_TPOFF64,
1435         R_SPARC_GOTDATA_HIX22,
1436         R_SPARC_GOTDATA_LOX10,
1437         R_SPARC_GOTDATA_OP_HIX22,
1438         R_SPARC_GOTDATA_OP_LOX10,
1439         R_SPARC_GOTDATA_OP,
1440         R_SPARC_H34,
1441         R_SPARC_SIZE32,
1442         R_SPARC_SIZE64,
1443         R_SPARC_WDISP10,
1444         R_SPARC_JMP_IREL,
1445         R_SPARC_IRELATIVE,
1446         R_SPARC_GNU_VTINHERIT,
1447         R_SPARC_GNU_VTENTRY,
1448         R_SPARC_REV32,
1449     );
1450     static FLAGS_R_MIPS: &[Flag<u32>] = &flags!(
1451         R_MIPS_NONE,
1452         R_MIPS_16,
1453         R_MIPS_32,
1454         R_MIPS_REL32,
1455         R_MIPS_26,
1456         R_MIPS_HI16,
1457         R_MIPS_LO16,
1458         R_MIPS_GPREL16,
1459         R_MIPS_LITERAL,
1460         R_MIPS_GOT16,
1461         R_MIPS_PC16,
1462         R_MIPS_CALL16,
1463         R_MIPS_GPREL32,
1464         R_MIPS_SHIFT5,
1465         R_MIPS_SHIFT6,
1466         R_MIPS_64,
1467         R_MIPS_GOT_DISP,
1468         R_MIPS_GOT_PAGE,
1469         R_MIPS_GOT_OFST,
1470         R_MIPS_GOT_HI16,
1471         R_MIPS_GOT_LO16,
1472         R_MIPS_SUB,
1473         R_MIPS_INSERT_A,
1474         R_MIPS_INSERT_B,
1475         R_MIPS_DELETE,
1476         R_MIPS_HIGHER,
1477         R_MIPS_HIGHEST,
1478         R_MIPS_CALL_HI16,
1479         R_MIPS_CALL_LO16,
1480         R_MIPS_SCN_DISP,
1481         R_MIPS_REL16,
1482         R_MIPS_ADD_IMMEDIATE,
1483         R_MIPS_PJUMP,
1484         R_MIPS_RELGOT,
1485         R_MIPS_JALR,
1486         R_MIPS_TLS_DTPMOD32,
1487         R_MIPS_TLS_DTPREL32,
1488         R_MIPS_TLS_DTPMOD64,
1489         R_MIPS_TLS_DTPREL64,
1490         R_MIPS_TLS_GD,
1491         R_MIPS_TLS_LDM,
1492         R_MIPS_TLS_DTPREL_HI16,
1493         R_MIPS_TLS_DTPREL_LO16,
1494         R_MIPS_TLS_GOTTPREL,
1495         R_MIPS_TLS_TPREL32,
1496         R_MIPS_TLS_TPREL64,
1497         R_MIPS_TLS_TPREL_HI16,
1498         R_MIPS_TLS_TPREL_LO16,
1499         R_MIPS_GLOB_DAT,
1500         R_MIPS_COPY,
1501         R_MIPS_JUMP_SLOT,
1502     );
1503     static FLAGS_R_PARISC: &[Flag<u32>] = &flags!(
1504         R_PARISC_NONE,
1505         R_PARISC_DIR32,
1506         R_PARISC_DIR21L,
1507         R_PARISC_DIR17R,
1508         R_PARISC_DIR17F,
1509         R_PARISC_DIR14R,
1510         R_PARISC_PCREL32,
1511         R_PARISC_PCREL21L,
1512         R_PARISC_PCREL17R,
1513         R_PARISC_PCREL17F,
1514         R_PARISC_PCREL14R,
1515         R_PARISC_DPREL21L,
1516         R_PARISC_DPREL14R,
1517         R_PARISC_GPREL21L,
1518         R_PARISC_GPREL14R,
1519         R_PARISC_LTOFF21L,
1520         R_PARISC_LTOFF14R,
1521         R_PARISC_SECREL32,
1522         R_PARISC_SEGBASE,
1523         R_PARISC_SEGREL32,
1524         R_PARISC_PLTOFF21L,
1525         R_PARISC_PLTOFF14R,
1526         R_PARISC_LTOFF_FPTR32,
1527         R_PARISC_LTOFF_FPTR21L,
1528         R_PARISC_LTOFF_FPTR14R,
1529         R_PARISC_FPTR64,
1530         R_PARISC_PLABEL32,
1531         R_PARISC_PLABEL21L,
1532         R_PARISC_PLABEL14R,
1533         R_PARISC_PCREL64,
1534         R_PARISC_PCREL22F,
1535         R_PARISC_PCREL14WR,
1536         R_PARISC_PCREL14DR,
1537         R_PARISC_PCREL16F,
1538         R_PARISC_PCREL16WF,
1539         R_PARISC_PCREL16DF,
1540         R_PARISC_DIR64,
1541         R_PARISC_DIR14WR,
1542         R_PARISC_DIR14DR,
1543         R_PARISC_DIR16F,
1544         R_PARISC_DIR16WF,
1545         R_PARISC_DIR16DF,
1546         R_PARISC_GPREL64,
1547         R_PARISC_GPREL14WR,
1548         R_PARISC_GPREL14DR,
1549         R_PARISC_GPREL16F,
1550         R_PARISC_GPREL16WF,
1551         R_PARISC_GPREL16DF,
1552         R_PARISC_LTOFF64,
1553         R_PARISC_LTOFF14WR,
1554         R_PARISC_LTOFF14DR,
1555         R_PARISC_LTOFF16F,
1556         R_PARISC_LTOFF16WF,
1557         R_PARISC_LTOFF16DF,
1558         R_PARISC_SECREL64,
1559         R_PARISC_SEGREL64,
1560         R_PARISC_PLTOFF14WR,
1561         R_PARISC_PLTOFF14DR,
1562         R_PARISC_PLTOFF16F,
1563         R_PARISC_PLTOFF16WF,
1564         R_PARISC_PLTOFF16DF,
1565         R_PARISC_LTOFF_FPTR64,
1566         R_PARISC_LTOFF_FPTR14WR,
1567         R_PARISC_LTOFF_FPTR14DR,
1568         R_PARISC_LTOFF_FPTR16F,
1569         R_PARISC_LTOFF_FPTR16WF,
1570         R_PARISC_LTOFF_FPTR16DF,
1571         R_PARISC_COPY,
1572         R_PARISC_IPLT,
1573         R_PARISC_EPLT,
1574         R_PARISC_TPREL32,
1575         R_PARISC_TPREL21L,
1576         R_PARISC_TPREL14R,
1577         R_PARISC_LTOFF_TP21L,
1578         R_PARISC_LTOFF_TP14R,
1579         R_PARISC_LTOFF_TP14F,
1580         R_PARISC_TPREL64,
1581         R_PARISC_TPREL14WR,
1582         R_PARISC_TPREL14DR,
1583         R_PARISC_TPREL16F,
1584         R_PARISC_TPREL16WF,
1585         R_PARISC_TPREL16DF,
1586         R_PARISC_LTOFF_TP64,
1587         R_PARISC_LTOFF_TP14WR,
1588         R_PARISC_LTOFF_TP14DR,
1589         R_PARISC_LTOFF_TP16F,
1590         R_PARISC_LTOFF_TP16WF,
1591         R_PARISC_LTOFF_TP16DF,
1592         R_PARISC_GNU_VTENTRY,
1593         R_PARISC_GNU_VTINHERIT,
1594         R_PARISC_TLS_GD21L,
1595         R_PARISC_TLS_GD14R,
1596         R_PARISC_TLS_GDCALL,
1597         R_PARISC_TLS_LDM21L,
1598         R_PARISC_TLS_LDM14R,
1599         R_PARISC_TLS_LDMCALL,
1600         R_PARISC_TLS_LDO21L,
1601         R_PARISC_TLS_LDO14R,
1602         R_PARISC_TLS_DTPMOD32,
1603         R_PARISC_TLS_DTPMOD64,
1604         R_PARISC_TLS_DTPOFF32,
1605         R_PARISC_TLS_DTPOFF64,
1606         R_PARISC_TLS_LE21L,
1607         R_PARISC_TLS_LE14R,
1608         R_PARISC_TLS_IE21L,
1609         R_PARISC_TLS_IE14R,
1610         R_PARISC_TLS_TPREL32,
1611         R_PARISC_TLS_TPREL64,
1612     );
1613     static FLAGS_R_ALPHA: &[Flag<u32>] = &flags!(
1614         R_ALPHA_NONE,
1615         R_ALPHA_REFLONG,
1616         R_ALPHA_REFQUAD,
1617         R_ALPHA_GPREL32,
1618         R_ALPHA_LITERAL,
1619         R_ALPHA_LITUSE,
1620         R_ALPHA_GPDISP,
1621         R_ALPHA_BRADDR,
1622         R_ALPHA_HINT,
1623         R_ALPHA_SREL16,
1624         R_ALPHA_SREL32,
1625         R_ALPHA_SREL64,
1626         R_ALPHA_GPRELHIGH,
1627         R_ALPHA_GPRELLOW,
1628         R_ALPHA_GPREL16,
1629         R_ALPHA_COPY,
1630         R_ALPHA_GLOB_DAT,
1631         R_ALPHA_JMP_SLOT,
1632         R_ALPHA_RELATIVE,
1633         R_ALPHA_TLS_GD_HI,
1634         R_ALPHA_TLSGD,
1635         R_ALPHA_TLS_LDM,
1636         R_ALPHA_DTPMOD64,
1637         R_ALPHA_GOTDTPREL,
1638         R_ALPHA_DTPREL64,
1639         R_ALPHA_DTPRELHI,
1640         R_ALPHA_DTPRELLO,
1641         R_ALPHA_DTPREL16,
1642         R_ALPHA_GOTTPREL,
1643         R_ALPHA_TPREL64,
1644         R_ALPHA_TPRELHI,
1645         R_ALPHA_TPRELLO,
1646         R_ALPHA_TPREL16,
1647     );
1648     static FLAGS_R_PPC: &[Flag<u32>] = &flags!(
1649         R_PPC_NONE,
1650         R_PPC_ADDR32,
1651         R_PPC_ADDR24,
1652         R_PPC_ADDR16,
1653         R_PPC_ADDR16_LO,
1654         R_PPC_ADDR16_HI,
1655         R_PPC_ADDR16_HA,
1656         R_PPC_ADDR14,
1657         R_PPC_ADDR14_BRTAKEN,
1658         R_PPC_ADDR14_BRNTAKEN,
1659         R_PPC_REL24,
1660         R_PPC_REL14,
1661         R_PPC_REL14_BRTAKEN,
1662         R_PPC_REL14_BRNTAKEN,
1663         R_PPC_GOT16,
1664         R_PPC_GOT16_LO,
1665         R_PPC_GOT16_HI,
1666         R_PPC_GOT16_HA,
1667         R_PPC_PLTREL24,
1668         R_PPC_COPY,
1669         R_PPC_GLOB_DAT,
1670         R_PPC_JMP_SLOT,
1671         R_PPC_RELATIVE,
1672         R_PPC_LOCAL24PC,
1673         R_PPC_UADDR32,
1674         R_PPC_UADDR16,
1675         R_PPC_REL32,
1676         R_PPC_PLT32,
1677         R_PPC_PLTREL32,
1678         R_PPC_PLT16_LO,
1679         R_PPC_PLT16_HI,
1680         R_PPC_PLT16_HA,
1681         R_PPC_SDAREL16,
1682         R_PPC_SECTOFF,
1683         R_PPC_SECTOFF_LO,
1684         R_PPC_SECTOFF_HI,
1685         R_PPC_SECTOFF_HA,
1686         R_PPC_TLS,
1687         R_PPC_DTPMOD32,
1688         R_PPC_TPREL16,
1689         R_PPC_TPREL16_LO,
1690         R_PPC_TPREL16_HI,
1691         R_PPC_TPREL16_HA,
1692         R_PPC_TPREL32,
1693         R_PPC_DTPREL16,
1694         R_PPC_DTPREL16_LO,
1695         R_PPC_DTPREL16_HI,
1696         R_PPC_DTPREL16_HA,
1697         R_PPC_DTPREL32,
1698         R_PPC_GOT_TLSGD16,
1699         R_PPC_GOT_TLSGD16_LO,
1700         R_PPC_GOT_TLSGD16_HI,
1701         R_PPC_GOT_TLSGD16_HA,
1702         R_PPC_GOT_TLSLD16,
1703         R_PPC_GOT_TLSLD16_LO,
1704         R_PPC_GOT_TLSLD16_HI,
1705         R_PPC_GOT_TLSLD16_HA,
1706         R_PPC_GOT_TPREL16,
1707         R_PPC_GOT_TPREL16_LO,
1708         R_PPC_GOT_TPREL16_HI,
1709         R_PPC_GOT_TPREL16_HA,
1710         R_PPC_GOT_DTPREL16,
1711         R_PPC_GOT_DTPREL16_LO,
1712         R_PPC_GOT_DTPREL16_HI,
1713         R_PPC_GOT_DTPREL16_HA,
1714         R_PPC_TLSGD,
1715         R_PPC_TLSLD,
1716         R_PPC_EMB_NADDR32,
1717         R_PPC_EMB_NADDR16,
1718         R_PPC_EMB_NADDR16_LO,
1719         R_PPC_EMB_NADDR16_HI,
1720         R_PPC_EMB_NADDR16_HA,
1721         R_PPC_EMB_SDAI16,
1722         R_PPC_EMB_SDA2I16,
1723         R_PPC_EMB_SDA2REL,
1724         R_PPC_EMB_SDA21,
1725         R_PPC_EMB_MRKREF,
1726         R_PPC_EMB_RELSEC16,
1727         R_PPC_EMB_RELST_LO,
1728         R_PPC_EMB_RELST_HI,
1729         R_PPC_EMB_RELST_HA,
1730         R_PPC_EMB_BIT_FLD,
1731         R_PPC_EMB_RELSDA,
1732         R_PPC_DIAB_SDA21_LO,
1733         R_PPC_DIAB_SDA21_HI,
1734         R_PPC_DIAB_SDA21_HA,
1735         R_PPC_DIAB_RELSDA_LO,
1736         R_PPC_DIAB_RELSDA_HI,
1737         R_PPC_DIAB_RELSDA_HA,
1738         R_PPC_IRELATIVE,
1739         R_PPC_REL16,
1740         R_PPC_REL16_LO,
1741         R_PPC_REL16_HI,
1742         R_PPC_REL16_HA,
1743         R_PPC_TOC16,
1744     );
1745     static FLAGS_R_PPC64: &[Flag<u32>] = &flags!(
1746         R_PPC64_NONE,
1747         R_PPC64_ADDR32,
1748         R_PPC64_ADDR24,
1749         R_PPC64_ADDR16,
1750         R_PPC64_ADDR16_LO,
1751         R_PPC64_ADDR16_HI,
1752         R_PPC64_ADDR16_HA,
1753         R_PPC64_ADDR14,
1754         R_PPC64_ADDR14_BRTAKEN,
1755         R_PPC64_ADDR14_BRNTAKEN,
1756         R_PPC64_REL24,
1757         R_PPC64_REL14,
1758         R_PPC64_REL14_BRTAKEN,
1759         R_PPC64_REL14_BRNTAKEN,
1760         R_PPC64_GOT16,
1761         R_PPC64_GOT16_LO,
1762         R_PPC64_GOT16_HI,
1763         R_PPC64_GOT16_HA,
1764         R_PPC64_COPY,
1765         R_PPC64_GLOB_DAT,
1766         R_PPC64_JMP_SLOT,
1767         R_PPC64_RELATIVE,
1768         R_PPC64_UADDR32,
1769         R_PPC64_UADDR16,
1770         R_PPC64_REL32,
1771         R_PPC64_PLT32,
1772         R_PPC64_PLTREL32,
1773         R_PPC64_PLT16_LO,
1774         R_PPC64_PLT16_HI,
1775         R_PPC64_PLT16_HA,
1776         R_PPC64_SECTOFF,
1777         R_PPC64_SECTOFF_LO,
1778         R_PPC64_SECTOFF_HI,
1779         R_PPC64_SECTOFF_HA,
1780         R_PPC64_ADDR30,
1781         R_PPC64_ADDR64,
1782         R_PPC64_ADDR16_HIGHER,
1783         R_PPC64_ADDR16_HIGHERA,
1784         R_PPC64_ADDR16_HIGHEST,
1785         R_PPC64_ADDR16_HIGHESTA,
1786         R_PPC64_UADDR64,
1787         R_PPC64_REL64,
1788         R_PPC64_PLT64,
1789         R_PPC64_PLTREL64,
1790         R_PPC64_TOC16,
1791         R_PPC64_TOC16_LO,
1792         R_PPC64_TOC16_HI,
1793         R_PPC64_TOC16_HA,
1794         R_PPC64_TOC,
1795         R_PPC64_PLTGOT16,
1796         R_PPC64_PLTGOT16_LO,
1797         R_PPC64_PLTGOT16_HI,
1798         R_PPC64_PLTGOT16_HA,
1799         R_PPC64_ADDR16_DS,
1800         R_PPC64_ADDR16_LO_DS,
1801         R_PPC64_GOT16_DS,
1802         R_PPC64_GOT16_LO_DS,
1803         R_PPC64_PLT16_LO_DS,
1804         R_PPC64_SECTOFF_DS,
1805         R_PPC64_SECTOFF_LO_DS,
1806         R_PPC64_TOC16_DS,
1807         R_PPC64_TOC16_LO_DS,
1808         R_PPC64_PLTGOT16_DS,
1809         R_PPC64_PLTGOT16_LO_DS,
1810         R_PPC64_TLS,
1811         R_PPC64_DTPMOD64,
1812         R_PPC64_TPREL16,
1813         R_PPC64_TPREL16_LO,
1814         R_PPC64_TPREL16_HI,
1815         R_PPC64_TPREL16_HA,
1816         R_PPC64_TPREL64,
1817         R_PPC64_DTPREL16,
1818         R_PPC64_DTPREL16_LO,
1819         R_PPC64_DTPREL16_HI,
1820         R_PPC64_DTPREL16_HA,
1821         R_PPC64_DTPREL64,
1822         R_PPC64_GOT_TLSGD16,
1823         R_PPC64_GOT_TLSGD16_LO,
1824         R_PPC64_GOT_TLSGD16_HI,
1825         R_PPC64_GOT_TLSGD16_HA,
1826         R_PPC64_GOT_TLSLD16,
1827         R_PPC64_GOT_TLSLD16_LO,
1828         R_PPC64_GOT_TLSLD16_HI,
1829         R_PPC64_GOT_TLSLD16_HA,
1830         R_PPC64_GOT_TPREL16_DS,
1831         R_PPC64_GOT_TPREL16_LO_DS,
1832         R_PPC64_GOT_TPREL16_HI,
1833         R_PPC64_GOT_TPREL16_HA,
1834         R_PPC64_GOT_DTPREL16_DS,
1835         R_PPC64_GOT_DTPREL16_LO_DS,
1836         R_PPC64_GOT_DTPREL16_HI,
1837         R_PPC64_GOT_DTPREL16_HA,
1838         R_PPC64_TPREL16_DS,
1839         R_PPC64_TPREL16_LO_DS,
1840         R_PPC64_TPREL16_HIGHER,
1841         R_PPC64_TPREL16_HIGHERA,
1842         R_PPC64_TPREL16_HIGHEST,
1843         R_PPC64_TPREL16_HIGHESTA,
1844         R_PPC64_DTPREL16_DS,
1845         R_PPC64_DTPREL16_LO_DS,
1846         R_PPC64_DTPREL16_HIGHER,
1847         R_PPC64_DTPREL16_HIGHERA,
1848         R_PPC64_DTPREL16_HIGHEST,
1849         R_PPC64_DTPREL16_HIGHESTA,
1850         R_PPC64_TLSGD,
1851         R_PPC64_TLSLD,
1852         R_PPC64_TOCSAVE,
1853         R_PPC64_ADDR16_HIGH,
1854         R_PPC64_ADDR16_HIGHA,
1855         R_PPC64_TPREL16_HIGH,
1856         R_PPC64_TPREL16_HIGHA,
1857         R_PPC64_DTPREL16_HIGH,
1858         R_PPC64_DTPREL16_HIGHA,
1859         R_PPC64_JMP_IREL,
1860         R_PPC64_IRELATIVE,
1861         R_PPC64_REL16,
1862         R_PPC64_REL16_LO,
1863         R_PPC64_REL16_HI,
1864         R_PPC64_REL16_HA,
1865     );
1866     static FLAGS_R_AARCH64: &[Flag<u32>] = &flags!(
1867         R_AARCH64_NONE,
1868         R_AARCH64_P32_ABS32,
1869         R_AARCH64_P32_COPY,
1870         R_AARCH64_P32_GLOB_DAT,
1871         R_AARCH64_P32_JUMP_SLOT,
1872         R_AARCH64_P32_RELATIVE,
1873         R_AARCH64_P32_TLS_DTPMOD,
1874         R_AARCH64_P32_TLS_DTPREL,
1875         R_AARCH64_P32_TLS_TPREL,
1876         R_AARCH64_P32_TLSDESC,
1877         R_AARCH64_P32_IRELATIVE,
1878         R_AARCH64_ABS64,
1879         R_AARCH64_ABS32,
1880         R_AARCH64_ABS16,
1881         R_AARCH64_PREL64,
1882         R_AARCH64_PREL32,
1883         R_AARCH64_PREL16,
1884         R_AARCH64_MOVW_UABS_G0,
1885         R_AARCH64_MOVW_UABS_G0_NC,
1886         R_AARCH64_MOVW_UABS_G1,
1887         R_AARCH64_MOVW_UABS_G1_NC,
1888         R_AARCH64_MOVW_UABS_G2,
1889         R_AARCH64_MOVW_UABS_G2_NC,
1890         R_AARCH64_MOVW_UABS_G3,
1891         R_AARCH64_MOVW_SABS_G0,
1892         R_AARCH64_MOVW_SABS_G1,
1893         R_AARCH64_MOVW_SABS_G2,
1894         R_AARCH64_LD_PREL_LO19,
1895         R_AARCH64_ADR_PREL_LO21,
1896         R_AARCH64_ADR_PREL_PG_HI21,
1897         R_AARCH64_ADR_PREL_PG_HI21_NC,
1898         R_AARCH64_ADD_ABS_LO12_NC,
1899         R_AARCH64_LDST8_ABS_LO12_NC,
1900         R_AARCH64_TSTBR14,
1901         R_AARCH64_CONDBR19,
1902         R_AARCH64_JUMP26,
1903         R_AARCH64_CALL26,
1904         R_AARCH64_LDST16_ABS_LO12_NC,
1905         R_AARCH64_LDST32_ABS_LO12_NC,
1906         R_AARCH64_LDST64_ABS_LO12_NC,
1907         R_AARCH64_MOVW_PREL_G0,
1908         R_AARCH64_MOVW_PREL_G0_NC,
1909         R_AARCH64_MOVW_PREL_G1,
1910         R_AARCH64_MOVW_PREL_G1_NC,
1911         R_AARCH64_MOVW_PREL_G2,
1912         R_AARCH64_MOVW_PREL_G2_NC,
1913         R_AARCH64_MOVW_PREL_G3,
1914         R_AARCH64_LDST128_ABS_LO12_NC,
1915         R_AARCH64_MOVW_GOTOFF_G0,
1916         R_AARCH64_MOVW_GOTOFF_G0_NC,
1917         R_AARCH64_MOVW_GOTOFF_G1,
1918         R_AARCH64_MOVW_GOTOFF_G1_NC,
1919         R_AARCH64_MOVW_GOTOFF_G2,
1920         R_AARCH64_MOVW_GOTOFF_G2_NC,
1921         R_AARCH64_MOVW_GOTOFF_G3,
1922         R_AARCH64_GOTREL64,
1923         R_AARCH64_GOTREL32,
1924         R_AARCH64_GOT_LD_PREL19,
1925         R_AARCH64_LD64_GOTOFF_LO15,
1926         R_AARCH64_ADR_GOT_PAGE,
1927         R_AARCH64_LD64_GOT_LO12_NC,
1928         R_AARCH64_LD64_GOTPAGE_LO15,
1929         R_AARCH64_TLSGD_ADR_PREL21,
1930         R_AARCH64_TLSGD_ADR_PAGE21,
1931         R_AARCH64_TLSGD_ADD_LO12_NC,
1932         R_AARCH64_TLSGD_MOVW_G1,
1933         R_AARCH64_TLSGD_MOVW_G0_NC,
1934         R_AARCH64_TLSLD_ADR_PREL21,
1935         R_AARCH64_TLSLD_ADR_PAGE21,
1936         R_AARCH64_TLSLD_ADD_LO12_NC,
1937         R_AARCH64_TLSLD_MOVW_G1,
1938         R_AARCH64_TLSLD_MOVW_G0_NC,
1939         R_AARCH64_TLSLD_LD_PREL19,
1940         R_AARCH64_TLSLD_MOVW_DTPREL_G2,
1941         R_AARCH64_TLSLD_MOVW_DTPREL_G1,
1942         R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC,
1943         R_AARCH64_TLSLD_MOVW_DTPREL_G0,
1944         R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC,
1945         R_AARCH64_TLSLD_ADD_DTPREL_HI12,
1946         R_AARCH64_TLSLD_ADD_DTPREL_LO12,
1947         R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC,
1948         R_AARCH64_TLSLD_LDST8_DTPREL_LO12,
1949         R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC,
1950         R_AARCH64_TLSLD_LDST16_DTPREL_LO12,
1951         R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC,
1952         R_AARCH64_TLSLD_LDST32_DTPREL_LO12,
1953         R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC,
1954         R_AARCH64_TLSLD_LDST64_DTPREL_LO12,
1955         R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC,
1956         R_AARCH64_TLSIE_MOVW_GOTTPREL_G1,
1957         R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC,
1958         R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21,
1959         R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC,
1960         R_AARCH64_TLSIE_LD_GOTTPREL_PREL19,
1961         R_AARCH64_TLSLE_MOVW_TPREL_G2,
1962         R_AARCH64_TLSLE_MOVW_TPREL_G1,
1963         R_AARCH64_TLSLE_MOVW_TPREL_G1_NC,
1964         R_AARCH64_TLSLE_MOVW_TPREL_G0,
1965         R_AARCH64_TLSLE_MOVW_TPREL_G0_NC,
1966         R_AARCH64_TLSLE_ADD_TPREL_HI12,
1967         R_AARCH64_TLSLE_ADD_TPREL_LO12,
1968         R_AARCH64_TLSLE_ADD_TPREL_LO12_NC,
1969         R_AARCH64_TLSLE_LDST8_TPREL_LO12,
1970         R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC,
1971         R_AARCH64_TLSLE_LDST16_TPREL_LO12,
1972         R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC,
1973         R_AARCH64_TLSLE_LDST32_TPREL_LO12,
1974         R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC,
1975         R_AARCH64_TLSLE_LDST64_TPREL_LO12,
1976         R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC,
1977         R_AARCH64_TLSDESC_LD_PREL19,
1978         R_AARCH64_TLSDESC_ADR_PREL21,
1979         R_AARCH64_TLSDESC_ADR_PAGE21,
1980         R_AARCH64_TLSDESC_LD64_LO12,
1981         R_AARCH64_TLSDESC_ADD_LO12,
1982         R_AARCH64_TLSDESC_OFF_G1,
1983         R_AARCH64_TLSDESC_OFF_G0_NC,
1984         R_AARCH64_TLSDESC_LDR,
1985         R_AARCH64_TLSDESC_ADD,
1986         R_AARCH64_TLSDESC_CALL,
1987         R_AARCH64_TLSLE_LDST128_TPREL_LO12,
1988         R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC,
1989         R_AARCH64_TLSLD_LDST128_DTPREL_LO12,
1990         R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC,
1991         R_AARCH64_COPY,
1992         R_AARCH64_GLOB_DAT,
1993         R_AARCH64_JUMP_SLOT,
1994         R_AARCH64_RELATIVE,
1995         R_AARCH64_TLS_DTPMOD,
1996         R_AARCH64_TLS_DTPREL,
1997         R_AARCH64_TLS_TPREL,
1998         R_AARCH64_TLSDESC,
1999         R_AARCH64_IRELATIVE,
2000     );
2001     static FLAGS_R_ARM: &[Flag<u32>] = &flags!(
2002         R_ARM_NONE,
2003         R_ARM_PC24,
2004         R_ARM_ABS32,
2005         R_ARM_REL32,
2006         R_ARM_PC13,
2007         R_ARM_ABS16,
2008         R_ARM_ABS12,
2009         R_ARM_THM_ABS5,
2010         R_ARM_ABS8,
2011         R_ARM_SBREL32,
2012         R_ARM_THM_PC22,
2013         R_ARM_THM_PC8,
2014         R_ARM_AMP_VCALL9,
2015         R_ARM_SWI24,
2016         R_ARM_TLS_DESC,
2017         R_ARM_THM_SWI8,
2018         R_ARM_XPC25,
2019         R_ARM_THM_XPC22,
2020         R_ARM_TLS_DTPMOD32,
2021         R_ARM_TLS_DTPOFF32,
2022         R_ARM_TLS_TPOFF32,
2023         R_ARM_COPY,
2024         R_ARM_GLOB_DAT,
2025         R_ARM_JUMP_SLOT,
2026         R_ARM_RELATIVE,
2027         R_ARM_GOTOFF,
2028         R_ARM_GOTPC,
2029         R_ARM_GOT32,
2030         R_ARM_PLT32,
2031         R_ARM_CALL,
2032         R_ARM_JUMP24,
2033         R_ARM_THM_JUMP24,
2034         R_ARM_BASE_ABS,
2035         R_ARM_ALU_PCREL_7_0,
2036         R_ARM_ALU_PCREL_15_8,
2037         R_ARM_ALU_PCREL_23_15,
2038         R_ARM_LDR_SBREL_11_0,
2039         R_ARM_ALU_SBREL_19_12,
2040         R_ARM_ALU_SBREL_27_20,
2041         R_ARM_TARGET1,
2042         R_ARM_SBREL31,
2043         R_ARM_V4BX,
2044         R_ARM_TARGET2,
2045         R_ARM_PREL31,
2046         R_ARM_MOVW_ABS_NC,
2047         R_ARM_MOVT_ABS,
2048         R_ARM_MOVW_PREL_NC,
2049         R_ARM_MOVT_PREL,
2050         R_ARM_THM_MOVW_ABS_NC,
2051         R_ARM_THM_MOVT_ABS,
2052         R_ARM_THM_MOVW_PREL_NC,
2053         R_ARM_THM_MOVT_PREL,
2054         R_ARM_THM_JUMP19,
2055         R_ARM_THM_JUMP6,
2056         R_ARM_THM_ALU_PREL_11_0,
2057         R_ARM_THM_PC12,
2058         R_ARM_ABS32_NOI,
2059         R_ARM_REL32_NOI,
2060         R_ARM_ALU_PC_G0_NC,
2061         R_ARM_ALU_PC_G0,
2062         R_ARM_ALU_PC_G1_NC,
2063         R_ARM_ALU_PC_G1,
2064         R_ARM_ALU_PC_G2,
2065         R_ARM_LDR_PC_G1,
2066         R_ARM_LDR_PC_G2,
2067         R_ARM_LDRS_PC_G0,
2068         R_ARM_LDRS_PC_G1,
2069         R_ARM_LDRS_PC_G2,
2070         R_ARM_LDC_PC_G0,
2071         R_ARM_LDC_PC_G1,
2072         R_ARM_LDC_PC_G2,
2073         R_ARM_ALU_SB_G0_NC,
2074         R_ARM_ALU_SB_G0,
2075         R_ARM_ALU_SB_G1_NC,
2076         R_ARM_ALU_SB_G1,
2077         R_ARM_ALU_SB_G2,
2078         R_ARM_LDR_SB_G0,
2079         R_ARM_LDR_SB_G1,
2080         R_ARM_LDR_SB_G2,
2081         R_ARM_LDRS_SB_G0,
2082         R_ARM_LDRS_SB_G1,
2083         R_ARM_LDRS_SB_G2,
2084         R_ARM_LDC_SB_G0,
2085         R_ARM_LDC_SB_G1,
2086         R_ARM_LDC_SB_G2,
2087         R_ARM_MOVW_BREL_NC,
2088         R_ARM_MOVT_BREL,
2089         R_ARM_MOVW_BREL,
2090         R_ARM_THM_MOVW_BREL_NC,
2091         R_ARM_THM_MOVT_BREL,
2092         R_ARM_THM_MOVW_BREL,
2093         R_ARM_TLS_GOTDESC,
2094         R_ARM_TLS_CALL,
2095         R_ARM_TLS_DESCSEQ,
2096         R_ARM_THM_TLS_CALL,
2097         R_ARM_PLT32_ABS,
2098         R_ARM_GOT_ABS,
2099         R_ARM_GOT_PREL,
2100         R_ARM_GOT_BREL12,
2101         R_ARM_GOTOFF12,
2102         R_ARM_GOTRELAX,
2103         R_ARM_GNU_VTENTRY,
2104         R_ARM_GNU_VTINHERIT,
2105         R_ARM_THM_PC11,
2106         R_ARM_THM_PC9,
2107         R_ARM_TLS_GD32,
2108         R_ARM_TLS_LDM32,
2109         R_ARM_TLS_LDO32,
2110         R_ARM_TLS_IE32,
2111         R_ARM_TLS_LE32,
2112         R_ARM_TLS_LDO12,
2113         R_ARM_TLS_LE12,
2114         R_ARM_TLS_IE12GP,
2115         R_ARM_ME_TOO,
2116         R_ARM_THM_TLS_DESCSEQ,
2117         R_ARM_THM_TLS_DESCSEQ16,
2118         R_ARM_THM_TLS_DESCSEQ32,
2119         R_ARM_THM_GOT_BREL12,
2120         R_ARM_IRELATIVE,
2121         R_ARM_RXPC25,
2122         R_ARM_RSBREL32,
2123         R_ARM_THM_RPC22,
2124         R_ARM_RREL32,
2125         R_ARM_RABS22,
2126         R_ARM_RPC24,
2127         R_ARM_RBASE,
2128     );
2129     static FLAGS_R_CKCORE: &[Flag<u32>] = &flags!(
2130         R_CKCORE_NONE,
2131         R_CKCORE_ADDR32,
2132         R_CKCORE_PCRELIMM8BY4,
2133         R_CKCORE_PCRELIMM11BY2,
2134         R_CKCORE_PCREL32,
2135         R_CKCORE_PCRELJSR_IMM11BY2,
2136         R_CKCORE_RELATIVE,
2137         R_CKCORE_COPY,
2138         R_CKCORE_GLOB_DAT,
2139         R_CKCORE_JUMP_SLOT,
2140         R_CKCORE_GOTOFF,
2141         R_CKCORE_GOTPC,
2142         R_CKCORE_GOT32,
2143         R_CKCORE_PLT32,
2144         R_CKCORE_ADDRGOT,
2145         R_CKCORE_ADDRPLT,
2146         R_CKCORE_PCREL_IMM26BY2,
2147         R_CKCORE_PCREL_IMM16BY2,
2148         R_CKCORE_PCREL_IMM16BY4,
2149         R_CKCORE_PCREL_IMM10BY2,
2150         R_CKCORE_PCREL_IMM10BY4,
2151         R_CKCORE_ADDR_HI16,
2152         R_CKCORE_ADDR_LO16,
2153         R_CKCORE_GOTPC_HI16,
2154         R_CKCORE_GOTPC_LO16,
2155         R_CKCORE_GOTOFF_HI16,
2156         R_CKCORE_GOTOFF_LO16,
2157         R_CKCORE_GOT12,
2158         R_CKCORE_GOT_HI16,
2159         R_CKCORE_GOT_LO16,
2160         R_CKCORE_PLT12,
2161         R_CKCORE_PLT_HI16,
2162         R_CKCORE_PLT_LO16,
2163         R_CKCORE_ADDRGOT_HI16,
2164         R_CKCORE_ADDRGOT_LO16,
2165         R_CKCORE_ADDRPLT_HI16,
2166         R_CKCORE_ADDRPLT_LO16,
2167         R_CKCORE_PCREL_JSR_IMM26BY2,
2168         R_CKCORE_TOFFSET_LO16,
2169         R_CKCORE_DOFFSET_LO16,
2170         R_CKCORE_PCREL_IMM18BY2,
2171         R_CKCORE_DOFFSET_IMM18,
2172         R_CKCORE_DOFFSET_IMM18BY2,
2173         R_CKCORE_DOFFSET_IMM18BY4,
2174         R_CKCORE_GOT_IMM18BY4,
2175         R_CKCORE_PLT_IMM18BY4,
2176         R_CKCORE_PCREL_IMM7BY4,
2177         R_CKCORE_TLS_LE32,
2178         R_CKCORE_TLS_IE32,
2179         R_CKCORE_TLS_GD32,
2180         R_CKCORE_TLS_LDM32,
2181         R_CKCORE_TLS_LDO32,
2182         R_CKCORE_TLS_DTPMOD32,
2183         R_CKCORE_TLS_DTPOFF32,
2184         R_CKCORE_TLS_TPOFF32,
2185     );
2186     static FLAGS_R_IA64: &[Flag<u32>] = &flags!(
2187         R_IA64_NONE,
2188         R_IA64_IMM14,
2189         R_IA64_IMM22,
2190         R_IA64_IMM64,
2191         R_IA64_DIR32MSB,
2192         R_IA64_DIR32LSB,
2193         R_IA64_DIR64MSB,
2194         R_IA64_DIR64LSB,
2195         R_IA64_GPREL22,
2196         R_IA64_GPREL64I,
2197         R_IA64_GPREL32MSB,
2198         R_IA64_GPREL32LSB,
2199         R_IA64_GPREL64MSB,
2200         R_IA64_GPREL64LSB,
2201         R_IA64_LTOFF22,
2202         R_IA64_LTOFF64I,
2203         R_IA64_PLTOFF22,
2204         R_IA64_PLTOFF64I,
2205         R_IA64_PLTOFF64MSB,
2206         R_IA64_PLTOFF64LSB,
2207         R_IA64_FPTR64I,
2208         R_IA64_FPTR32MSB,
2209         R_IA64_FPTR32LSB,
2210         R_IA64_FPTR64MSB,
2211         R_IA64_FPTR64LSB,
2212         R_IA64_PCREL60B,
2213         R_IA64_PCREL21B,
2214         R_IA64_PCREL21M,
2215         R_IA64_PCREL21F,
2216         R_IA64_PCREL32MSB,
2217         R_IA64_PCREL32LSB,
2218         R_IA64_PCREL64MSB,
2219         R_IA64_PCREL64LSB,
2220         R_IA64_LTOFF_FPTR22,
2221         R_IA64_LTOFF_FPTR64I,
2222         R_IA64_LTOFF_FPTR32MSB,
2223         R_IA64_LTOFF_FPTR32LSB,
2224         R_IA64_LTOFF_FPTR64MSB,
2225         R_IA64_LTOFF_FPTR64LSB,
2226         R_IA64_SEGREL32MSB,
2227         R_IA64_SEGREL32LSB,
2228         R_IA64_SEGREL64MSB,
2229         R_IA64_SEGREL64LSB,
2230         R_IA64_SECREL32MSB,
2231         R_IA64_SECREL32LSB,
2232         R_IA64_SECREL64MSB,
2233         R_IA64_SECREL64LSB,
2234         R_IA64_REL32MSB,
2235         R_IA64_REL32LSB,
2236         R_IA64_REL64MSB,
2237         R_IA64_REL64LSB,
2238         R_IA64_LTV32MSB,
2239         R_IA64_LTV32LSB,
2240         R_IA64_LTV64MSB,
2241         R_IA64_LTV64LSB,
2242         R_IA64_PCREL21BI,
2243         R_IA64_PCREL22,
2244         R_IA64_PCREL64I,
2245         R_IA64_IPLTMSB,
2246         R_IA64_IPLTLSB,
2247         R_IA64_COPY,
2248         R_IA64_SUB,
2249         R_IA64_LTOFF22X,
2250         R_IA64_LDXMOV,
2251         R_IA64_TPREL14,
2252         R_IA64_TPREL22,
2253         R_IA64_TPREL64I,
2254         R_IA64_TPREL64MSB,
2255         R_IA64_TPREL64LSB,
2256         R_IA64_LTOFF_TPREL22,
2257         R_IA64_DTPMOD64MSB,
2258         R_IA64_DTPMOD64LSB,
2259         R_IA64_LTOFF_DTPMOD22,
2260         R_IA64_DTPREL14,
2261         R_IA64_DTPREL22,
2262         R_IA64_DTPREL64I,
2263         R_IA64_DTPREL32MSB,
2264         R_IA64_DTPREL32LSB,
2265         R_IA64_DTPREL64MSB,
2266         R_IA64_DTPREL64LSB,
2267         R_IA64_LTOFF_DTPREL22,
2268     );
2269     static FLAGS_R_SH: &[Flag<u32>] = &flags!(
2270         R_SH_NONE,
2271         R_SH_DIR32,
2272         R_SH_REL32,
2273         R_SH_DIR8WPN,
2274         R_SH_IND12W,
2275         R_SH_DIR8WPL,
2276         R_SH_DIR8WPZ,
2277         R_SH_DIR8BP,
2278         R_SH_DIR8W,
2279         R_SH_DIR8L,
2280         R_SH_SWITCH16,
2281         R_SH_SWITCH32,
2282         R_SH_USES,
2283         R_SH_COUNT,
2284         R_SH_ALIGN,
2285         R_SH_CODE,
2286         R_SH_DATA,
2287         R_SH_LABEL,
2288         R_SH_SWITCH8,
2289         R_SH_GNU_VTINHERIT,
2290         R_SH_GNU_VTENTRY,
2291         R_SH_TLS_GD_32,
2292         R_SH_TLS_LD_32,
2293         R_SH_TLS_LDO_32,
2294         R_SH_TLS_IE_32,
2295         R_SH_TLS_LE_32,
2296         R_SH_TLS_DTPMOD32,
2297         R_SH_TLS_DTPOFF32,
2298         R_SH_TLS_TPOFF32,
2299         R_SH_GOT32,
2300         R_SH_PLT32,
2301         R_SH_COPY,
2302         R_SH_GLOB_DAT,
2303         R_SH_JMP_SLOT,
2304         R_SH_RELATIVE,
2305         R_SH_GOTOFF,
2306         R_SH_GOTPC,
2307     );
2308     static FLAGS_R_390: &[Flag<u32>] = &flags!(
2309         R_390_NONE,
2310         R_390_8,
2311         R_390_12,
2312         R_390_16,
2313         R_390_32,
2314         R_390_PC32,
2315         R_390_GOT12,
2316         R_390_GOT32,
2317         R_390_PLT32,
2318         R_390_COPY,
2319         R_390_GLOB_DAT,
2320         R_390_JMP_SLOT,
2321         R_390_RELATIVE,
2322         R_390_GOTOFF32,
2323         R_390_GOTPC,
2324         R_390_GOT16,
2325         R_390_PC16,
2326         R_390_PC16DBL,
2327         R_390_PLT16DBL,
2328         R_390_PC32DBL,
2329         R_390_PLT32DBL,
2330         R_390_GOTPCDBL,
2331         R_390_64,
2332         R_390_PC64,
2333         R_390_GOT64,
2334         R_390_PLT64,
2335         R_390_GOTENT,
2336         R_390_GOTOFF16,
2337         R_390_GOTOFF64,
2338         R_390_GOTPLT12,
2339         R_390_GOTPLT16,
2340         R_390_GOTPLT32,
2341         R_390_GOTPLT64,
2342         R_390_GOTPLTENT,
2343         R_390_PLTOFF16,
2344         R_390_PLTOFF32,
2345         R_390_PLTOFF64,
2346         R_390_TLS_LOAD,
2347         R_390_TLS_GDCALL,
2348         R_390_TLS_LDCALL,
2349         R_390_TLS_GD32,
2350         R_390_TLS_GD64,
2351         R_390_TLS_GOTIE12,
2352         R_390_TLS_GOTIE32,
2353         R_390_TLS_GOTIE64,
2354         R_390_TLS_LDM32,
2355         R_390_TLS_LDM64,
2356         R_390_TLS_IE32,
2357         R_390_TLS_IE64,
2358         R_390_TLS_IEENT,
2359         R_390_TLS_LE32,
2360         R_390_TLS_LE64,
2361         R_390_TLS_LDO32,
2362         R_390_TLS_LDO64,
2363         R_390_TLS_DTPMOD,
2364         R_390_TLS_DTPOFF,
2365         R_390_TLS_TPOFF,
2366         R_390_20,
2367         R_390_GOT20,
2368         R_390_GOTPLT20,
2369         R_390_TLS_GOTIE20,
2370         R_390_IRELATIVE,
2371     );
2372     static FLAGS_R_CRIS: &[Flag<u32>] = &flags!(
2373         R_CRIS_NONE,
2374         R_CRIS_8,
2375         R_CRIS_16,
2376         R_CRIS_32,
2377         R_CRIS_8_PCREL,
2378         R_CRIS_16_PCREL,
2379         R_CRIS_32_PCREL,
2380         R_CRIS_GNU_VTINHERIT,
2381         R_CRIS_GNU_VTENTRY,
2382         R_CRIS_COPY,
2383         R_CRIS_GLOB_DAT,
2384         R_CRIS_JUMP_SLOT,
2385         R_CRIS_RELATIVE,
2386         R_CRIS_16_GOT,
2387         R_CRIS_32_GOT,
2388         R_CRIS_16_GOTPLT,
2389         R_CRIS_32_GOTPLT,
2390         R_CRIS_32_GOTREL,
2391         R_CRIS_32_PLT_GOTREL,
2392         R_CRIS_32_PLT_PCREL,
2393     );
2394     static FLAGS_R_X86_64: &[Flag<u32>] = &flags!(
2395         R_X86_64_NONE,
2396         R_X86_64_64,
2397         R_X86_64_PC32,
2398         R_X86_64_GOT32,
2399         R_X86_64_PLT32,
2400         R_X86_64_COPY,
2401         R_X86_64_GLOB_DAT,
2402         R_X86_64_JUMP_SLOT,
2403         R_X86_64_RELATIVE,
2404         R_X86_64_GOTPCREL,
2405         R_X86_64_32,
2406         R_X86_64_32S,
2407         R_X86_64_16,
2408         R_X86_64_PC16,
2409         R_X86_64_8,
2410         R_X86_64_PC8,
2411         R_X86_64_DTPMOD64,
2412         R_X86_64_DTPOFF64,
2413         R_X86_64_TPOFF64,
2414         R_X86_64_TLSGD,
2415         R_X86_64_TLSLD,
2416         R_X86_64_DTPOFF32,
2417         R_X86_64_GOTTPOFF,
2418         R_X86_64_TPOFF32,
2419         R_X86_64_PC64,
2420         R_X86_64_GOTOFF64,
2421         R_X86_64_GOTPC32,
2422         R_X86_64_GOT64,
2423         R_X86_64_GOTPCREL64,
2424         R_X86_64_GOTPC64,
2425         R_X86_64_GOTPLT64,
2426         R_X86_64_PLTOFF64,
2427         R_X86_64_SIZE32,
2428         R_X86_64_SIZE64,
2429         R_X86_64_GOTPC32_TLSDESC,
2430         R_X86_64_TLSDESC_CALL,
2431         R_X86_64_TLSDESC,
2432         R_X86_64_IRELATIVE,
2433         R_X86_64_RELATIVE64,
2434         R_X86_64_GOTPCRELX,
2435         R_X86_64_REX_GOTPCRELX,
2436     );
2437     static FLAGS_R_MN10300: &[Flag<u32>] = &flags!(
2438         R_MN10300_NONE,
2439         R_MN10300_32,
2440         R_MN10300_16,
2441         R_MN10300_8,
2442         R_MN10300_PCREL32,
2443         R_MN10300_PCREL16,
2444         R_MN10300_PCREL8,
2445         R_MN10300_GNU_VTINHERIT,
2446         R_MN10300_GNU_VTENTRY,
2447         R_MN10300_24,
2448         R_MN10300_GOTPC32,
2449         R_MN10300_GOTPC16,
2450         R_MN10300_GOTOFF32,
2451         R_MN10300_GOTOFF24,
2452         R_MN10300_GOTOFF16,
2453         R_MN10300_PLT32,
2454         R_MN10300_PLT16,
2455         R_MN10300_GOT32,
2456         R_MN10300_GOT24,
2457         R_MN10300_GOT16,
2458         R_MN10300_COPY,
2459         R_MN10300_GLOB_DAT,
2460         R_MN10300_JMP_SLOT,
2461         R_MN10300_RELATIVE,
2462         R_MN10300_TLS_GD,
2463         R_MN10300_TLS_LD,
2464         R_MN10300_TLS_LDO,
2465         R_MN10300_TLS_GOTIE,
2466         R_MN10300_TLS_IE,
2467         R_MN10300_TLS_LE,
2468         R_MN10300_TLS_DTPMOD,
2469         R_MN10300_TLS_DTPOFF,
2470         R_MN10300_TLS_TPOFF,
2471         R_MN10300_SYM_DIFF,
2472         R_MN10300_ALIGN,
2473     );
2474     static FLAGS_R_M32R: &[Flag<u32>] = &flags!(
2475         R_M32R_NONE,
2476         R_M32R_16,
2477         R_M32R_32,
2478         R_M32R_24,
2479         R_M32R_10_PCREL,
2480         R_M32R_18_PCREL,
2481         R_M32R_26_PCREL,
2482         R_M32R_HI16_ULO,
2483         R_M32R_HI16_SLO,
2484         R_M32R_LO16,
2485         R_M32R_SDA16,
2486         R_M32R_GNU_VTINHERIT,
2487         R_M32R_GNU_VTENTRY,
2488         R_M32R_16_RELA,
2489         R_M32R_32_RELA,
2490         R_M32R_24_RELA,
2491         R_M32R_10_PCREL_RELA,
2492         R_M32R_18_PCREL_RELA,
2493         R_M32R_26_PCREL_RELA,
2494         R_M32R_HI16_ULO_RELA,
2495         R_M32R_HI16_SLO_RELA,
2496         R_M32R_LO16_RELA,
2497         R_M32R_SDA16_RELA,
2498         R_M32R_RELA_GNU_VTINHERIT,
2499         R_M32R_RELA_GNU_VTENTRY,
2500         R_M32R_REL32,
2501         R_M32R_GOT24,
2502         R_M32R_26_PLTREL,
2503         R_M32R_COPY,
2504         R_M32R_GLOB_DAT,
2505         R_M32R_JMP_SLOT,
2506         R_M32R_RELATIVE,
2507         R_M32R_GOTOFF,
2508         R_M32R_GOTPC24,
2509         R_M32R_GOT16_HI_ULO,
2510         R_M32R_GOT16_HI_SLO,
2511         R_M32R_GOT16_LO,
2512         R_M32R_GOTPC_HI_ULO,
2513         R_M32R_GOTPC_HI_SLO,
2514         R_M32R_GOTPC_LO,
2515         R_M32R_GOTOFF_HI_ULO,
2516         R_M32R_GOTOFF_HI_SLO,
2517         R_M32R_GOTOFF_LO,
2518         R_M32R_NUM,
2519     );
2520     static FLAGS_R_MICROBLAZE: &[Flag<u32>] = &flags!(
2521         R_MICROBLAZE_NONE,
2522         R_MICROBLAZE_32,
2523         R_MICROBLAZE_32_PCREL,
2524         R_MICROBLAZE_64_PCREL,
2525         R_MICROBLAZE_32_PCREL_LO,
2526         R_MICROBLAZE_64,
2527         R_MICROBLAZE_32_LO,
2528         R_MICROBLAZE_SRO32,
2529         R_MICROBLAZE_SRW32,
2530         R_MICROBLAZE_64_NONE,
2531         R_MICROBLAZE_32_SYM_OP_SYM,
2532         R_MICROBLAZE_GNU_VTINHERIT,
2533         R_MICROBLAZE_GNU_VTENTRY,
2534         R_MICROBLAZE_GOTPC_64,
2535         R_MICROBLAZE_GOT_64,
2536         R_MICROBLAZE_PLT_64,
2537         R_MICROBLAZE_REL,
2538         R_MICROBLAZE_JUMP_SLOT,
2539         R_MICROBLAZE_GLOB_DAT,
2540         R_MICROBLAZE_GOTOFF_64,
2541         R_MICROBLAZE_GOTOFF_32,
2542         R_MICROBLAZE_COPY,
2543         R_MICROBLAZE_TLS,
2544         R_MICROBLAZE_TLSGD,
2545         R_MICROBLAZE_TLSLD,
2546         R_MICROBLAZE_TLSDTPMOD32,
2547         R_MICROBLAZE_TLSDTPREL32,
2548         R_MICROBLAZE_TLSDTPREL64,
2549         R_MICROBLAZE_TLSGOTTPREL32,
2550         R_MICROBLAZE_TLSTPREL32,
2551     );
2552     static FLAGS_R_NIOS2: &[Flag<u32>] = &flags!(
2553         R_NIOS2_NONE,
2554         R_NIOS2_S16,
2555         R_NIOS2_U16,
2556         R_NIOS2_PCREL16,
2557         R_NIOS2_CALL26,
2558         R_NIOS2_IMM5,
2559         R_NIOS2_CACHE_OPX,
2560         R_NIOS2_IMM6,
2561         R_NIOS2_IMM8,
2562         R_NIOS2_HI16,
2563         R_NIOS2_LO16,
2564         R_NIOS2_HIADJ16,
2565         R_NIOS2_BFD_RELOC_32,
2566         R_NIOS2_BFD_RELOC_16,
2567         R_NIOS2_BFD_RELOC_8,
2568         R_NIOS2_GPREL,
2569         R_NIOS2_GNU_VTINHERIT,
2570         R_NIOS2_GNU_VTENTRY,
2571         R_NIOS2_UJMP,
2572         R_NIOS2_CJMP,
2573         R_NIOS2_CALLR,
2574         R_NIOS2_ALIGN,
2575         R_NIOS2_GOT16,
2576         R_NIOS2_CALL16,
2577         R_NIOS2_GOTOFF_LO,
2578         R_NIOS2_GOTOFF_HA,
2579         R_NIOS2_PCREL_LO,
2580         R_NIOS2_PCREL_HA,
2581         R_NIOS2_TLS_GD16,
2582         R_NIOS2_TLS_LDM16,
2583         R_NIOS2_TLS_LDO16,
2584         R_NIOS2_TLS_IE16,
2585         R_NIOS2_TLS_LE16,
2586         R_NIOS2_TLS_DTPMOD,
2587         R_NIOS2_TLS_DTPREL,
2588         R_NIOS2_TLS_TPREL,
2589         R_NIOS2_COPY,
2590         R_NIOS2_GLOB_DAT,
2591         R_NIOS2_JUMP_SLOT,
2592         R_NIOS2_RELATIVE,
2593         R_NIOS2_GOTOFF,
2594         R_NIOS2_CALL26_NOAT,
2595         R_NIOS2_GOT_LO,
2596         R_NIOS2_GOT_HA,
2597         R_NIOS2_CALL_LO,
2598         R_NIOS2_CALL_HA,
2599     );
2600     static FLAGS_R_TILEPRO: &[Flag<u32>] = &flags!(
2601         R_TILEPRO_NONE,
2602         R_TILEPRO_32,
2603         R_TILEPRO_16,
2604         R_TILEPRO_8,
2605         R_TILEPRO_32_PCREL,
2606         R_TILEPRO_16_PCREL,
2607         R_TILEPRO_8_PCREL,
2608         R_TILEPRO_LO16,
2609         R_TILEPRO_HI16,
2610         R_TILEPRO_HA16,
2611         R_TILEPRO_COPY,
2612         R_TILEPRO_GLOB_DAT,
2613         R_TILEPRO_JMP_SLOT,
2614         R_TILEPRO_RELATIVE,
2615         R_TILEPRO_BROFF_X1,
2616         R_TILEPRO_JOFFLONG_X1,
2617         R_TILEPRO_JOFFLONG_X1_PLT,
2618         R_TILEPRO_IMM8_X0,
2619         R_TILEPRO_IMM8_Y0,
2620         R_TILEPRO_IMM8_X1,
2621         R_TILEPRO_IMM8_Y1,
2622         R_TILEPRO_MT_IMM15_X1,
2623         R_TILEPRO_MF_IMM15_X1,
2624         R_TILEPRO_IMM16_X0,
2625         R_TILEPRO_IMM16_X1,
2626         R_TILEPRO_IMM16_X0_LO,
2627         R_TILEPRO_IMM16_X1_LO,
2628         R_TILEPRO_IMM16_X0_HI,
2629         R_TILEPRO_IMM16_X1_HI,
2630         R_TILEPRO_IMM16_X0_HA,
2631         R_TILEPRO_IMM16_X1_HA,
2632         R_TILEPRO_IMM16_X0_PCREL,
2633         R_TILEPRO_IMM16_X1_PCREL,
2634         R_TILEPRO_IMM16_X0_LO_PCREL,
2635         R_TILEPRO_IMM16_X1_LO_PCREL,
2636         R_TILEPRO_IMM16_X0_HI_PCREL,
2637         R_TILEPRO_IMM16_X1_HI_PCREL,
2638         R_TILEPRO_IMM16_X0_HA_PCREL,
2639         R_TILEPRO_IMM16_X1_HA_PCREL,
2640         R_TILEPRO_IMM16_X0_GOT,
2641         R_TILEPRO_IMM16_X1_GOT,
2642         R_TILEPRO_IMM16_X0_GOT_LO,
2643         R_TILEPRO_IMM16_X1_GOT_LO,
2644         R_TILEPRO_IMM16_X0_GOT_HI,
2645         R_TILEPRO_IMM16_X1_GOT_HI,
2646         R_TILEPRO_IMM16_X0_GOT_HA,
2647         R_TILEPRO_IMM16_X1_GOT_HA,
2648         R_TILEPRO_MMSTART_X0,
2649         R_TILEPRO_MMEND_X0,
2650         R_TILEPRO_MMSTART_X1,
2651         R_TILEPRO_MMEND_X1,
2652         R_TILEPRO_SHAMT_X0,
2653         R_TILEPRO_SHAMT_X1,
2654         R_TILEPRO_SHAMT_Y0,
2655         R_TILEPRO_SHAMT_Y1,
2656         R_TILEPRO_DEST_IMM8_X1,
2657         R_TILEPRO_TLS_GD_CALL,
2658         R_TILEPRO_IMM8_X0_TLS_GD_ADD,
2659         R_TILEPRO_IMM8_X1_TLS_GD_ADD,
2660         R_TILEPRO_IMM8_Y0_TLS_GD_ADD,
2661         R_TILEPRO_IMM8_Y1_TLS_GD_ADD,
2662         R_TILEPRO_TLS_IE_LOAD,
2663         R_TILEPRO_IMM16_X0_TLS_GD,
2664         R_TILEPRO_IMM16_X1_TLS_GD,
2665         R_TILEPRO_IMM16_X0_TLS_GD_LO,
2666         R_TILEPRO_IMM16_X1_TLS_GD_LO,
2667         R_TILEPRO_IMM16_X0_TLS_GD_HI,
2668         R_TILEPRO_IMM16_X1_TLS_GD_HI,
2669         R_TILEPRO_IMM16_X0_TLS_GD_HA,
2670         R_TILEPRO_IMM16_X1_TLS_GD_HA,
2671         R_TILEPRO_IMM16_X0_TLS_IE,
2672         R_TILEPRO_IMM16_X1_TLS_IE,
2673         R_TILEPRO_IMM16_X0_TLS_IE_LO,
2674         R_TILEPRO_IMM16_X1_TLS_IE_LO,
2675         R_TILEPRO_IMM16_X0_TLS_IE_HI,
2676         R_TILEPRO_IMM16_X1_TLS_IE_HI,
2677         R_TILEPRO_IMM16_X0_TLS_IE_HA,
2678         R_TILEPRO_IMM16_X1_TLS_IE_HA,
2679         R_TILEPRO_TLS_DTPMOD32,
2680         R_TILEPRO_TLS_DTPOFF32,
2681         R_TILEPRO_TLS_TPOFF32,
2682         R_TILEPRO_IMM16_X0_TLS_LE,
2683         R_TILEPRO_IMM16_X1_TLS_LE,
2684         R_TILEPRO_IMM16_X0_TLS_LE_LO,
2685         R_TILEPRO_IMM16_X1_TLS_LE_LO,
2686         R_TILEPRO_IMM16_X0_TLS_LE_HI,
2687         R_TILEPRO_IMM16_X1_TLS_LE_HI,
2688         R_TILEPRO_IMM16_X0_TLS_LE_HA,
2689         R_TILEPRO_IMM16_X1_TLS_LE_HA,
2690         R_TILEPRO_GNU_VTINHERIT,
2691         R_TILEPRO_GNU_VTENTRY,
2692     );
2693     static FLAGS_R_TILEGX: &[Flag<u32>] = &flags!(
2694         R_TILEGX_NONE,
2695         R_TILEGX_64,
2696         R_TILEGX_32,
2697         R_TILEGX_16,
2698         R_TILEGX_8,
2699         R_TILEGX_64_PCREL,
2700         R_TILEGX_32_PCREL,
2701         R_TILEGX_16_PCREL,
2702         R_TILEGX_8_PCREL,
2703         R_TILEGX_HW0,
2704         R_TILEGX_HW1,
2705         R_TILEGX_HW2,
2706         R_TILEGX_HW3,
2707         R_TILEGX_HW0_LAST,
2708         R_TILEGX_HW1_LAST,
2709         R_TILEGX_HW2_LAST,
2710         R_TILEGX_COPY,
2711         R_TILEGX_GLOB_DAT,
2712         R_TILEGX_JMP_SLOT,
2713         R_TILEGX_RELATIVE,
2714         R_TILEGX_BROFF_X1,
2715         R_TILEGX_JUMPOFF_X1,
2716         R_TILEGX_JUMPOFF_X1_PLT,
2717         R_TILEGX_IMM8_X0,
2718         R_TILEGX_IMM8_Y0,
2719         R_TILEGX_IMM8_X1,
2720         R_TILEGX_IMM8_Y1,
2721         R_TILEGX_DEST_IMM8_X1,
2722         R_TILEGX_MT_IMM14_X1,
2723         R_TILEGX_MF_IMM14_X1,
2724         R_TILEGX_MMSTART_X0,
2725         R_TILEGX_MMEND_X0,
2726         R_TILEGX_SHAMT_X0,
2727         R_TILEGX_SHAMT_X1,
2728         R_TILEGX_SHAMT_Y0,
2729         R_TILEGX_SHAMT_Y1,
2730         R_TILEGX_IMM16_X0_HW0,
2731         R_TILEGX_IMM16_X1_HW0,
2732         R_TILEGX_IMM16_X0_HW1,
2733         R_TILEGX_IMM16_X1_HW1,
2734         R_TILEGX_IMM16_X0_HW2,
2735         R_TILEGX_IMM16_X1_HW2,
2736         R_TILEGX_IMM16_X0_HW3,
2737         R_TILEGX_IMM16_X1_HW3,
2738         R_TILEGX_IMM16_X0_HW0_LAST,
2739         R_TILEGX_IMM16_X1_HW0_LAST,
2740         R_TILEGX_IMM16_X0_HW1_LAST,
2741         R_TILEGX_IMM16_X1_HW1_LAST,
2742         R_TILEGX_IMM16_X0_HW2_LAST,
2743         R_TILEGX_IMM16_X1_HW2_LAST,
2744         R_TILEGX_IMM16_X0_HW0_PCREL,
2745         R_TILEGX_IMM16_X1_HW0_PCREL,
2746         R_TILEGX_IMM16_X0_HW1_PCREL,
2747         R_TILEGX_IMM16_X1_HW1_PCREL,
2748         R_TILEGX_IMM16_X0_HW2_PCREL,
2749         R_TILEGX_IMM16_X1_HW2_PCREL,
2750         R_TILEGX_IMM16_X0_HW3_PCREL,
2751         R_TILEGX_IMM16_X1_HW3_PCREL,
2752         R_TILEGX_IMM16_X0_HW0_LAST_PCREL,
2753         R_TILEGX_IMM16_X1_HW0_LAST_PCREL,
2754         R_TILEGX_IMM16_X0_HW1_LAST_PCREL,
2755         R_TILEGX_IMM16_X1_HW1_LAST_PCREL,
2756         R_TILEGX_IMM16_X0_HW2_LAST_PCREL,
2757         R_TILEGX_IMM16_X1_HW2_LAST_PCREL,
2758         R_TILEGX_IMM16_X0_HW0_GOT,
2759         R_TILEGX_IMM16_X1_HW0_GOT,
2760         R_TILEGX_IMM16_X0_HW0_PLT_PCREL,
2761         R_TILEGX_IMM16_X1_HW0_PLT_PCREL,
2762         R_TILEGX_IMM16_X0_HW1_PLT_PCREL,
2763         R_TILEGX_IMM16_X1_HW1_PLT_PCREL,
2764         R_TILEGX_IMM16_X0_HW2_PLT_PCREL,
2765         R_TILEGX_IMM16_X1_HW2_PLT_PCREL,
2766         R_TILEGX_IMM16_X0_HW0_LAST_GOT,
2767         R_TILEGX_IMM16_X1_HW0_LAST_GOT,
2768         R_TILEGX_IMM16_X0_HW1_LAST_GOT,
2769         R_TILEGX_IMM16_X1_HW1_LAST_GOT,
2770         R_TILEGX_IMM16_X0_HW3_PLT_PCREL,
2771         R_TILEGX_IMM16_X1_HW3_PLT_PCREL,
2772         R_TILEGX_IMM16_X0_HW0_TLS_GD,
2773         R_TILEGX_IMM16_X1_HW0_TLS_GD,
2774         R_TILEGX_IMM16_X0_HW0_TLS_LE,
2775         R_TILEGX_IMM16_X1_HW0_TLS_LE,
2776         R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE,
2777         R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE,
2778         R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE,
2779         R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE,
2780         R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD,
2781         R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD,
2782         R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD,
2783         R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD,
2784         R_TILEGX_IMM16_X0_HW0_TLS_IE,
2785         R_TILEGX_IMM16_X1_HW0_TLS_IE,
2786         R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL,
2787         R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL,
2788         R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL,
2789         R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL,
2790         R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL,
2791         R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL,
2792         R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE,
2793         R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE,
2794         R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE,
2795         R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE,
2796         R_TILEGX_TLS_DTPMOD64,
2797         R_TILEGX_TLS_DTPOFF64,
2798         R_TILEGX_TLS_TPOFF64,
2799         R_TILEGX_TLS_DTPMOD32,
2800         R_TILEGX_TLS_DTPOFF32,
2801         R_TILEGX_TLS_TPOFF32,
2802         R_TILEGX_TLS_GD_CALL,
2803         R_TILEGX_IMM8_X0_TLS_GD_ADD,
2804         R_TILEGX_IMM8_X1_TLS_GD_ADD,
2805         R_TILEGX_IMM8_Y0_TLS_GD_ADD,
2806         R_TILEGX_IMM8_Y1_TLS_GD_ADD,
2807         R_TILEGX_TLS_IE_LOAD,
2808         R_TILEGX_IMM8_X0_TLS_ADD,
2809         R_TILEGX_IMM8_X1_TLS_ADD,
2810         R_TILEGX_IMM8_Y0_TLS_ADD,
2811         R_TILEGX_IMM8_Y1_TLS_ADD,
2812         R_TILEGX_GNU_VTINHERIT,
2813         R_TILEGX_GNU_VTENTRY,
2814     );
2815     static FLAGS_R_RISCV: &[Flag<u32>] = &flags!(
2816         R_RISCV_NONE,
2817         R_RISCV_32,
2818         R_RISCV_64,
2819         R_RISCV_RELATIVE,
2820         R_RISCV_COPY,
2821         R_RISCV_JUMP_SLOT,
2822         R_RISCV_TLS_DTPMOD32,
2823         R_RISCV_TLS_DTPMOD64,
2824         R_RISCV_TLS_DTPREL32,
2825         R_RISCV_TLS_DTPREL64,
2826         R_RISCV_TLS_TPREL32,
2827         R_RISCV_TLS_TPREL64,
2828         R_RISCV_BRANCH,
2829         R_RISCV_JAL,
2830         R_RISCV_CALL,
2831         R_RISCV_CALL_PLT,
2832         R_RISCV_GOT_HI20,
2833         R_RISCV_TLS_GOT_HI20,
2834         R_RISCV_TLS_GD_HI20,
2835         R_RISCV_PCREL_HI20,
2836         R_RISCV_PCREL_LO12_I,
2837         R_RISCV_PCREL_LO12_S,
2838         R_RISCV_HI20,
2839         R_RISCV_LO12_I,
2840         R_RISCV_LO12_S,
2841         R_RISCV_TPREL_HI20,
2842         R_RISCV_TPREL_LO12_I,
2843         R_RISCV_TPREL_LO12_S,
2844         R_RISCV_TPREL_ADD,
2845         R_RISCV_ADD8,
2846         R_RISCV_ADD16,
2847         R_RISCV_ADD32,
2848         R_RISCV_ADD64,
2849         R_RISCV_SUB8,
2850         R_RISCV_SUB16,
2851         R_RISCV_SUB32,
2852         R_RISCV_SUB64,
2853         R_RISCV_GNU_VTINHERIT,
2854         R_RISCV_GNU_VTENTRY,
2855         R_RISCV_ALIGN,
2856         R_RISCV_RVC_BRANCH,
2857         R_RISCV_RVC_JUMP,
2858         R_RISCV_RVC_LUI,
2859         R_RISCV_GPREL_I,
2860         R_RISCV_GPREL_S,
2861         R_RISCV_TPREL_I,
2862         R_RISCV_TPREL_S,
2863         R_RISCV_RELAX,
2864         R_RISCV_SUB6,
2865         R_RISCV_SET6,
2866         R_RISCV_SET8,
2867         R_RISCV_SET16,
2868         R_RISCV_SET32,
2869         R_RISCV_32_PCREL,
2870     );
2871     static FLAGS_R_BPF: &[Flag<u32>] = &flags!(R_BPF_NONE, R_BPF_64_64, R_BPF_64_32);
2872     static FLAGS_R_METAG: &[Flag<u32>] = &flags!(
2873         R_METAG_HIADDR16,
2874         R_METAG_LOADDR16,
2875         R_METAG_ADDR32,
2876         R_METAG_NONE,
2877         R_METAG_RELBRANCH,
2878         R_METAG_GETSETOFF,
2879         R_METAG_REG32OP1,
2880         R_METAG_REG32OP2,
2881         R_METAG_REG32OP3,
2882         R_METAG_REG16OP1,
2883         R_METAG_REG16OP2,
2884         R_METAG_REG16OP3,
2885         R_METAG_REG32OP4,
2886         R_METAG_HIOG,
2887         R_METAG_LOOG,
2888         R_METAG_REL8,
2889         R_METAG_REL16,
2890         R_METAG_GNU_VTINHERIT,
2891         R_METAG_GNU_VTENTRY,
2892         R_METAG_HI16_GOTOFF,
2893         R_METAG_LO16_GOTOFF,
2894         R_METAG_GETSET_GOTOFF,
2895         R_METAG_GETSET_GOT,
2896         R_METAG_HI16_GOTPC,
2897         R_METAG_LO16_GOTPC,
2898         R_METAG_HI16_PLT,
2899         R_METAG_LO16_PLT,
2900         R_METAG_RELBRANCH_PLT,
2901         R_METAG_GOTOFF,
2902         R_METAG_PLT,
2903         R_METAG_COPY,
2904         R_METAG_JMP_SLOT,
2905         R_METAG_RELATIVE,
2906         R_METAG_GLOB_DAT,
2907         R_METAG_TLS_GD,
2908         R_METAG_TLS_LDM,
2909         R_METAG_TLS_LDO_HI16,
2910         R_METAG_TLS_LDO_LO16,
2911         R_METAG_TLS_LDO,
2912         R_METAG_TLS_IE,
2913         R_METAG_TLS_IENONPIC,
2914         R_METAG_TLS_IENONPIC_HI16,
2915         R_METAG_TLS_IENONPIC_LO16,
2916         R_METAG_TLS_TPOFF,
2917         R_METAG_TLS_DTPMOD,
2918         R_METAG_TLS_DTPOFF,
2919         R_METAG_TLS_LE,
2920         R_METAG_TLS_LE_HI16,
2921         R_METAG_TLS_LE_LO16,
2922     );
2923     static FLAGS_R_NDS32: &[Flag<u32>] = &flags!(
2924         R_NDS32_NONE,
2925         R_NDS32_32_RELA,
2926         R_NDS32_COPY,
2927         R_NDS32_GLOB_DAT,
2928         R_NDS32_JMP_SLOT,
2929         R_NDS32_RELATIVE,
2930         R_NDS32_TLS_TPOFF,
2931         R_NDS32_TLS_DESC,
2932     );
2933     static FLAGS_NT_CORE: &[Flag<u32>] = &flags!(
2934         NT_PRSTATUS,
2935         NT_PRFPREG,
2936         NT_FPREGSET,
2937         NT_PRPSINFO,
2938         NT_PRXREG,
2939         NT_TASKSTRUCT,
2940         NT_PLATFORM,
2941         NT_AUXV,
2942         NT_GWINDOWS,
2943         NT_ASRS,
2944         NT_PSTATUS,
2945         NT_PSINFO,
2946         NT_PRCRED,
2947         NT_UTSNAME,
2948         NT_LWPSTATUS,
2949         NT_LWPSINFO,
2950         NT_PRFPXREG,
2951         NT_SIGINFO,
2952         NT_FILE,
2953         NT_PRXFPREG,
2954         NT_PPC_VMX,
2955         NT_PPC_SPE,
2956         NT_PPC_VSX,
2957         NT_PPC_TAR,
2958         NT_PPC_PPR,
2959         NT_PPC_DSCR,
2960         NT_PPC_EBB,
2961         NT_PPC_PMU,
2962         NT_PPC_TM_CGPR,
2963         NT_PPC_TM_CFPR,
2964         NT_PPC_TM_CVMX,
2965         NT_PPC_TM_CVSX,
2966         NT_PPC_TM_SPR,
2967         NT_PPC_TM_CTAR,
2968         NT_PPC_TM_CPPR,
2969         NT_PPC_TM_CDSCR,
2970         NT_PPC_PKEY,
2971         NT_386_TLS,
2972         NT_386_IOPERM,
2973         NT_X86_XSTATE,
2974         NT_S390_HIGH_GPRS,
2975         NT_S390_TIMER,
2976         NT_S390_TODCMP,
2977         NT_S390_TODPREG,
2978         NT_S390_CTRS,
2979         NT_S390_PREFIX,
2980         NT_S390_LAST_BREAK,
2981         NT_S390_SYSTEM_CALL,
2982         NT_S390_TDB,
2983         NT_S390_VXRS_LOW,
2984         NT_S390_VXRS_HIGH,
2985         NT_S390_GS_CB,
2986         NT_S390_GS_BC,
2987         NT_S390_RI_CB,
2988         NT_ARM_VFP,
2989         NT_ARM_TLS,
2990         NT_ARM_HW_BREAK,
2991         NT_ARM_HW_WATCH,
2992         NT_ARM_SYSTEM_CALL,
2993         NT_ARM_SVE,
2994         NT_VMCOREDD,
2995         NT_MIPS_DSP,
2996         NT_MIPS_FP_MODE,
2997     );
2998     static FLAGS_NT_SOLARIS: &[Flag<u32>] = &flags!(NT_SOLARIS_PAGESIZE_HINT);
2999     static FLAGS_NT_GNU: &[Flag<u32>] = &flags!(
3000         NT_GNU_ABI_TAG,
3001         NT_GNU_HWCAP,
3002         NT_GNU_BUILD_ID,
3003         NT_GNU_GOLD_VERSION,
3004         NT_GNU_PROPERTY_TYPE_0,
3005     );
3006     static FLAGS_GRP: &[Flag<u32>] = &flags!(GRP_COMDAT);
3007     static FLAGS_DT: &[Flag<u32>] = &flags!(
3008         DT_NULL,
3009         DT_NEEDED,
3010         DT_PLTRELSZ,
3011         DT_PLTGOT,
3012         DT_HASH,
3013         DT_STRTAB,
3014         DT_SYMTAB,
3015         DT_RELA,
3016         DT_RELASZ,
3017         DT_RELAENT,
3018         DT_STRSZ,
3019         DT_SYMENT,
3020         DT_INIT,
3021         DT_FINI,
3022         DT_SONAME,
3023         DT_RPATH,
3024         DT_SYMBOLIC,
3025         DT_REL,
3026         DT_RELSZ,
3027         DT_RELENT,
3028         DT_PLTREL,
3029         DT_DEBUG,
3030         DT_TEXTREL,
3031         DT_JMPREL,
3032         DT_BIND_NOW,
3033         DT_INIT_ARRAY,
3034         DT_FINI_ARRAY,
3035         DT_INIT_ARRAYSZ,
3036         DT_FINI_ARRAYSZ,
3037         DT_RUNPATH,
3038         DT_FLAGS,
3039         DT_PREINIT_ARRAY,
3040         DT_PREINIT_ARRAYSZ,
3041         DT_SYMTAB_SHNDX,
3042         DT_GNU_PRELINKED,
3043         DT_GNU_CONFLICTSZ,
3044         DT_GNU_LIBLISTSZ,
3045         DT_CHECKSUM,
3046         DT_PLTPADSZ,
3047         DT_MOVEENT,
3048         DT_MOVESZ,
3049         DT_FEATURE_1,
3050         DT_POSFLAG_1,
3051         DT_SYMINSZ,
3052         DT_SYMINENT,
3053         DT_GNU_HASH,
3054         DT_TLSDESC_PLT,
3055         DT_TLSDESC_GOT,
3056         DT_GNU_CONFLICT,
3057         DT_GNU_LIBLIST,
3058         DT_CONFIG,
3059         DT_DEPAUDIT,
3060         DT_AUDIT,
3061         DT_PLTPAD,
3062         DT_MOVETAB,
3063         DT_SYMINFO,
3064         DT_VERSYM,
3065         DT_RELACOUNT,
3066         DT_RELCOUNT,
3067         DT_FLAGS_1,
3068         DT_VERDEF,
3069         DT_VERDEFNUM,
3070         DT_VERNEED,
3071         DT_VERNEEDNUM,
3072         DT_AUXILIARY,
3073         DT_FILTER,
3074     );
3075     static FLAGS_DT_SPARC: &[Flag<u32>] = &flags!(DT_SPARC_REGISTER);
3076     static FLAGS_DT_MIPS: &[Flag<u32>] = &flags!(
3077         DT_MIPS_RLD_VERSION,
3078         DT_MIPS_TIME_STAMP,
3079         DT_MIPS_ICHECKSUM,
3080         DT_MIPS_IVERSION,
3081         DT_MIPS_FLAGS,
3082         DT_MIPS_BASE_ADDRESS,
3083         DT_MIPS_MSYM,
3084         DT_MIPS_CONFLICT,
3085         DT_MIPS_LIBLIST,
3086         DT_MIPS_LOCAL_GOTNO,
3087         DT_MIPS_CONFLICTNO,
3088         DT_MIPS_LIBLISTNO,
3089         DT_MIPS_SYMTABNO,
3090         DT_MIPS_UNREFEXTNO,
3091         DT_MIPS_GOTSYM,
3092         DT_MIPS_HIPAGENO,
3093         DT_MIPS_RLD_MAP,
3094         DT_MIPS_DELTA_CLASS,
3095         DT_MIPS_DELTA_CLASS_NO,
3096         DT_MIPS_DELTA_INSTANCE,
3097         DT_MIPS_DELTA_INSTANCE_NO,
3098         DT_MIPS_DELTA_RELOC,
3099         DT_MIPS_DELTA_RELOC_NO,
3100         DT_MIPS_DELTA_SYM,
3101         DT_MIPS_DELTA_SYM_NO,
3102         DT_MIPS_DELTA_CLASSSYM,
3103         DT_MIPS_DELTA_CLASSSYM_NO,
3104         DT_MIPS_CXX_FLAGS,
3105         DT_MIPS_PIXIE_INIT,
3106         DT_MIPS_SYMBOL_LIB,
3107         DT_MIPS_LOCALPAGE_GOTIDX,
3108         DT_MIPS_LOCAL_GOTIDX,
3109         DT_MIPS_HIDDEN_GOTIDX,
3110         DT_MIPS_PROTECTED_GOTIDX,
3111         DT_MIPS_OPTIONS,
3112         DT_MIPS_INTERFACE,
3113         DT_MIPS_DYNSTR_ALIGN,
3114         DT_MIPS_INTERFACE_SIZE,
3115         DT_MIPS_RLD_TEXT_RESOLVE_ADDR,
3116         DT_MIPS_PERF_SUFFIX,
3117         DT_MIPS_COMPACT_SIZE,
3118         DT_MIPS_GP_VALUE,
3119         DT_MIPS_AUX_DYNAMIC,
3120         DT_MIPS_PLTGOT,
3121         DT_MIPS_RWPLT,
3122         DT_MIPS_RLD_MAP_REL,
3123     );
3124     static FLAGS_DT_ALPHA: &[Flag<u32>] = &flags!(DT_ALPHA_PLTRO);
3125     static FLAGS_DT_PPC: &[Flag<u32>] = &flags!(DT_PPC_GOT, DT_PPC_OPT);
3126     static FLAGS_DT_PPC64: &[Flag<u32>] =
3127         &flags!(DT_PPC64_GLINK, DT_PPC64_OPD, DT_PPC64_OPDSZ, DT_PPC64_OPT);
3128     static FLAGS_DT_IA_64: &[Flag<u32>] = &flags!(DT_IA_64_PLT_RESERVE);
3129     static FLAGS_DT_NIOS2: &[Flag<u32>] = &flags!(DT_NIOS2_GP);
3130     static FLAGS_DF: &[Flag<u32>] = &flags!(
3131         DF_ORIGIN,
3132         DF_SYMBOLIC,
3133         DF_TEXTREL,
3134         DF_BIND_NOW,
3135         DF_STATIC_TLS,
3136     );
3137     static FLAGS_DF_1: &[Flag<u32>] = &flags!(
3138         DF_1_NOW,
3139         DF_1_GLOBAL,
3140         DF_1_GROUP,
3141         DF_1_NODELETE,
3142         DF_1_LOADFLTR,
3143         DF_1_INITFIRST,
3144         DF_1_NOOPEN,
3145         DF_1_ORIGIN,
3146         DF_1_DIRECT,
3147         DF_1_TRANS,
3148         DF_1_INTERPOSE,
3149         DF_1_NODEFLIB,
3150         DF_1_NODUMP,
3151         DF_1_CONFALT,
3152         DF_1_ENDFILTEE,
3153         DF_1_DISPRELDNE,
3154         DF_1_DISPRELPND,
3155         DF_1_NODIRECT,
3156         DF_1_IGNMULDEF,
3157         DF_1_NOKSYMS,
3158         DF_1_NOHDR,
3159         DF_1_EDITED,
3160         DF_1_NORELOC,
3161         DF_1_SYMINTPOSE,
3162         DF_1_GLOBAUDIT,
3163         DF_1_SINGLETON,
3164         DF_1_STUB,
3165         DF_1_PIE,
3166     );
3167 }
3168