zelf/
dynamic.rs

1use crate::context::*;
2use crate::utils::{read_s, Pod};
3
4#[derive(Debug, Clone)]
5pub enum ParseDynamicError {
6    BrokenEntry,
7}
8
9/// Dynamic section/program.
10#[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}