LIEF: Library to Instrument Executable Formats Version 1.0.0
Loading...
Searching...
No Matches
FunctionVariantFixups.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_FUNCTION_VARIANT_FIXUPS_COMMAND_H
17#define LIEF_MACHO_FUNCTION_VARIANT_FIXUPS_COMMAND_H
18#include <vector>
19#include <ostream>
20
21#include "LIEF/visibility.h"
22#include "LIEF/span.hpp"
23#include "LIEF/iterators.hpp"
24
26
27namespace LIEF {
28class SpanStream;
29
30namespace MachO {
31class BinaryParser;
32class LinkEdit;
33class SegmentCommand;
34
35namespace details {
36struct linkedit_data_command;
37
38// clang-format off
39//
40// On-disk entry of a `LC_FUNCTION_VARIANT_FIXUPS` payload
41// (mirror of dyld's `FunctionVariantFixups::InternalFixup`)
51// clang-format on
52}
53
61 friend class BinaryParser;
62 friend class LinkEdit;
63
64 public:
70 public:
71 Fixup() = default;
72 Fixup(uint32_t seg_offset, uint32_t seg_index, uint32_t variant_index,
73 bool pac_auth, bool pac_address, uint8_t pac_key,
74 uint16_t pac_diversity) :
75 seg_offset_(seg_offset),
76 seg_index_(seg_index),
77 variant_index_(variant_index),
78 pac_auth_(pac_auth),
79 pac_address_(pac_address),
80 pac_key_(pac_key),
81 pac_diversity_(pac_diversity) {}
82
84
85 Fixup(const Fixup&) = default;
86 Fixup& operator=(const Fixup&) = default;
87
88 Fixup(Fixup&&) noexcept = default;
89 Fixup& operator=(Fixup&&) noexcept = default;
90
91 ~Fixup() = default;
92
95 uint32_t seg_offset() const {
96 return seg_offset_;
97 }
98
100 uint32_t seg_index() const {
101 return seg_index_;
102 }
103
105 uint32_t variant_index() const {
106 return variant_index_;
107 }
108
110 bool pac_auth() const {
111 return pac_auth_;
112 }
113
116 bool pac_address() const {
117 return pac_address_;
118 }
119
121 uint8_t pac_key() const {
122 return pac_key_;
123 }
124
126 uint16_t pac_diversity() const {
127 return pac_diversity_;
128 }
129
132 return segment_;
133 }
134
135 const SegmentCommand* segment() const {
136 return segment_;
137 }
138
139 void seg_offset(uint32_t value) {
140 seg_offset_ = value;
141 }
142
143 void seg_index(uint32_t value) {
144 seg_index_ = value;
145 }
146
147 void variant_index(uint32_t value) {
148 variant_index_ = value;
149 }
150
151 void pac_auth(bool value) {
152 pac_auth_ = value;
153 }
154
155 void pac_address(bool value) {
156 pac_address_ = value;
157 }
158
159 void pac_key(uint8_t value) {
160 pac_key_ = value;
161 }
162
163 void pac_diversity(uint16_t value) {
164 pac_diversity_ = value;
165 }
166
168 segment_ = &seg;
169 }
170
171 std::string to_string() const;
172
173 LIEF_API friend std::ostream& operator<<(std::ostream& os,
174 const Fixup& fixup) {
175 os << fixup.to_string();
176 return os;
177 }
178
179 private:
180 uint32_t seg_offset_ = 0;
181 uint32_t seg_index_ = 0;
182 uint32_t variant_index_ = 0;
183 bool pac_auth_ = false;
184 bool pac_address_ = false;
185 uint8_t pac_key_ = 0;
186 uint16_t pac_diversity_ = 0;
187 SegmentCommand* segment_ = nullptr;
188 };
189
190 using fixups_t = std::vector<Fixup>;
191
194
197
199
201 FunctionVariantFixups& operator=(FunctionVariantFixups&&) noexcept = default;
202
203 FunctionVariantFixups(const details::linkedit_data_command& cmd);
204
205 FunctionVariantFixups& operator=(const FunctionVariantFixups& copy) = default;
207
208 std::unique_ptr<LoadCommand> clone() const override {
209 return std::unique_ptr<FunctionVariantFixups>(
210 new FunctionVariantFixups(*this)
211 );
212 }
213
215 uint32_t data_offset() const {
216 return data_offset_;
217 }
218
220 uint32_t data_size() const {
221 return data_size_;
222 }
223
224 void data_offset(uint32_t offset) {
225 data_offset_ = offset;
226 }
227
228 void data_size(uint32_t size) {
229 data_size_ = size;
230 }
231
235 return content_;
236 }
237
239 return content_;
240 }
241
244 return fixups_;
245 }
246
248 return fixups_;
249 }
250
253 fixups_.push_back(fixup);
254 return *this;
255 }
256
257 ~FunctionVariantFixups() override = default;
258
259 std::ostream& print(std::ostream& os) const override;
260
261 static bool classof(const LoadCommand* cmd) {
263 }
264
265 LIEF_LOCAL static std::vector<Fixup> parse_payload(SpanStream& stream);
266
267 private:
268 uint32_t data_offset_ = 0;
269 uint32_t data_size_ = 0;
270 span<uint8_t> content_;
271 std::vector<Fixup> fixups_;
272};
273
274}
275}
276#endif
Class used to parse a single binary (i.e. non-FAT).
Definition BinaryParser.hpp:79
A single relocation associated with a function-variant. It mirrors the FunctionVariantFixups::Interna...
Definition FunctionVariantFixups.hpp:69
uint32_t variant_index() const
Index of the FunctionVariants runtime table used to resolve the slot.
Definition FunctionVariantFixups.hpp:105
uint8_t pac_key() const
Pointer-authentication key used to sign the slot.
Definition FunctionVariantFixups.hpp:121
void segment(SegmentCommand &seg)
Definition FunctionVariantFixups.hpp:167
Fixup(const details::function_variant_fixup_t &raw)
uint32_t seg_offset() const
Offset of the slot to fix up, relative to the segment designated by seg_index().
Definition FunctionVariantFixups.hpp:95
void pac_key(uint8_t value)
Definition FunctionVariantFixups.hpp:159
void seg_index(uint32_t value)
Definition FunctionVariantFixups.hpp:143
void pac_address(bool value)
Definition FunctionVariantFixups.hpp:155
SegmentCommand * segment()
SegmentCommand referenced by seg_index() if it could be resolved.
Definition FunctionVariantFixups.hpp:131
void pac_auth(bool value)
Definition FunctionVariantFixups.hpp:151
Fixup & operator=(const Fixup &)=default
Fixup(Fixup &&) noexcept=default
uint32_t seg_index() const
Index of the segment that owns the slot to fix up.
Definition FunctionVariantFixups.hpp:100
uint16_t pac_diversity() const
Pointer-authentication diversity (discriminator) of the slot.
Definition FunctionVariantFixups.hpp:126
friend std::ostream & operator<<(std::ostream &os, const Fixup &fixup)
Definition FunctionVariantFixups.hpp:173
void variant_index(uint32_t value)
Definition FunctionVariantFixups.hpp:147
Fixup(uint32_t seg_offset, uint32_t seg_index, uint32_t variant_index, bool pac_auth, bool pac_address, uint8_t pac_key, uint16_t pac_diversity)
Definition FunctionVariantFixups.hpp:72
bool pac_auth() const
Whether the slot is signed with pointer authentication (arm64e).
Definition FunctionVariantFixups.hpp:110
void pac_diversity(uint16_t value)
Definition FunctionVariantFixups.hpp:163
const SegmentCommand * segment() const
Definition FunctionVariantFixups.hpp:135
bool pac_address() const
Whether the pointer-authentication signature mixes the storage address (address diversity).
Definition FunctionVariantFixups.hpp:116
void seg_offset(uint32_t value)
Definition FunctionVariantFixups.hpp:139
static bool classof(const LoadCommand *cmd)
Definition FunctionVariantFixups.hpp:261
void data_offset(uint32_t offset)
Definition FunctionVariantFixups.hpp:224
FunctionVariantFixups & add(Fixup fixup)
Append a new Fixup.
Definition FunctionVariantFixups.hpp:252
friend class BinaryParser
Definition FunctionVariantFixups.hpp:61
uint32_t data_size() const
Size of the payload.
Definition FunctionVariantFixups.hpp:220
it_fixups fixups()
Iterator over the different Fixup entries.
Definition FunctionVariantFixups.hpp:243
void data_size(uint32_t size)
Definition FunctionVariantFixups.hpp:228
static std::vector< Fixup > parse_payload(SpanStream &stream)
FunctionVariantFixups(FunctionVariantFixups &&) noexcept=default
ref_iterator< fixups_t & > it_fixups
Iterator that outputs Fixup&.
Definition FunctionVariantFixups.hpp:193
uint32_t data_offset() const
Offset in the __LINKEDIT SegmentCommand where the payload starts.
Definition FunctionVariantFixups.hpp:215
std::ostream & print(std::ostream &os) const override
friend class LinkEdit
Definition FunctionVariantFixups.hpp:62
~FunctionVariantFixups() override=default
span< uint8_t > content()
Definition FunctionVariantFixups.hpp:238
span< const uint8_t > content() const
Return the data slice in the __LINKEDIT segment referenced by data_offset and data_size.
Definition FunctionVariantFixups.hpp:234
std::unique_ptr< LoadCommand > clone() const override
Definition FunctionVariantFixups.hpp:208
it_const_fixups fixups() const
Definition FunctionVariantFixups.hpp:247
std::vector< Fixup > fixups_t
Definition FunctionVariantFixups.hpp:190
const_ref_iterator< const fixups_t & > it_const_fixups
Iterator that outputs const Fixup&.
Definition FunctionVariantFixups.hpp:196
Definition LinkEdit.hpp:47
uint32_t size() const
Size of the command (should be greater than sizeof(load_command)).
Definition LoadCommand.hpp:135
LoadCommand::TYPE command() const
Command type.
Definition LoadCommand.hpp:130
@ FUNCTION_VARIANT_FIXUPS
Definition LoadCommand.hpp:104
Class which represents a LoadCommand::TYPE::SEGMENT / LoadCommand::TYPE::SEGMENT_64 command.
Definition SegmentCommand.hpp:52
Definition SpanStream.hpp:32
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
LIEF namespace.
Definition Abstract/Binary.hpp:41
tcb::span< ElementType, Extent > span
Definition span.hpp:22
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:320
Definition FunctionVariantFixups.hpp:42
uint32_t pac_auth
Definition FunctionVariantFixups.hpp:46
uint32_t pac_diversity
Definition FunctionVariantFixups.hpp:49
uint32_t variant_index
Definition FunctionVariantFixups.hpp:45
uint32_t seg_index
Definition FunctionVariantFixups.hpp:44
uint32_t pac_address
Definition FunctionVariantFixups.hpp:47
uint32_t pac_key
Definition FunctionVariantFixups.hpp:48
uint32_t seg_offset
Definition FunctionVariantFixups.hpp:43
#define LIEF_API
Definition visibility.h:45
#define LIEF_LOCAL
Definition visibility.h:46