LIEF: Library to Instrument Executable Formats Version 1.0.0
Loading...
Searching...
No Matches
DyldChainedFixups.hpp
Go to the documentation of this file.
1/* Copyright 2017 - 2026 R. Thomas
2 * Copyright 2017 - 2026 Quarkslab
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#ifndef LIEF_MACHO_DYLD_CHAINED_FIXUPS_H
17#define LIEF_MACHO_DYLD_CHAINED_FIXUPS_H
18#include <memory>
19#include "LIEF/span.hpp"
20#include "LIEF/iterators.hpp"
22#include "LIEF/visibility.h"
25
26namespace LIEF {
27namespace MachO {
28
29class Binary;
30class BinaryParser;
32class Builder;
34class ChainedBindingInfoList;
36class LinkEdit;
37class SegmentCommand;
38
39namespace details {
40struct linkedit_data_command;
41struct dyld_chained_fixups_header;
42struct dyld_chained_starts_in_segment;
43}
44
51 friend class BinaryParser;
52 friend class Builder;
53 friend class LinkEdit;
54 friend class BindingInfoIterator;
55 friend class Binary;
57
58 public:
64 struct chained_starts_in_segment {
67 uint32_t offset = 0;
68
70 uint32_t size = 0;
71
74 uint16_t page_size = 0;
75
78 uint64_t segment_offset = 0;
79
81 uint32_t max_valid_pointer = 0;
82
85
87 size_t page_count() const {
88 return page_start.size();
89 }
90
93 std::vector<uint16_t> page_start;
94
96 std::vector<uint16_t> chain_starts;
97
100
101 LIEF_API friend std::ostream&
102 operator<<(std::ostream& os, const chained_starts_in_segment& info);
103
104 static chained_starts_in_segment
108
109 private:
110 friend class BinaryParser;
112 chained_starts_in_segment(uint32_t offset, SegmentCommand& segment) :
113 offset(offset),
114 segment(segment) {}
115 chained_starts_in_segment(uint32_t offset,
116 const details::dyld_chained_starts_in_segment& info,
117 SegmentCommand& segment);
118 };
119
121 using chained_starts_in_segments_t = std::vector<chained_starts_in_segment>;
122
126
130
132 using binding_info_t = std::vector<std::unique_ptr<ChainedBindingInfo>>;
133
136
140
141
143 DyldChainedFixups(const details::linkedit_data_command& cmd);
144 std::unique_ptr<LoadCommand> clone() const override {
145 return std::unique_ptr<DyldChainedFixups>(new DyldChainedFixups(*this));
146 }
147
149
152 uint32_t data_offset() const {
153 return data_offset_;
154 }
155
157 uint32_t data_size() const {
158 return data_size_;
159 }
160
161 void data_offset(uint32_t offset) {
162 data_offset_ = offset;
163 }
164 void data_size(uint32_t size) {
165 data_size_ = size;
166 }
167
170 return content_;
171 }
172
175 return all_bindings_;
176 }
177
180 return all_bindings_;
181 }
182
185 return chained_starts_in_segment_;
186 }
187
188 it_const_chained_starts_in_segments_t
190 return chained_starts_in_segment_;
191 }
192
195 uint32_t fixups_version() const {
196 return fixups_version_;
197 }
198 void fixups_version(uint32_t version) {
199 fixups_version_ = version;
200 }
201
203 uint32_t starts_offset() const {
204 return starts_offset_;
205 }
206 void starts_offset(uint32_t offset) {
207 starts_offset_ = offset;
208 }
209
211 uint32_t imports_offset() const {
212 return imports_offset_;
213 }
214 void imports_offset(uint32_t offset) {
215 imports_offset_ = offset;
216 }
217
219 uint32_t symbols_offset() const {
220 return symbols_offset_;
221 }
222 void symbols_offset(uint32_t offset) {
223 symbols_offset_ = offset;
224 }
225
227 uint32_t imports_count() const {
228 return imports_count_;
229 }
230 void imports_count(uint32_t cnt) {
231 imports_count_ = cnt;
232 }
233
239 uint32_t symbols_format() const {
240 return symbols_format_;
241 }
242 void symbols_format(uint32_t fmt) {
243 symbols_format_ = fmt;
244 }
245
248 return imports_format_;
249 }
251 imports_format_ = fmt;
252 }
253
255 chained_starts_in_segment_.push_back(std::move(start_info));
256 return chained_starts_in_segment_.back();
257 }
258
259 void accept(Visitor& visitor) const override;
260
261 std::ostream& print(std::ostream& os) const override;
262
263 static bool classof(const LoadCommand* cmd) {
265 }
266
267 private:
268 LIEF_LOCAL void update_with(const details::dyld_chained_fixups_header& header);
269 LIEF_LOCAL DyldChainedFixups& operator=(const DyldChainedFixups& other);
271
272 uint32_t data_offset_ = 0;
273 uint32_t data_size_ = 0;
274
275 // Raw payload of the DyldChainedFixups.
276 // This payload is located in the __LINKEDIT segment
277 span<uint8_t> content_;
278
279 uint32_t fixups_version_ = 0;
280 uint32_t starts_offset_ = 0;
281 uint32_t imports_offset_ = 0;
282 uint32_t symbols_offset_ = 0;
283 uint32_t imports_count_ = 0;
284 uint32_t symbols_format_ = 0;
286
287 chained_starts_in_segments_t chained_starts_in_segment_;
288
289 std::vector<std::unique_ptr<ChainedBindingInfoList>> internal_bindings_;
290 binding_info_t all_bindings_;
291};
292
293}
294}
295#endif
Class used to parse a single binary (i.e. non-FAT).
Definition BinaryParser.hpp:79
Class which represents a MachO binary.
Definition MachO/Binary.hpp:91
Definition BindingInfoIterator.hpp:32
Class used to rebuild a Mach-O file.
Definition MachO/Builder.hpp:64
This class represents a symbol binding operation associated with the LC_DYLD_CHAINED_FIXUPS command.
Definition ChainedBindingInfo.hpp:48
Definition DyldChainedFixupsCreator.hpp:41
Class that represents the LC_DYLD_CHAINED_FIXUPS command.
Definition DyldChainedFixups.hpp:50
uint32_t data_offset() const
Offset of the LC_DYLD_CHAINED_FIXUPS chained payload. This offset should point in the __LINKEDIT segm...
Definition DyldChainedFixups.hpp:152
it_const_binding_info bindings() const
Iterator over the bindings (ChainedBindingInfo) associated with this command.
Definition DyldChainedFixups.hpp:179
friend class BindingInfoIterator
Definition DyldChainedFixups.hpp:54
void imports_count(uint32_t cnt)
Definition DyldChainedFixups.hpp:230
void starts_offset(uint32_t offset)
Definition DyldChainedFixups.hpp:206
it_binding_info bindings()
Iterator over the bindings (ChainedBindingInfo) associated with this command.
Definition DyldChainedFixups.hpp:174
it_chained_starts_in_segments_t chained_starts_in_segments()
Iterator over the chained fixup metadata.
Definition DyldChainedFixups.hpp:184
it_const_chained_starts_in_segments_t chained_starts_in_segments() const
Definition DyldChainedFixups.hpp:189
friend class BinaryParser
Definition DyldChainedFixups.hpp:51
void data_size(uint32_t size)
Definition DyldChainedFixups.hpp:164
const_ref_iterator< const chained_starts_in_segments_t & > it_const_chained_starts_in_segments_t
Iterator that outputs const chained_starts_in_segment&.
Definition DyldChainedFixups.hpp:128
uint32_t data_size() const
Size of the LC_DYLD_CHAINED_FIXUPS payload.
Definition DyldChainedFixups.hpp:157
uint32_t symbols_offset() const
Offset of symbol strings in chain data.
Definition DyldChainedFixups.hpp:219
chained_starts_in_segment & add(chained_starts_in_segment start_info)
Definition DyldChainedFixups.hpp:254
void data_offset(uint32_t offset)
Definition DyldChainedFixups.hpp:161
uint32_t symbols_format() const
The compression algorithm (if any) used to store the symbols 0 means uncompressed while 1 means zlib ...
Definition DyldChainedFixups.hpp:239
friend class DyldChainedFixupsCreator
Definition DyldChainedFixups.hpp:56
ref_iterator< binding_info_t &, ChainedBindingInfo * > it_binding_info
Iterator which outputs DyldBindingInfo&.
Definition DyldChainedFixups.hpp:135
std::vector< chained_starts_in_segment > chained_starts_in_segments_t
Internal container for storing chained_starts_in_segment.
Definition DyldChainedFixups.hpp:121
span< const uint8_t > payload() const
Return the raw content of the command.
Definition DyldChainedFixups.hpp:169
friend class Builder
Definition DyldChainedFixups.hpp:52
uint32_t fixups_version() const
Chained fixups version. The loader (dyld v852.2) checks that this value is set to 0.
Definition DyldChainedFixups.hpp:195
const_ref_iterator< const binding_info_t &, ChainedBindingInfo * > it_const_binding_info
Iterator which outputs const DyldBindingInfo&.
Definition DyldChainedFixups.hpp:138
uint32_t imports_offset() const
Offset of imports table in chain data.
Definition DyldChainedFixups.hpp:211
uint32_t imports_count() const
Number of imported symbol names.
Definition DyldChainedFixups.hpp:227
friend class Binary
Definition DyldChainedFixups.hpp:55
friend class LinkEdit
Definition DyldChainedFixups.hpp:53
DYLD_CHAINED_FORMAT imports_format() const
The format of the imports (ChainedBindingInfo).
Definition DyldChainedFixups.hpp:247
void symbols_format(uint32_t fmt)
Definition DyldChainedFixups.hpp:242
void imports_format(DYLD_CHAINED_FORMAT fmt)
Definition DyldChainedFixups.hpp:250
void accept(Visitor &visitor) const override
ref_iterator< chained_starts_in_segments_t & > it_chained_starts_in_segments_t
Iterator that outputs chained_starts_in_segment&.
Definition DyldChainedFixups.hpp:124
std::unique_ptr< LoadCommand > clone() const override
Definition DyldChainedFixups.hpp:144
void imports_offset(uint32_t offset)
Definition DyldChainedFixups.hpp:214
std::ostream & print(std::ostream &os) const override
void fixups_version(uint32_t version)
Definition DyldChainedFixups.hpp:198
void symbols_offset(uint32_t offset)
Definition DyldChainedFixups.hpp:222
std::vector< std::unique_ptr< ChainedBindingInfo > > binding_info_t
Internal container for storing DyldBindingInfo.
Definition DyldChainedFixups.hpp:132
static bool classof(const LoadCommand *cmd)
Definition DyldChainedFixups.hpp:263
uint32_t starts_offset() const
offset of dyld_chained_starts_in_image in chain_data
Definition DyldChainedFixups.hpp:203
DyldChainedFixups(const details::linkedit_data_command &cmd)
Definition LinkEdit.hpp:47
uint32_t size() const
Size of the command (should be greater than sizeof(load_command)).
Definition LoadCommand.hpp:137
LoadCommand::TYPE command() const
Command type.
Definition LoadCommand.hpp:132
@ DYLD_CHAINED_FIXUPS
Definition LoadCommand.hpp:101
Class which represents a LoadCommand::TYPE::SEGMENT / LoadCommand::TYPE::SEGMENT_64 command.
Definition SegmentCommand.hpp:53
Definition Visitor.hpp:212
Iterator which returns reference on container's values.
Definition iterators.hpp:47
#define LIEF_LIFETIMEBOUND
Definition compiler_attributes.hpp:72
Definition endianness_support.hpp:60
Namespace related to the LIEF's Mach-O module.
Definition Abstract/Header.hpp:36
DYLD_CHAINED_FORMAT
Definition DyldChainedFormat.hpp:22
@ IMPORT
Originally: DYLD_CHAINED_IMPORT.
Definition DyldChainedFormat.hpp:24
DYLD_CHAINED_PTR_FORMAT
Definition DyldChainedFormat.hpp:34
@ NONE
Definition DyldChainedFormat.hpp:35
LIEF namespace.
Definition Abstract/Binary.hpp:41
tcb::span< ElementType, Extent > span
Definition span.hpp:22
lief_version_t version()
Return the current version.
ref_iterator< CT, U, typename decay_t< CT >::const_iterator > const_ref_iterator
Iterator which returns a const ref on container's values.
Definition iterators.hpp:322
Structure that mirrors the raw dyld_chained_starts_in_segment which aims at providing information abo...
Definition DyldChainedFixups.hpp:64
std::vector< uint16_t > chain_starts
Currently not supported.
Definition DyldChainedFixups.hpp:96
uint16_t page_size
Likely 0x1000 for x86/x86_64 architectures and 0x4000 for ARM64 architecture.
Definition DyldChainedFixups.hpp:74
uint64_t segment_offset
Offset of the segment's data from the beginning of the file (it should match SegmentCommand::file_off...
Definition DyldChainedFixups.hpp:78
friend class BinaryParser
Definition DyldChainedFixups.hpp:110
DYLD_CHAINED_PTR_FORMAT pointer_format
How pointers are encoded.
Definition DyldChainedFixups.hpp:84
friend std::ostream & operator<<(std::ostream &os, const chained_starts_in_segment &info)
friend class DyldChainedFixupsCreator
Definition DyldChainedFixups.hpp:111
uint32_t max_valid_pointer
for 32-bit OS, any value beyond this is not a pointer
Definition DyldChainedFixups.hpp:81
SegmentCommand & segment
Segment in which the rebase/bind fixups take place.
Definition DyldChainedFixups.hpp:99
std::vector< uint16_t > page_start
Offset in the SegmentCommand of the first element of the chain.
Definition DyldChainedFixups.hpp:93
static chained_starts_in_segment create_empty_chained(SegmentCommand &segment)
Definition DyldChainedFixups.hpp:105
uint32_t offset
Original offset of the structure, relative to DyldChainedFixups::starts_offset.
Definition DyldChainedFixups.hpp:67
size_t page_count() const
How many pages are in the page_start array.
Definition DyldChainedFixups.hpp:87
uint32_t size
sizeof(size) + sizeof(page_size) + ... + sizeof(pointer_format)
Definition DyldChainedFixups.hpp:70
#define LIEF_API
Definition visibility.h:45
#define LIEF_LOCAL
Definition visibility.h:46