• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! The ELF ABI.
2 
3 #![allow(non_snake_case)]
4 #![cfg_attr(
5     all(not(target_vendor = "mustang"), feature = "use-libc-auxv"),
6     allow(dead_code)
7 )]
8 
9 pub(super) const SELFMAG: usize = 4;
10 pub(super) const ELFMAG: [u8; SELFMAG] = [0x7f, b'E', b'L', b'F'];
11 pub(super) const EI_CLASS: usize = 4;
12 pub(super) const EI_DATA: usize = 5;
13 pub(super) const EI_VERSION: usize = 6;
14 pub(super) const EI_OSABI: usize = 7;
15 pub(super) const EI_ABIVERSION: usize = 8;
16 pub(super) const EV_CURRENT: u8 = 1;
17 #[cfg(target_pointer_width = "32")]
18 pub(super) const ELFCLASS: u8 = 1; // ELFCLASS32
19 #[cfg(target_pointer_width = "64")]
20 pub(super) const ELFCLASS: u8 = 2; // ELFCLASS64
21 #[cfg(target_endian = "little")]
22 pub(super) const ELFDATA: u8 = 1; // ELFDATA2LSB
23 #[cfg(target_endian = "big")]
24 pub(super) const ELFDATA: u8 = 2; // ELFDATA2MSB
25 pub(super) const ELFOSABI_SYSV: u8 = 0;
26 pub(super) const ELFOSABI_LINUX: u8 = 3;
27 // At present all of our supported platforms use 0.
28 pub(super) const ELFABIVERSION: u8 = 0;
29 pub(super) const ET_DYN: u16 = 3;
30 pub(super) const EI_NIDENT: usize = 16;
31 pub(super) const SHN_UNDEF: u16 = 0;
32 pub(super) const SHN_ABS: u16 = 0xfff1;
33 pub(super) const PN_XNUM: u16 = 0xffff;
34 pub(super) const PT_LOAD: u32 = 1;
35 pub(super) const PT_DYNAMIC: u32 = 2;
36 pub(super) const PT_INTERP: u32 = 3;
37 pub(super) const PT_PHDR: u32 = 6;
38 pub(super) const PT_TLS: u32 = 7;
39 pub(super) const PT_GNU_STACK: u32 = 0x6474_e551;
40 pub(super) const PT_GNU_RELRO: u32 = 0x6474_e552;
41 pub(super) const PF_X: u32 = 1;
42 pub(super) const PF_W: u32 = 2;
43 pub(super) const PF_R: u32 = 4;
44 pub(super) const DT_NULL: i32 = 0;
45 pub(super) const DT_HASH: i32 = 4;
46 pub(super) const DT_STRTAB: i32 = 5;
47 pub(super) const DT_SYMTAB: i32 = 6;
48 pub(super) const DT_SYMENT: i32 = 11;
49 pub(super) const DT_VERSYM: i32 = 0x6fff_fff0;
50 pub(super) const DT_VERDEF: i32 = 0x6fff_fffc;
51 pub(super) const STB_WEAK: u8 = 2;
52 pub(super) const STB_GLOBAL: u8 = 1;
53 pub(super) const STT_NOTYPE: u8 = 0;
54 pub(super) const STT_FUNC: u8 = 2;
55 pub(super) const STN_UNDEF: u32 = 0;
56 pub(super) const VER_FLG_BASE: u16 = 0x1;
57 pub(super) const VER_DEF_CURRENT: u16 = 1;
58 pub(super) const STV_DEFAULT: u8 = 0;
59 #[cfg(target_arch = "arm")]
60 pub(super) const EM_CURRENT: u16 = 40; // EM_ARM
61 #[cfg(target_arch = "x86")]
62 pub(super) const EM_CURRENT: u16 = 3; // EM_386
63 #[cfg(target_arch = "powerpc64")]
64 pub(super) const EM_CURRENT: u16 = 21; // EM_PPC64
65 #[cfg(any(target_arch = "mips", target_arch = "mips64"))]
66 pub(super) const EM_CURRENT: u16 = 8; // EM_MIPS
67 #[cfg(target_arch = "x86_64")]
68 pub(super) const EM_CURRENT: u16 = 62; // EM_X86_64
69 #[cfg(target_arch = "aarch64")]
70 pub(super) const EM_CURRENT: u16 = 183; // EM_AARCH64
71 #[cfg(target_arch = "riscv64")]
72 pub(super) const EM_CURRENT: u16 = 243; // EM_RISCV
73 
74 #[inline]
ELF_ST_VISIBILITY(o: u8) -> u875 pub(super) const fn ELF_ST_VISIBILITY(o: u8) -> u8 {
76     o & 0x03
77 }
78 
79 #[inline]
ELF_ST_BIND(val: u8) -> u880 pub(super) const fn ELF_ST_BIND(val: u8) -> u8 {
81     val >> 4
82 }
83 
84 #[inline]
ELF_ST_TYPE(val: u8) -> u885 pub(super) const fn ELF_ST_TYPE(val: u8) -> u8 {
86     val & 0xf
87 }
88 
89 #[repr(C)]
90 pub(super) struct Elf_Ehdr {
91     pub(super) e_ident: [u8; EI_NIDENT],
92     pub(super) e_type: u16,
93     pub(super) e_machine: u16,
94     pub(super) e_version: u32,
95     pub(super) e_entry: usize,
96     pub(super) e_phoff: usize,
97     pub(super) e_shoff: usize,
98     pub(super) e_flags: u32,
99     pub(super) e_ehsize: u16,
100     pub(super) e_phentsize: u16,
101     pub(super) e_phnum: u16,
102     pub(super) e_shentsize: u16,
103     pub(super) e_shnum: u16,
104     pub(super) e_shstrndx: u16,
105 }
106 
107 #[cfg(target_pointer_width = "32")]
108 #[repr(C)]
109 pub(super) struct Elf_Phdr {
110     pub(super) p_type: u32,
111     pub(super) p_offset: usize,
112     pub(super) p_vaddr: usize,
113     pub(super) p_paddr: usize,
114     pub(super) p_filesz: usize,
115     pub(super) p_memsz: usize,
116     pub(super) p_flags: u32,
117     pub(super) p_align: usize,
118 }
119 
120 #[cfg(target_pointer_width = "64")]
121 #[repr(C)]
122 pub(super) struct Elf_Phdr {
123     pub(super) p_type: u32,
124     pub(super) p_flags: u32,
125     pub(super) p_offset: usize,
126     pub(super) p_vaddr: usize,
127     pub(super) p_paddr: usize,
128     pub(super) p_filesz: usize,
129     pub(super) p_memsz: usize,
130     pub(super) p_align: usize,
131 }
132 
133 #[cfg(target_pointer_width = "32")]
134 #[repr(C)]
135 pub(super) struct Elf_Sym {
136     pub(super) st_name: u32,
137     pub(super) st_value: usize,
138     pub(super) st_size: usize,
139     pub(super) st_info: u8,
140     pub(super) st_other: u8,
141     pub(super) st_shndx: u16,
142 }
143 
144 #[cfg(target_pointer_width = "64")]
145 #[repr(C)]
146 pub(super) struct Elf_Sym {
147     pub(super) st_name: u32,
148     pub(super) st_info: u8,
149     pub(super) st_other: u8,
150     pub(super) st_shndx: u16,
151     pub(super) st_value: usize,
152     pub(super) st_size: usize,
153 }
154 
155 #[repr(C)]
156 pub(super) struct Elf_Dyn {
157     pub(super) d_tag: i32,
158     pub(super) d_val: usize,
159 }
160 
161 #[repr(C)]
162 pub(super) struct Elf_Verdef {
163     pub(super) vd_version: u16,
164     pub(super) vd_flags: u16,
165     pub(super) vd_ndx: u16,
166     pub(super) vd_cnt: u16,
167     pub(super) vd_hash: u32,
168     pub(super) vd_aux: u32,
169     pub(super) vd_next: u32,
170 }
171 
172 #[repr(C)]
173 pub(super) struct Elf_Verdaux {
174     pub(super) vda_name: u32,
175     pub(super) _vda_next: u32,
176 }
177