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