1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use super::super::{ElfHeader, VarSize, BufferBorrow};
use super::{SectionType, SectionKind, SectionAttributes, SectMemAttrib};
pub trait Section<'a>: SectionType + SectionAttributes + ElfHeader<'a> {
fn sh_name(&self) -> usize;
fn name<'b>(&'b self) -> &'b str;
fn link_name<'b>(&'b self) -> Option<&'b str>;
fn sh_addr(&self) -> VarSize;
fn sh_offset(&self) -> usize;
fn sh_size(&self) -> usize;
fn sh_link(&self) -> usize;
fn sh_info(&self) -> usize;
fn sh_addralign(&self) -> VarSize;
fn sh_entsize(&self) -> usize;
fn sh_flags<'b>(&'b self) -> &'b [SectMemAttrib] {
self.get_attributes()
}
fn sh_type(&self) -> SectionKind {
self.get_section_type()
}
fn get_data(&self) -> Option<&'a [u8]> {
let buffer = self.get_buffer();
let offset = self.sh_offset();
let size = self.sh_size();
let end = offset + size;
if offset < buffer.len() && end < buffer.len() {
Some(&buffer[offset..end])
} else {
None
}
}
}