1use crate::context::*;
2use crate::utils::{read_s, Pod};
3
4#[derive(Debug, Clone)]
5pub enum ParseDynamicError {
6 BrokenEntry,
7}
8
9#[derive(Debug, Clone, Copy)]
11pub struct Dynamic<'a, T: Context> {
12 entries: &'a [DynamicEntry<T>],
13}
14
15impl<'a, T: Context> Dynamic<'a, T> {
16 pub fn parse(content: &'a [u8]) -> Result<Self, ParseDynamicError> {
17 use ParseDynamicError::*;
18 let entries: &[DynamicEntry<T>] = read_s(content).ok_or(BrokenEntry)?;
19 Ok(Self { entries })
20 }
21 pub fn entries(&self) -> &'a [DynamicEntry<T>] {
22 self.entries
23 }
24}
25
26#[repr(C)]
27#[derive(Debug, Clone)]
28pub struct DynamicEntry<T: Context> {
29 pub tag: T::PropUsize,
30 pub un: T::PropUsize,
31}
32
33impl<T: Context> DynamicEntry<T> {
34 pub fn tag(&self) -> T::DynamicTag {
35 From::<T::Integer>::from(T::interpret(self.tag))
36 }
37 pub fn un(&self) -> T::Integer {
38 T::interpret(self.un)
39 }
40}
41
42unsafe impl<T: Context> Pod for DynamicEntry<T> {}
43
44#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
45pub enum DynamicTag32 {
46 Null,
47 Needed,
48 PltRelSize,
49 PltGot,
50 Hash,
51 Strtab,
52 Symtab,
53 Rela,
54 RelaSize,
55 RelaEnt,
56 StrSize,
57 SymEnt,
58 Init,
59 Fini,
60 SoName,
61 RPath,
62 Symbolic,
63 Rel,
64 RelSize,
65 RelEnt,
66 PltRel,
67 Debug,
68 TextRel,
69 JmpRel,
70 BindNow,
71 InitArray,
72 FiniArray,
73 InitArraySize,
74 FiniArraySize,
75 RunPath,
76 Flags,
77 PreInitArray,
78 PreInitArraySize,
79 SymtabShndx,
80 OsSpecific(u32),
81 ProcessorSpecific(u32),
82 NonStandard(u32),
83}
84
85impl From<u32> for DynamicTag32 {
86 fn from(value: u32) -> Self {
87 use DynamicTag32::*;
88 match value {
89 0 => Null,
90 1 => Needed,
91 2 => PltRelSize,
92 3 => PltGot,
93 4 => Hash,
94 5 => Strtab,
95 6 => Symtab,
96 7 => Rela,
97 8 => RelaSize,
98 9 => RelaEnt,
99 10 => StrSize,
100 11 => SymEnt,
101 12 => Init,
102 13 => Fini,
103 14 => SoName,
104 15 => RPath,
105 16 => Symbolic,
106 17 => Rel,
107 18 => RelSize,
108 19 => RelEnt,
109 20 => PltRel,
110 21 => Debug,
111 22 => TextRel,
112 23 => JmpRel,
113 24 => BindNow,
114 25 => InitArray,
115 26 => FiniArray,
116 27 => InitArraySize,
117 28 => FiniArraySize,
118 29 => RunPath,
119 30 => Flags,
120 32 => PreInitArray,
121 33 => PreInitArraySize,
122 34 => SymtabShndx,
123 x @ 0x6000000D..=0x6FFFF000 => OsSpecific(x),
124 x @ 0x70000000..=0x7FFFFFFF => ProcessorSpecific(x),
125 x => NonStandard(x),
126 }
127 }
128}
129
130impl From<DynamicTag32> for u32 {
131 fn from(value: DynamicTag32) -> Self {
132 use DynamicTag32::*;
133 match value {
134 Null => 0,
135 Needed => 1,
136 PltRelSize => 2,
137 PltGot => 3,
138 Hash => 4,
139 Strtab => 5,
140 Symtab => 6,
141 Rela => 7,
142 RelaSize => 8,
143 RelaEnt => 9,
144 StrSize => 10,
145 SymEnt => 11,
146 Init => 12,
147 Fini => 13,
148 SoName => 14,
149 RPath => 15,
150 Symbolic => 16,
151 Rel => 17,
152 RelSize => 18,
153 RelEnt => 19,
154 PltRel => 20,
155 Debug => 21,
156 TextRel => 22,
157 JmpRel => 23,
158 BindNow => 24,
159 InitArray => 25,
160 FiniArray => 26,
161 InitArraySize => 27,
162 FiniArraySize => 28,
163 RunPath => 29,
164 Flags => 30,
165 PreInitArray => 32,
166 PreInitArraySize => 33,
167 SymtabShndx => 34,
168 OsSpecific(x) => x,
169 ProcessorSpecific(x) => x,
170 NonStandard(x) => x,
171 }
172 }
173}
174
175#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
176pub enum DynamicTag64 {
177 Null,
178 Needed,
179 PltRelSize,
180 PltGot,
181 Hash,
182 Strtab,
183 Symtab,
184 Rela,
185 RelaSize,
186 RelaEnt,
187 StrSize,
188 SymEnt,
189 Init,
190 Fini,
191 SoName,
192 RPath,
193 Symbolic,
194 Rel,
195 RelSize,
196 RelEnt,
197 PltRel,
198 Debug,
199 TextRel,
200 JmpRel,
201 BindNow,
202 InitArray,
203 FiniArray,
204 InitArraySize,
205 FiniArraySize,
206 RunPath,
207 Flags,
208 PreInitArray,
209 PreInitArraySize,
210 SymtabShndx,
211 OsSpecific(u64),
212 ProcessorSpecific(u64),
213 NonStandard(u64),
214}
215
216impl From<u64> for DynamicTag64 {
217 fn from(value: u64) -> Self {
218 use DynamicTag64::*;
219 match value {
220 0 => Null,
221 1 => Needed,
222 2 => PltRelSize,
223 3 => PltGot,
224 4 => Hash,
225 5 => Strtab,
226 6 => Symtab,
227 7 => Rela,
228 8 => RelaSize,
229 9 => RelaEnt,
230 10 => StrSize,
231 11 => SymEnt,
232 12 => Init,
233 13 => Fini,
234 14 => SoName,
235 15 => RPath,
236 16 => Symbolic,
237 17 => Rel,
238 18 => RelSize,
239 19 => RelEnt,
240 20 => PltRel,
241 21 => Debug,
242 22 => TextRel,
243 23 => JmpRel,
244 24 => BindNow,
245 25 => InitArray,
246 26 => FiniArray,
247 27 => InitArraySize,
248 28 => FiniArraySize,
249 29 => RunPath,
250 30 => Flags,
251 32 => PreInitArray,
252 33 => PreInitArraySize,
253 34 => SymtabShndx,
254 x @ 0x6000000D..=0x6FFFF000 => OsSpecific(x),
255 x @ 0x70000000..=0x7FFFFFFF => ProcessorSpecific(x),
256 x => NonStandard(x),
257 }
258 }
259}
260
261impl From<DynamicTag64> for u64 {
262 fn from(value: DynamicTag64) -> Self {
263 use DynamicTag64::*;
264 match value {
265 Null => 0,
266 Needed => 1,
267 PltRelSize => 2,
268 PltGot => 3,
269 Hash => 4,
270 Strtab => 5,
271 Symtab => 6,
272 Rela => 7,
273 RelaSize => 8,
274 RelaEnt => 9,
275 StrSize => 10,
276 SymEnt => 11,
277 Init => 12,
278 Fini => 13,
279 SoName => 14,
280 RPath => 15,
281 Symbolic => 16,
282 Rel => 17,
283 RelSize => 18,
284 RelEnt => 19,
285 PltRel => 20,
286 Debug => 21,
287 TextRel => 22,
288 JmpRel => 23,
289 BindNow => 24,
290 InitArray => 25,
291 FiniArray => 26,
292 InitArraySize => 27,
293 FiniArraySize => 28,
294 RunPath => 29,
295 Flags => 30,
296 PreInitArray => 32,
297 PreInitArraySize => 33,
298 SymtabShndx => 34,
299 OsSpecific(x) => x,
300 ProcessorSpecific(x) => x,
301 NonStandard(x) => x,
302 }
303 }
304}
305
306#[derive(Debug, Clone, Copy, PartialEq, Eq, From, Into, BitAnd, BitOr, BitXor, LowerHex)]
307pub struct DynamicFlags32(pub u32);
308
309impl DynamicFlags32 {
310 pub const ORIGIN: Self = Self(0x1);
311 pub const SYMBOLIC: Self = Self(0x2);
312 pub const TEXTREL: Self = Self(0x4);
313 pub const BIND_NOW: Self = Self(0x8);
314 pub const STATIC_TLS: Self = Self(0x10);
315}
316
317#[derive(Debug, Clone, Copy, PartialEq, Eq, From, Into, BitAnd, BitOr, BitXor, LowerHex)]
318pub struct DynamicFlags64(pub u64);
319
320impl DynamicFlags64 {
321 pub const ORIGIN: Self = Self(0x1);
322 pub const SYMBOLIC: Self = Self(0x2);
323 pub const TEXTREL: Self = Self(0x4);
324 pub const BIND_NOW: Self = Self(0x8);
325 pub const STATIC_TLS: Self = Self(0x10);
326}