16#ifndef LIEF_ELF_SECTION_H
17#define LIEF_ELF_SECTION_H
44class ObjectFileLayout;
62 enum class TYPE : uint64_t {
82 ANDROID_REL = 0x60000001,
83 ANDROID_RELA = 0x60000002,
84 LLVM_ADDRSIG = 0x6fff4c03,
86 ANDROID_RELR = 0x6fffff00,
87 GNU_ATTRIBUTES = 0x6ffffff5,
88 GNU_HASH = 0x6ffffff6,
89 GNU_VERDEF = 0x6ffffffd,
90 GNU_VERNEED = 0x6ffffffe,
91 GNU_VERSYM = 0x6fffffff,
101 0x70000001U + (_ARM_ID_ << _ID_SHIFT_),
104 (_ARM_ID_ << _ID_SHIFT_),
107 (_ARM_ID_ << _ID_SHIFT_),
108 ARM_DEBUGOVERLAY = 0x70000004U + (_ARM_ID_ << _ID_SHIFT_),
109 ARM_OVERLAYSECTION = 0x70000005U + (_ARM_ID_ << _ID_SHIFT_),
113 (_HEX_ID_ << _ID_SHIFT_),
118 0x70000001 + (_X86_64_ID_ << _ID_SHIFT_),
120 MIPS_LIBLIST = 0x70000000 + (_MIPS_ID_ << _ID_SHIFT_),
121 MIPS_MSYM = 0x70000001 + (_MIPS_ID_ << _ID_SHIFT_),
122 MIPS_CONFLICT = 0x70000002 + (_MIPS_ID_ << _ID_SHIFT_),
123 MIPS_GPTAB = 0x70000003 + (_MIPS_ID_ << _ID_SHIFT_),
124 MIPS_UCODE = 0x70000004 + (_MIPS_ID_ << _ID_SHIFT_),
125 MIPS_DEBUG = 0x70000005 + (_MIPS_ID_ << _ID_SHIFT_),
126 MIPS_REGINFO = 0x70000006 + (_MIPS_ID_ << _ID_SHIFT_),
127 MIPS_PACKAGE = 0x70000007 + (_MIPS_ID_ << _ID_SHIFT_),
128 MIPS_PACKSYM = 0x70000008 + (_MIPS_ID_ << _ID_SHIFT_),
129 MIPS_RELD = 0x70000009 + (_MIPS_ID_ << _ID_SHIFT_),
130 MIPS_IFACE = 0x7000000b + (_MIPS_ID_ << _ID_SHIFT_),
131 MIPS_CONTENT = 0x7000000c + (_MIPS_ID_ << _ID_SHIFT_),
132 MIPS_OPTIONS = 0x7000000d + (_MIPS_ID_ << _ID_SHIFT_),
133 MIPS_SHDR = 0x70000010 + (_MIPS_ID_ << _ID_SHIFT_),
134 MIPS_FDESC = 0x70000011 + (_MIPS_ID_ << _ID_SHIFT_),
135 MIPS_EXTSYM = 0x70000012 + (_MIPS_ID_ << _ID_SHIFT_),
136 MIPS_DENSE = 0x70000013 + (_MIPS_ID_ << _ID_SHIFT_),
137 MIPS_PDESC = 0x70000014 + (_MIPS_ID_ << _ID_SHIFT_),
138 MIPS_LOCSYM = 0x70000015 + (_MIPS_ID_ << _ID_SHIFT_),
139 MIPS_AUXSYM = 0x70000016 + (_MIPS_ID_ << _ID_SHIFT_),
140 MIPS_OPTSYM = 0x70000017 + (_MIPS_ID_ << _ID_SHIFT_),
141 MIPS_LOCSTR = 0x70000018 + (_MIPS_ID_ << _ID_SHIFT_),
142 MIPS_LINE = 0x70000019 + (_MIPS_ID_ << _ID_SHIFT_),
143 MIPS_RFDESC = 0x7000001a + (_MIPS_ID_ << _ID_SHIFT_),
144 MIPS_DELTASYM = 0x7000001b + (_MIPS_ID_ << _ID_SHIFT_),
145 MIPS_DELTAINST = 0x7000001c + (_MIPS_ID_ << _ID_SHIFT_),
146 MIPS_DELTACLASS = 0x7000001d + (_MIPS_ID_ << _ID_SHIFT_),
147 MIPS_DWARF = 0x7000001e + (_MIPS_ID_ << _ID_SHIFT_),
148 MIPS_DELTADECL = 0x7000001f + (_MIPS_ID_ << _ID_SHIFT_),
149 MIPS_SYMBOL_LIB = 0x70000020 + (_MIPS_ID_ << _ID_SHIFT_),
150 MIPS_EVENTS = 0x70000021 + (_MIPS_ID_ << _ID_SHIFT_),
151 MIPS_TRANSLATE = 0x70000022 + (_MIPS_ID_ << _ID_SHIFT_),
152 MIPS_PIXIE = 0x70000023 + (_MIPS_ID_ << _ID_SHIFT_),
153 MIPS_XLATE = 0x70000024 + (_MIPS_ID_ << _ID_SHIFT_),
154 MIPS_XLATE_DEBUG = 0x70000025 + (_MIPS_ID_ << _ID_SHIFT_),
155 MIPS_WHIRL = 0x70000026 + (_MIPS_ID_ << _ID_SHIFT_),
156 MIPS_EH_REGION = 0x70000027 + (_MIPS_ID_ << _ID_SHIFT_),
157 MIPS_XLATE_OLD = 0x70000028 + (_MIPS_ID_ << _ID_SHIFT_),
158 MIPS_PDR_EXCEPTION = 0x70000029 + (_MIPS_ID_ << _ID_SHIFT_),
159 MIPS_ABIFLAGS = 0x7000002a + (_MIPS_ID_ << _ID_SHIFT_),
160 MIPS_XHASH = 0x7000002b + (_MIPS_ID_ << _ID_SHIFT_),
162 RISCV_ATTRIBUTES = 0x70000003 + (_RISCV_ID_ << _ID_SHIFT_),
174 INFO_LINK = 0x000000040,
178 OS_NONCONFORMING = 0x000000100,
182 COMPRESSED = 0x000000800,
183 GNU_RETAIN = 0x000200000,
184 EXCLUDE = 0x080000000,
193 XCORE_SHF_DP_SECTION = 0x010000000 + (_XCORE_ID_ << _ID_SHIFT_),
194 XCORE_SHF_CP_SECTION = 0x020000000 + (_XCORE_ID_ << _ID_SHIFT_),
196 X86_64_LARGE = 0x010000000 + (_X86_64_ID_ << _ID_SHIFT_),
198 HEX_GPREL = 0x010000000 + (_HEX_ID_ << _ID_SHIFT_),
200 MIPS_NODUPES = 0x001000000 + (_MIPS_ID_ << _ID_SHIFT_),
201 MIPS_NAMES = 0x002000000 + (_MIPS_ID_ << _ID_SHIFT_),
202 MIPS_LOCAL = 0x004000000 + (_MIPS_ID_ << _ID_SHIFT_),
203 MIPS_NOSTRIP = 0x008000000 + (_MIPS_ID_ << _ID_SHIFT_),
204 MIPS_GPREL = 0x010000000 + (_MIPS_ID_ << _ID_SHIFT_),
205 MIPS_MERGE = 0x020000000 + (_MIPS_ID_ << _ID_SHIFT_),
206 MIPS_ADDR = 0x040000000 + (_MIPS_ID_ << _ID_SHIFT_),
207 MIPS_STRING = 0x080000000 + (_MIPS_ID_ << _ID_SHIFT_),
209 ARM_PURECODE = 0x020000000 + (_ARM_ID_ << _ID_SHIFT_),
244 void content(
const std::vector<uint8_t>& data)
override;
262 uint64_t
size()
const override {
284 return original_size_;
289 return address_align_;
384 std::unique_ptr<SpanStream>
stream()
const;
397 uint64_t original_size_ = 0;
400 uint64_t address_align_ = 0;
401 uint64_t entry_size_ = 0;
403 bool is_frame_ =
false;
404 DataHandler::Handler* datahandler_ =
nullptr;
405 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
friend class ObjectFileLayout
Definition ELF/Section.hpp:53
void size(uint64_t size) override
Change the section size.
static TYPE type_from(uint32_t value, ARCH arch)
ref_iterator< segments_t & > it_segments
Definition ELF/Section.hpp:57
span< const uint8_t > content() const override
Section's content.
it_segments segments()
Definition ELF/Section.hpp:354
uint64_t original_size() const
Original size of the section's data.
Definition ELF/Section.hpp:283
friend class ExeLayout
Definition ELF/Section.hpp:52
Section & operator+=(FLAGS c)
Definition ELF/Section.hpp:373
void clear_flags()
Definition ELF/Section.hpp:330
uint64_t flags() const
Section flags.
Definition ELF/Section.hpp:249
std::vector< Segment * > segments_t
Definition ELF/Section.hpp:56
static constexpr uint64_t TYPE_MASK
Definition ELF/Section.hpp:214
Section & as_frame()
Definition ELF/Section.hpp:362
void offset(uint64_t offset) override
static constexpr uint64_t FLAG_MASK
Definition ELF/Section.hpp:212
friend std::ostream & operator<<(std::ostream &os, const Section §ion)
void remove(FLAGS flag)
Remove the given ELF_SECTION_FLAGS.
std::vector< FLAGS > flags_list() const
Return section flags as a std::set.
bool is_frame() const
Definition ELF/Section.hpp:367
uint64_t file_offset() const
Definition ELF/Section.hpp:275
~Section() override=default
void alignment(uint64_t alignment)
Definition ELF/Section.hpp:346
void information(uint32_t info)
Definition ELF/Section.hpp:342
static uint32_t to_value(TYPE type)
Definition ELF/Section.hpp:218
std::unique_ptr< SpanStream > stream() const
Return a stream over the content of this section.
Section(const Section &other)
const_ref_iterator< const segments_t & > it_const_segments
Definition ELF/Section.hpp:58
TYPE type() const
Definition ELF/Section.hpp:236
friend class Builder
Definition ELF/Section.hpp:51
TYPE
Definition ELF/Section.hpp:62
@ _ID_SHIFT_
Definition ELF/Section.hpp:93
@ SHT_NULL_
Definition ELF/Section.hpp:63
@ PROGBITS
Definition ELF/Section.hpp:64
Section & operator-=(FLAGS c)
Definition ELF/Section.hpp:378
void content(std::vector< uint8_t > &&data)
uint32_t link() const
Index to another section.
Definition ELF/Section.hpp:309
uint64_t size() const override
section's size (size in the binary, not the virtual size)
Definition ELF/Section.hpp:262
friend class Binary
Definition ELF/Section.hpp:50
void content(const std::vector< uint8_t > &data) override
Set section content.
Section & clear(uint8_t value=0)
Clear the content of the section with the given value.
void accept(Visitor &visitor) const override
void swap(Section &other) noexcept
bool has(const Segment &segment) const
True if the section is wrapped by the given Segment
void entry_size(uint64_t entry_size)
Definition ELF/Section.hpp:350
friend class Parser
Definition ELF/Section.hpp:49
Section(const std::string &name, TYPE type=TYPE::PROGBITS)
Definition ELF/Section.hpp:222
FLAGS
Definition ELF/Section.hpp:165
@ _ID_SHIFT_
Definition ELF/Section.hpp:186
void type(TYPE type)
Definition ELF/Section.hpp:322
uint64_t information() const
Section information. The meaning of this value depends on the section's type.
Definition ELF/Section.hpp:294
uint64_t offset() const override
Offset in the binary.
Definition ELF/Section.hpp:270
static constexpr uint32_t MAX_SECTION_SIZE
Definition ELF/Section.hpp:60
void link(uint32_t link)
Definition ELF/Section.hpp:338
void add(FLAGS flag)
Add the given ELF_SECTION_FLAGS.
Section & operator=(Section other)
Definition ELF/Section.hpp:229
uint64_t alignment() const
Section file alignment.
Definition ELF/Section.hpp:288
it_const_segments segments() const
Definition ELF/Section.hpp:358
bool has(FLAGS flag) const
True if the section has the given flag
uint64_t entry_size() const
This function returns the size of an element in the case of a section that contains an array.
Definition ELF/Section.hpp:304
void file_offset(uint64_t offset)
Definition ELF/Section.hpp:334
void flags(uint64_t flags)
Definition ELF/Section.hpp:326
Class which represents the ELF segments.
Definition Segment.hpp:48
Class which represents an abstracted section.
Definition Abstract/Section.hpp:29
virtual std::string name() const
section's name
Definition Abstract/Section.hpp:43
Definition SpanStream.hpp:32
Definition Visitor.hpp:212
Iterator which returns reference on container's values.
Definition iterators.hpp:45
#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:40
tcb::span< ElementType, Extent > span
Definition span.hpp:22
ref_iterator< CT, U, typename decay_t< CT >::const_iterator > const_ref_iterator
Iterator which return const ref on container's values.
Definition iterators.hpp:286
#define LIEF_API
Definition visibility.h:43
#define LIEF_LOCAL
Definition visibility.h:44