LIEF: Library to Instrument Executable Formats Version 0.17.0
|
Loading...
Searching...
No Matches
Go to the documentation of this file.
16#ifndef LIEF_ELF_SEGMENT_H
17#define LIEF_ELF_SEGMENT_H
54 using sections_t = std::vector<Section*>;
55 using it_sections = ref_iterator<sections_t&>;
56 using it_const_sections = const_ref_iterator<const sections_t&>;
58 static constexpr uint64_t PT_BIT = 33;
59 static constexpr uint64_t PT_MASK = (uint64_t(1) << PT_BIT) - 1;
61 static constexpr uint64_t PT_ARM = uint64_t(1) << PT_BIT;
62 static constexpr uint64_t PT_AARCH64 = uint64_t(2) << PT_BIT;
63 static constexpr uint64_t PT_MIPS = uint64_t(3) << PT_BIT;
64 static constexpr uint64_t PT_RISCV = uint64_t(4) << PT_BIT;
66 enum class TYPE : uint64_t {
67 UNKNOWN = uint64_t(-1),
77 GNU_EH_FRAME = 0x6474e550,
79 GNU_STACK = 0x6474e551,
80 GNU_PROPERTY = 0x6474e553,
81 GNU_RELRO = 0x6474e552,
83 ARM_ARCHEXT = 0x70000000 | PT_ARM,
84 ARM_EXIDX = 0x70000001 | PT_ARM,
86 AARCH64_MEMTAG_MTE = 0x70000002 | PT_AARCH64,
88 MIPS_REGINFO = 0x70000000 | PT_MIPS,
89 MIPS_RTPROC = 0x70000001 | PT_MIPS,
90 MIPS_OPTIONS = 0x70000002 | PT_MIPS,
91 MIPS_ABIFLAGS = 0x70000003 | PT_MIPS,
93 RISCV_ATTRIBUTES = 0x70000003 | PT_RISCV,
105 return static_cast<uint64_t
>(type) & PT_MASK;
108 static result<Segment>
from_raw(
const uint8_t* ptr,
size_t size);
109 static result<Segment>
from_raw(
const std::vector<uint8_t>& raw) {
110 return from_raw(raw.data(), raw.size());
126 return type() == TYPE::LOAD;
130 return type() == TYPE::INTERP;
134 return type() == TYPE::PHDR;
141 FLAGS
flags()
const {
144 return FLAGS(flags_);
154 return virtual_address_;
163 return physical_address_;
175 return virtual_size_;
182 span<const uint8_t>
content()
const;
185 bool has(FLAGS flag)
const {
188 return (flags_ &
static_cast<uint64_t
>(flag)) != 0;
190 bool has(
const Section& section)
const;
193 bool has(
const std::string& section_name)
const;
196 void add(FLAGS flag);
208 flags_ =
static_cast<uint32_t
>(flags);
222 virtual_address_ = virtual_address;
226 physical_address_ = physical_address;
232 virtual_size_ = virtual_size;
236 alignment_ = alignment;
254 std::unique_ptr<SpanStream>
stream()
const;
256 void accept(Visitor& visitor)
const override;
272 LIEF_LOCAL Segment(
const T& header, ARCH arch = ARCH::NONE);
277 TYPE type_ = TYPE::PT_NULL_;
278 ARCH arch_ = ARCH::NONE;
280 uint64_t file_offset_ = 0;
281 uint64_t virtual_address_ = 0;
282 uint64_t physical_address_ = 0;
284 uint64_t virtual_size_ = 0;
285 uint64_t alignment_ = 0;
286 uint64_t handler_size_ = 0;
287 sections_t sections_;
288 DataHandler::Handler* datahandler_ =
nullptr;
289 std::vector<uint8_t> content_c_;
Class which represents an ELF binary.
Definition ELF/Binary.hpp:59
Class which takes an ELF::Binary object and reconstructs a valid binary.
Definition ELF/Builder.hpp:48
Class which parses and transforms an ELF file into a ELF::Binary object.
Definition ELF/Parser.hpp:45
Class wich represents an ELF Section.
Definition ELF/Section.hpp:48
Class which represents the ELF segments.
Definition Segment.hpp:46
uint64_t physical_address() const
The physical address of the segment. This value is not really relevant on systems like Linux or Andro...
Definition Segment.hpp:162
void physical_address(uint64_t physical_address)
Definition Segment.hpp:225
void add(FLAGS flag)
Append the given ELF_SEGMENT_FLAGS.
static result< Segment > from_raw(const std::vector< uint8_t > &raw)
Definition Segment.hpp:109
size_t get_content_size() const
T get_content_value(size_t offset) const
bool is_interpreter() const
Definition Segment.hpp:129
void flags(FLAGS flags)
Definition Segment.hpp:207
~Segment() override=default
bool is_phdr() const
Definition Segment.hpp:133
uint64_t physical_size() const
The file size of the data associated with this segment.
Definition Segment.hpp:167
void clear_flags()
Definition Segment.hpp:215
Segment & operator-=(FLAGS flag)
Definition Segment.hpp:263
bool has(const std::string §ion_name) const
Check if the current segment wraps the given section's name.
void flags(uint32_t flags)
Definition Segment.hpp:211
Segment & operator+=(FLAGS flag)
Definition Segment.hpp:258
void set_content_value(size_t offset, T value)
void file_offset(uint64_t file_offset)
Segment & operator=(Segment other)
void remove(FLAGS flag)
Remove the given ELF_SEGMENT_FLAGS.
Segment & operator=(Segment &&)=default
void type(TYPE type)
Definition Segment.hpp:203
uint64_t virtual_address() const
The virtual address of the segment.
Definition Segment.hpp:153
span< const uint8_t > content() const
The raw data associated with this segment.
bool has(FLAGS flag) const
Check if the current segment has the given flag.
Definition Segment.hpp:187
void swap(Segment &other)
FLAGS
Definition Segment.hpp:96
it_sections sections()
Iterator over the sections wrapped by this segment.
Definition Segment.hpp:246
void virtual_size(uint64_t virtual_size)
Definition Segment.hpp:231
TYPE type() const
The segment's type (LOAD, DYNAMIC, ...)
Definition Segment.hpp:138
void content(std::vector< uint8_t > content)
void physical_size(uint64_t physical_size)
bool has(const Section §ion) const
Check if the current segment wraps the given ELF::Section.
uint64_t file_offset() const
The file offset of the data associated with this segment.
Definition Segment.hpp:148
static TYPE type_from(uint64_t value, ARCH arch)
bool is_load() const
Definition Segment.hpp:125
it_const_sections sections() const
Definition Segment.hpp:250
TYPE
Definition Segment.hpp:66
Segment(const Segment &other)
uint64_t alignment() const
The offset alignment of the segment.
Definition Segment.hpp:179
static uint64_t to_value(TYPE type)
Definition Segment.hpp:104
FLAGS flags() const
The flag permissions associated with this segment.
Definition Segment.hpp:143
void virtual_address(uint64_t virtual_address)
Definition Segment.hpp:221
std::unique_ptr< SpanStream > stream() const
Segment(Segment &&)=default
static result< Segment > from_raw(const uint8_t *ptr, size_t size)
uint64_t virtual_size() const
The in-memory size of this segment. Usually, if the .bss segment is wrapped by this segment then,...
Definition Segment.hpp:174
void alignment(uint64_t alignment)
Definition Segment.hpp:235
void accept(Visitor &visitor) const override
friend std::ostream & operator<<(std::ostream &os, const Segment &segment)
Definition SpanStream.hpp:32
#define ENABLE_BITMASK_OPERATORS(X)
Definition enums.hpp:24
Definition ELF/Binary.hpp:38
Namespace related to the LIEF's ELF module.
Definition Abstract/Header.hpp:28
const char * to_string(DynamicEntry::TAG e)
ARCH
Definition ELF/enums.hpp:30
@ NONE
Definition ELF/enums.hpp:31
LIEF namespace.
Definition Abstract/Binary.hpp:36
#define LIEF_API
Definition visibility.h:41
#define LIEF_LOCAL
Definition visibility.h:42