LIEF: Library to Instrument Executable Formats Version 0.17.0
Loading...
Searching...
No Matches
LoadCommand.hpp
Go to the documentation of this file.
1/* Copyright 2017 - 2025 R. Thomas
2 * Copyright 2017 - 2025 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_LOAD_COMMAND_H
17#define LIEF_MACHO_LOAD_COMMAND_H
18
19#include <memory>
20#include <vector>
21
22#include "LIEF/Object.hpp"
23#include "LIEF/visibility.h"
24#include "LIEF/span.hpp"
25
26namespace LIEF {
27namespace MachO {
28class Builder;
29class BinaryParser;
30class Binary;
31
32namespace details {
33struct load_command;
34}
35
37class LIEF_API LoadCommand : public Object {
38 friend class Builder;
39 friend class BinaryParser;
40 friend class Binary;
41 public:
42 using raw_t = std::vector<uint8_t>;
43
44 enum class TYPE: uint64_t {
46 SEGMENT = 0x00000001u,
47 SYMTAB = 0x00000002u,
48 SYMSEG = 0x00000003u,
49 THREAD = 0x00000004u,
50 UNIXTHREAD = 0x00000005u,
51 LOADFVMLIB = 0x00000006u,
52 IDFVMLIB = 0x00000007u,
53 IDENT = 0x00000008u,
54 FVMFILE = 0x00000009u,
55 PREPAGE = 0x0000000Au,
56 DYSYMTAB = 0x0000000Bu,
57 LOAD_DYLIB = 0x0000000Cu,
58 ID_DYLIB = 0x0000000Du,
59 LOAD_DYLINKER = 0x0000000Eu,
60 ID_DYLINKER = 0x0000000Fu,
61 PREBOUND_DYLIB = 0x00000010u,
62 ROUTINES = 0x00000011u,
63 SUB_FRAMEWORK = 0x00000012u,
64 SUB_UMBRELLA = 0x00000013u,
65 SUB_CLIENT = 0x00000014u,
66 SUB_LIBRARY = 0x00000015u,
67 TWOLEVEL_HINTS = 0x00000016u,
68 PREBIND_CKSUM = 0x00000017u,
69 LOAD_WEAK_DYLIB = 0x80000018u,
70 SEGMENT_64 = 0x00000019u,
71 ROUTINES_64 = 0x0000001Au,
72 UUID = 0x0000001Bu,
73 RPATH = 0x8000001Cu,
74 CODE_SIGNATURE = 0x0000001Du,
75 SEGMENT_SPLIT_INFO = 0x0000001Eu,
76 REEXPORT_DYLIB = 0x8000001Fu,
77 LAZY_LOAD_DYLIB = 0x00000020u,
78 ENCRYPTION_INFO = 0x00000021u,
79 DYLD_INFO = 0x00000022u,
80 DYLD_INFO_ONLY = 0x80000022u,
81 LOAD_UPWARD_DYLIB = 0x80000023u,
82 VERSION_MIN_MACOSX = 0x00000024u,
83 VERSION_MIN_IPHONEOS = 0x00000025u,
84 FUNCTION_STARTS = 0x00000026u,
85 DYLD_ENVIRONMENT = 0x00000027u,
86 MAIN = 0x80000028u,
87 DATA_IN_CODE = 0x00000029u,
88 SOURCE_VERSION = 0x0000002Au,
89 DYLIB_CODE_SIGN_DRS = 0x0000002Bu,
90 ENCRYPTION_INFO_64 = 0x0000002Cu,
91 LINKER_OPTION = 0x0000002Du,
93 VERSION_MIN_TVOS = 0x0000002Fu,
94 VERSION_MIN_WATCHOS = 0x00000030u,
95 NOTE = 0x00000031u,
96 BUILD_VERSION = 0x00000032u,
97 DYLD_EXPORTS_TRIE = 0x80000033u,
98 DYLD_CHAINED_FIXUPS = 0x80000034u,
99 FILESET_ENTRY = 0x80000035u,
100 ATOM_INFO = 0x00000036u,
101 FUNCTION_VARIANTS = 0x00000037u,
103 TARGET_TRIPLE = 0x00000039u,
104
105 LIEF_UNKNOWN = 0xffee0001u
106 };
107
108 public:
109 LoadCommand() = default;
110 LoadCommand(const details::load_command& command);
112 command_(type),
113 size_(size)
114 {}
115
116 LoadCommand& operator=(const LoadCommand& copy) = default;
117 LoadCommand(const LoadCommand& copy) = default;
118
119 void swap(LoadCommand& other) noexcept;
120
121 virtual std::unique_ptr<LoadCommand> clone() const {
122 return std::unique_ptr<LoadCommand>(new LoadCommand(*this));
123 }
124
125 ~LoadCommand() override = default;
126
129 return command_;
130 }
131
133 uint32_t size() const {
134 return size_;
135 }
136
139 return original_data_;
140 }
141
143 uint64_t command_offset() const {
144 return command_offset_;
145 }
146
148 original_data_ = std::move(data);
149 }
150
152 command_ = command;
153 }
154
155 void size(uint32_t size) {
156 size_ = size;
157 }
158
159 void command_offset(uint64_t offset) {
160 command_offset_ = offset;
161 }
162
163 virtual std::ostream& print(std::ostream& os) const;
164
165 void accept(Visitor& visitor) const override;
166
167 static bool is_linkedit_data(const LoadCommand& cmd);
168
169 template<class T>
170 const T* cast() const {
171 static_assert(std::is_base_of<LoadCommand, T>::value,
172 "Require LoadCommand inheritance");
173 if (T::classof(this)) {
174 return static_cast<const T*>(this);
175 }
176 return nullptr;
177 }
178
179 template<class T>
180 T* cast() {
181 return const_cast<T*>(static_cast<const LoadCommand*>(this)->cast<T>());
182 }
183
184
185 LIEF_API friend
186 std::ostream& operator<<(std::ostream& os, const LoadCommand& cmd) {
187 return cmd.print(os);
188 }
189
190 protected:
191 raw_t original_data_;
193 uint32_t size_ = 0;
194 uint64_t command_offset_ = 0;
195};
196
198
199}
200}
201#endif
Class used to parse a single binary (i.e. non-FAT).
Definition BinaryParser.hpp:78
Class which represents a MachO binary.
Definition MachO/Binary.hpp:88
Class used to rebuild a Mach-O file.
Definition MachO/Builder.hpp:63
void command_offset(uint64_t offset)
Definition LoadCommand.hpp:159
void accept(Visitor &visitor) const override
virtual std::ostream & print(std::ostream &os) const
void data(raw_t data)
Definition LoadCommand.hpp:147
LoadCommand(const details::load_command &command)
friend std::ostream & operator<<(std::ostream &os, const LoadCommand &cmd)
Definition LoadCommand.hpp:186
uint32_t size() const
Size of the command (should be greather than sizeof(load_command)).
Definition LoadCommand.hpp:133
friend class BinaryParser
Definition LoadCommand.hpp:39
virtual std::unique_ptr< LoadCommand > clone() const
Definition LoadCommand.hpp:121
static bool is_linkedit_data(const LoadCommand &cmd)
void size(uint32_t size)
Definition LoadCommand.hpp:155
friend class Builder
Definition LoadCommand.hpp:38
LoadCommand::TYPE command() const
Command type.
Definition LoadCommand.hpp:128
span< const uint8_t > data() const
Raw command.
Definition LoadCommand.hpp:138
void command(LoadCommand::TYPE command)
Definition LoadCommand.hpp:151
void swap(LoadCommand &other) noexcept
friend class Binary
Definition LoadCommand.hpp:40
uint64_t command_offset() const
Offset of the command within the Load Command Table.
Definition LoadCommand.hpp:143
LoadCommand & operator=(const LoadCommand &copy)=default
~LoadCommand() override=default
const T * cast() const
Definition LoadCommand.hpp:170
TYPE
Definition LoadCommand.hpp:44
@ ID_DYLINKER
Definition LoadCommand.hpp:60
@ DYSYMTAB
Definition LoadCommand.hpp:56
@ PREBOUND_DYLIB
Definition LoadCommand.hpp:61
@ LOAD_DYLINKER
Definition LoadCommand.hpp:59
@ SYMTAB
Definition LoadCommand.hpp:47
@ ROUTINES
Definition LoadCommand.hpp:62
@ NOTE
Definition LoadCommand.hpp:95
@ LOADFVMLIB
Definition LoadCommand.hpp:51
@ DYLD_INFO
Definition LoadCommand.hpp:79
@ TWOLEVEL_HINTS
Definition LoadCommand.hpp:67
@ MAIN
Definition LoadCommand.hpp:86
@ LOAD_WEAK_DYLIB
Definition LoadCommand.hpp:69
@ SEGMENT_64
Definition LoadCommand.hpp:70
@ SOURCE_VERSION
Definition LoadCommand.hpp:88
@ DYLD_INFO_ONLY
Definition LoadCommand.hpp:80
@ FUNCTION_STARTS
Definition LoadCommand.hpp:84
@ DYLD_EXPORTS_TRIE
Definition LoadCommand.hpp:97
@ ATOM_INFO
Definition LoadCommand.hpp:100
@ ENCRYPTION_INFO
Definition LoadCommand.hpp:78
@ ENCRYPTION_INFO_64
Definition LoadCommand.hpp:90
@ VERSION_MIN_TVOS
Definition LoadCommand.hpp:93
@ DYLD_CHAINED_FIXUPS
Definition LoadCommand.hpp:98
@ SEGMENT
Definition LoadCommand.hpp:46
@ THREAD
Definition LoadCommand.hpp:49
@ UUID
Definition LoadCommand.hpp:72
@ SUB_CLIENT
Definition LoadCommand.hpp:65
@ DYLIB_CODE_SIGN_DRS
Definition LoadCommand.hpp:89
@ SYMSEG
Definition LoadCommand.hpp:48
@ UNKNOWN
Definition LoadCommand.hpp:45
@ LIEF_UNKNOWN
Definition LoadCommand.hpp:105
@ IDFVMLIB
Definition LoadCommand.hpp:52
@ LOAD_DYLIB
Definition LoadCommand.hpp:57
@ CODE_SIGNATURE
Definition LoadCommand.hpp:74
@ LINKER_OPTION
Definition LoadCommand.hpp:91
@ SEGMENT_SPLIT_INFO
Definition LoadCommand.hpp:75
@ VERSION_MIN_WATCHOS
Definition LoadCommand.hpp:94
@ DYLD_ENVIRONMENT
Definition LoadCommand.hpp:85
@ ID_DYLIB
Definition LoadCommand.hpp:58
@ FUNCTION_VARIANTS
Definition LoadCommand.hpp:101
@ UNIXTHREAD
Definition LoadCommand.hpp:50
@ PREBIND_CKSUM
Definition LoadCommand.hpp:68
@ SUB_UMBRELLA
Definition LoadCommand.hpp:64
@ FILESET_ENTRY
Definition LoadCommand.hpp:99
@ SUB_LIBRARY
Definition LoadCommand.hpp:66
@ DATA_IN_CODE
Definition LoadCommand.hpp:87
@ LOAD_UPWARD_DYLIB
Definition LoadCommand.hpp:81
@ SUB_FRAMEWORK
Definition LoadCommand.hpp:63
@ VERSION_MIN_MACOSX
Definition LoadCommand.hpp:82
@ TARGET_TRIPLE
Definition LoadCommand.hpp:103
@ VERSION_MIN_IPHONEOS
Definition LoadCommand.hpp:83
@ REEXPORT_DYLIB
Definition LoadCommand.hpp:76
@ LINKER_OPTIMIZATION_HINT
Definition LoadCommand.hpp:92
@ FVMFILE
Definition LoadCommand.hpp:54
@ RPATH
Definition LoadCommand.hpp:73
@ PREPAGE
Definition LoadCommand.hpp:55
@ FUNCTION_VARIANT_FIXUPS
Definition LoadCommand.hpp:102
@ IDENT
Definition LoadCommand.hpp:53
@ BUILD_VERSION
Definition LoadCommand.hpp:96
@ ROUTINES_64
Definition LoadCommand.hpp:71
@ LAZY_LOAD_DYLIB
Definition LoadCommand.hpp:77
T * cast()
Definition LoadCommand.hpp:180
LoadCommand(const LoadCommand &copy)=default
LoadCommand(LoadCommand::TYPE type, uint32_t size)
Definition LoadCommand.hpp:111
std::vector< uint8_t > raw_t
Definition LoadCommand.hpp:42
Definition Visitor.hpp:210
Definition endianness_support.hpp:59
Namespace related to the LIEF's Mach-O module.
Definition Abstract/Header.hpp:36
const char * to_string(BuildToolVersion::TOOLS tool)
LIEF namespace.
Definition Abstract/Binary.hpp:40
tcb::span< ElementType, Extent > span
Definition span.hpp:22
#define LIEF_API
Definition visibility.h:41