16#ifndef LIEF_MACHO_BINARY_PARSER_H
17#define LIEF_MACHO_BINARY_PARSER_H
24#include <unordered_map>
65struct dyld_chained_starts_in_segment;
66struct dyld_chained_fixups_header;
67union dyld_chained_ptr_arm64e;
68union dyld_chained_ptr_generic64;
69union dyld_chained_ptr_generic32;
70union dyld_chained_ptr_arm64e_segmented;
83 constexpr static size_t MAX_RELOCATIONS = (std::numeric_limits<uint16_t>::max)();
86 constexpr static size_t MAX_COMMANDS = (std::numeric_limits<uint16_t>::max)();
89 static std::unique_ptr<Binary>
parse(
const std::string& file);
90 static std::unique_ptr<Binary>
parse(
const std::string& file,
92 static std::unique_ptr<Binary>
93 parse(
const std::vector<uint8_t>& data,
96 static std::unique_ptr<Binary>
97 parse(
const std::vector<uint8_t>& data, uint64_t fat_offset,
100 static std::unique_ptr<Binary>
parse(std::unique_ptr<BinaryStream> stream,
110 using exports_list_t = std::vector<std::unique_ptr<ExportInfo>>;
115 template<
class MACHO_T>
118 template<
class MACHO_T>
121 template<
class MACHO_T>
124 template<
class MACHO_T>
132 template<
class MACHO_T>
137 template<
class MACHO_T>
140 template<
class MACHO_T>
143 template<
class MACHO_T>
146 template<
class MACHO_T>
149 template<
class MACHO_T>
152 template<
class MACHO_T>
157 std::vector<Symbol*>& symtab,
161 template<
class MACHO_T>
164 using it_opaque_segments =
167 template<
class MACHO_T>
169 uint8_t segment_idx, uint64_t segment_offset,
170 const std::string& symbol_name, int32_t ord,
171 int64_t addend,
bool is_weak,
172 bool is_non_weak_definition,
173 it_opaque_segments segments_ptr,
174 uint64_t offset = 0);
177 template<
class MACHO_T>
179 uint64_t segment_offset,
180 it_opaque_segments segments);
185 template<
class MACHO_T>
188 template<
class MACHO_T>
190 parse_chained_import(
const details::dyld_chained_fixups_header& header,
193 template<
class MACHO_T>
195 parse_chained_fixup(
const details::dyld_chained_fixups_header& header,
198 template<
class MACHO_T>
200 uint32_t seg_info_offset, uint64_t offset,
203 template<
class MACHO_T>
205 const std::string& symbol_name, int64_t addend,
208 template<
class MACHO_T>
211 uint64_t chain_offset,
212 const details::dyld_chained_starts_in_segment& seg_info);
214 template<
class MACHO_T>
216 next_chain(uint64_t& chain_address, uint64_t chain_offset,
217 const details::dyld_chained_starts_in_segment& seg_info);
219 template<
class MACHO_T>
222 uint64_t chain_offset,
223 const details::dyld_chained_starts_in_segment& seg_info);
227 uint32_t chain_offset,
228 const details::dyld_chained_starts_in_segment& seg_info,
229 const details::dyld_chained_ptr_arm64e& fixup);
233 uint32_t chain_offset,
234 const details::dyld_chained_starts_in_segment& seg_info,
235 const details::dyld_chained_ptr_generic64& fixup);
239 uint32_t chain_offset,
240 const details::dyld_chained_starts_in_segment& seg_info,
241 const details::dyld_chained_ptr_generic32& fixup);
245 uint32_t chain_offset,
246 const details::dyld_chained_starts_in_segment& seg_info,
247 const details::dyld_chained_ptr_arm64e_segmented& fixup);
249 template<
class MACHO_T>
252 template<
class MACHO_T>
255 template<
class MACHO_T>
258 template<
class MACHO_T>
261 template<
class MACHO_T>
264 template<
class MACHO_T>
267 template<
class MACHO_T>
270 template<
class MACHO_T>
273 template<
class MACHO_T>
276 template<
class MACHO_T>
279 template<
class MACHO_T>
282 template<
class MACHO_T>
294 const std::string& prefix,
295 bool* invalid_names);
299 std::unique_ptr<BinaryStream> stream_;
300 std::unique_ptr<Binary> binary_;
304 std::set<uint64_t> visited_;
305 std::unordered_map<std::string, Symbol*> memoized_symbols_;
306 std::map<uint64_t, Symbol*> memoized_symbols_by_address_;
308 std::vector<DylibCommand*> binding_libs_;
309 std::set<uint64_t> dyld_reloc_addrs_;
Class that is used to a read stream of data from different sources.
Definition BinaryStream.hpp:33
Class which represents the LC_ATOM_INFO command.
Definition AtomInfo.hpp:35
BinaryParser(const BinaryParser ©)=delete
BinaryParser & operator=(const BinaryParser ©)=delete
static std::unique_ptr< Binary > parse(std::unique_ptr< BinaryStream > stream, uint64_t fat_offset, const ParserConfig &conf)
static std::unique_ptr< Binary > parse(const std::vector< uint8_t > &data, uint64_t fat_offset, const ParserConfig &conf=ParserConfig::deep())
static std::unique_ptr< Binary > parse(const std::string &file)
static std::unique_ptr< Binary > parse(const std::string &file, const ParserConfig &conf)
static std::unique_ptr< Binary > parse(const std::vector< uint8_t > &data, const ParserConfig &conf=ParserConfig::deep())
This class represents a symbol binding operation associated with the LC_DYLD_CHAINED_FIXUPS command.
Definition ChainedBindingInfo.hpp:48
Definition CodeSignatureDir.hpp:36
Definition CodeSignature.hpp:37
Interface of the LC_DATA_IN_CODE command This command is used to list slices of code sections that co...
Definition DataInCode.hpp:42
CLASS
Definition DyldBindingInfo.hpp:39
Class that represents the LC_DYLD_CHAINED_FIXUPS command.
Definition DyldChainedFixups.hpp:49
Class which represents a library dependency.
Definition DylibCommand.hpp:34
Class that represents the LC_DYSYMTAB command.
Definition DynamicSymbolCommand.hpp:40
Class that provides an interface over the Dyld export info.
Definition ExportInfo.hpp:38
Class which represents the LC_FUNCTION_STARTS command.
Definition FunctionStarts.hpp:39
Class which represents the LC_FUNCTION_VARIANT_FIXUPS command.
Definition FunctionVariantFixups.hpp:34
Class representing the LC_FUNCTION_VARIANTS load command.
Definition FunctionVariants.hpp:59
Class which represents the LC_LINKER_OPTIMIZATION_HINT command.
Definition LinkerOptHint.hpp:37
The main interface to parse a Mach-O binary.
Definition MachO/Parser.hpp:42
Class that represents a Mach-O section.
Definition MachO/Section.hpp:47
Class which represents a LoadCommand::TYPE::SEGMENT / LoadCommand::TYPE::SEGMENT_64 command.
Definition SegmentCommand.hpp:51
Class that represents the LoadCommand::TYPE::SEGMENT_SPLIT_INFO command.
Definition SegmentSplitInfo.hpp:35
Class that represents the LC_SYMTAB command.
Definition SymbolCommand.hpp:35
Class that represents a Symbol in a Mach-O file.
Definition MachO/Symbol.hpp:47
Class which represents the LC_TWOLEVEL_HINTS command.
Definition TwoLevelHints.hpp:39
Main interface to parse an executable regardless of its format.
Definition Abstract/Parser.hpp:30
Definition SpanStream.hpp:32
Opaque structure that is used by LIEF to avoid writing result<void> f(...). Instead,...
Definition errors.hpp:114
Wrapper that contains an Object (T) or an error.
Definition errors.hpp:77
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
MACHO_TYPES
Definition MachO/enums.hpp:23
@ MAGIC_64
64-bit big-endian magic
Definition MachO/enums.hpp:27
LIEF namespace.
Definition Abstract/Binary.hpp:40
This structure is used to tweak the MachO Parser (MachO::Parser).
Definition MachO/ParserConfig.hpp:24
static ParserConfig deep()
Return a parser configuration such as all the objects supported by LIEF are parsed.
#define LIEF_API
Definition visibility.h:43
#define LIEF_LOCAL
Definition visibility.h:44