16#ifndef LIEF_MACHO_BINARY_PARSER_H
17#define LIEF_MACHO_BINARY_PARSER_H
24#include <unordered_map>
66struct dyld_chained_starts_in_segment;
67struct dyld_chained_fixups_header;
68union dyld_chained_ptr_arm64e;
69union dyld_chained_ptr_generic64;
70union dyld_chained_ptr_generic32;
71union dyld_chained_ptr_arm64e_segmented;
84 constexpr static size_t MAX_RELOCATIONS = (std::numeric_limits<uint16_t>::max)();
87 constexpr static size_t MAX_COMMANDS = (std::numeric_limits<uint16_t>::max)();
90 static std::unique_ptr<Binary>
parse(
const std::string& file);
91 static std::unique_ptr<Binary>
parse(
const std::string& file,
93 static std::unique_ptr<Binary>
94 parse(
const std::vector<uint8_t>& data,
97 static std::unique_ptr<Binary>
98 parse(
const std::vector<uint8_t>& data, uint64_t fat_offset,
101 static std::unique_ptr<Binary>
parse(std::unique_ptr<BinaryStream> stream,
111 using exports_list_t = std::vector<std::unique_ptr<ExportInfo>>;
116 template<
class MACHO_T>
119 template<
class MACHO_T>
122 template<
class MACHO_T>
125 template<
class MACHO_T>
133 template<
class MACHO_T>
138 template<
class MACHO_T>
141 template<
class MACHO_T>
144 template<
class MACHO_T>
147 template<
class MACHO_T>
150 template<
class MACHO_T>
153 template<
class MACHO_T>
158 std::vector<Symbol*>& symtab,
162 template<
class MACHO_T>
165 using it_opaque_segments =
168 template<
class MACHO_T>
170 uint8_t segment_idx, uint64_t segment_offset,
171 const std::string& symbol_name, int32_t ord,
172 int64_t addend,
bool is_weak,
173 bool is_non_weak_definition,
174 it_opaque_segments segments_ptr,
175 uint64_t offset = 0);
178 template<
class MACHO_T>
180 uint64_t segment_offset,
181 it_opaque_segments segments);
186 template<
class MACHO_T>
189 template<
class MACHO_T>
191 parse_chained_import(
const details::dyld_chained_fixups_header& header,
194 template<
class MACHO_T>
196 parse_chained_fixup(
const details::dyld_chained_fixups_header& header,
199 template<
class MACHO_T>
201 uint32_t seg_info_offset, uint64_t offset,
204 template<
class MACHO_T>
206 const std::string& symbol_name, int64_t addend,
209 template<
class MACHO_T>
212 uint64_t chain_offset,
213 const details::dyld_chained_starts_in_segment& seg_info);
215 template<
class MACHO_T>
217 next_chain(uint64_t& chain_address, uint64_t chain_offset,
218 const details::dyld_chained_starts_in_segment& seg_info);
220 template<
class MACHO_T>
223 uint64_t chain_offset,
224 const details::dyld_chained_starts_in_segment& seg_info);
228 uint32_t chain_offset,
229 const details::dyld_chained_starts_in_segment& seg_info,
230 const details::dyld_chained_ptr_arm64e& fixup);
234 uint32_t chain_offset,
235 const details::dyld_chained_starts_in_segment& seg_info,
236 const details::dyld_chained_ptr_generic64& fixup);
240 uint32_t chain_offset,
241 const details::dyld_chained_starts_in_segment& seg_info,
242 const details::dyld_chained_ptr_generic32& fixup);
246 uint32_t chain_offset,
247 const details::dyld_chained_starts_in_segment& seg_info,
248 const details::dyld_chained_ptr_arm64e_segmented& fixup);
250 template<
class MACHO_T>
253 template<
class MACHO_T>
256 template<
class MACHO_T>
259 template<
class MACHO_T>
262 template<
class MACHO_T>
265 template<
class MACHO_T>
268 template<
class MACHO_T>
271 template<
class MACHO_T>
274 template<
class MACHO_T>
277 template<
class MACHO_T>
280 template<
class MACHO_T>
283 template<
class MACHO_T>
286 template<
class MACHO_T>
298 const std::string& prefix,
300 bool* invalid_names);
304 std::unique_ptr<BinaryStream> stream_;
305 std::unique_ptr<Binary> binary_;
309 std::set<uint64_t> visited_;
310 std::unordered_map<std::string, Symbol*> memoized_symbols_;
311 std::map<uint64_t, Symbol*> memoized_symbols_by_address_;
313 std::vector<DylibCommand*> binding_libs_;
314 std::set<uint64_t> dyld_reloc_addrs_;
Class that is used to a read stream of data from different sources.
Definition BinaryStream.hpp:34
Class which represents the LC_ATOM_INFO command.
Definition AtomInfo.hpp:36
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:37
Definition CodeSignature.hpp:38
Interface of the LC_DATA_IN_CODE command This command is used to list slices of code sections that co...
Definition DataInCode.hpp:43
CLASS
Definition DyldBindingInfo.hpp:39
Class that represents the LC_DYLD_CHAINED_FIXUPS command.
Definition DyldChainedFixups.hpp:50
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:40
Class which represents the LC_FUNCTION_VARIANT_FIXUPS command.
Definition FunctionVariantFixups.hpp:60
Class representing the LC_FUNCTION_VARIANTS load command.
Definition FunctionVariants.hpp:69
Class representing the LC_LAZY_LOAD_DYLIB_INFO load command.
Definition LazyLoadDylibInfo.hpp:49
Class which represents the LC_LINKER_OPTIMIZATION_HINT command.
Definition LinkerOptHint.hpp:38
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:48
Class which represents a LoadCommand::TYPE::SEGMENT / LoadCommand::TYPE::SEGMENT_64 command.
Definition SegmentCommand.hpp:52
Class that represents the LoadCommand::TYPE::SEGMENT_SPLIT_INFO command.
Definition SegmentSplitInfo.hpp:36
Class that represents the LC_SYMTAB command.
Definition SymbolCommand.hpp:36
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:40
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:118
Wrapper that contains an Object (T) or an error.
Definition errors.hpp:78
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:41
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:45
#define LIEF_LOCAL
Definition visibility.h:46