78 constexpr static size_t MAX_RELOCATIONS = (std::numeric_limits<uint16_t>::max)();
81 constexpr static size_t MAX_COMMANDS = (std::numeric_limits<uint16_t>::max)();
84 static std::unique_ptr<Binary> parse(
const std::string& file);
85 static std::unique_ptr<Binary> parse(
const std::string& file,
const ParserConfig& conf);
86 static std::unique_ptr<Binary> parse(
const std::vector<uint8_t>& data,
89 static std::unique_ptr<Binary> parse(
const std::vector<uint8_t>& data, uint64_t fat_offset,
92 static std::unique_ptr<Binary> parse(std::unique_ptr<BinaryStream> stream, uint64_t fat_offset,
101 using exports_list_t = std::vector<std::unique_ptr<ExportInfo>>;
106 template<
class MACHO_T>
109 template<
class MACHO_T>
112 template<
class MACHO_T>
115 template<
class MACHO_T>
123 template<
class MACHO_T>
128 template<
class MACHO_T>
131 template<
class MACHO_T>
134 template<
class MACHO_T>
137 template<
class MACHO_T>
140 using it_opaque_segments =
void*;
142 template<
class MACHO_T>
143 ok_error_t do_bind(DyldBindingInfo::CLASS cls, uint8_t type, uint8_t segment_idx,
144 uint64_t segment_offset,
const std::string& symbol_name,
145 int32_t ord, int64_t addend,
bool is_weak,
146 bool is_non_weak_definition, it_opaque_segments segments_ptr, uint64_t offset = 0);
149 template<
class MACHO_T>
150 ok_error_t do_rebase(uint8_t type, uint8_t segment_idx, uint64_t segment_offset,
151 it_opaque_segments segments);
157 template<
class MACHO_T>
160 template<
class MACHO_T>
161 ok_error_t parse_chained_import(
const details::dyld_chained_fixups_header& header,
163 template<
class MACHO_T>
164 ok_error_t parse_chained_fixup(
const details::dyld_chained_fixups_header& header,
167 template<
class MACHO_T>
169 uint64_t offset, uint32_t seg_idx);
171 template<
class MACHO_T>
172 ok_error_t do_fixup(DYLD_CHAINED_FORMAT fmt, int32_t ord,
const std::string& symbol_name,
173 int64_t addend,
bool is_weak);
175 template<
class MACHO_T>
177 const details::dyld_chained_starts_in_segment& seg_info);
179 template<
class MACHO_T>
180 result<uint64_t> next_chain(uint64_t chain_offset,
const details::dyld_chained_starts_in_segment& seg_info);
182 template<
class MACHO_T>
184 const details::dyld_chained_starts_in_segment& seg_info);
187 const details::dyld_chained_starts_in_segment& seg_info,
188 const details::dyld_chained_ptr_arm64e& fixup);
191 const details::dyld_chained_starts_in_segment& seg_info,
192 const details::dyld_chained_ptr_generic64& fixup);
195 const details::dyld_chained_starts_in_segment& seg_info,
196 const details::dyld_chained_ptr_generic32 & fixup);
198 template<
class MACHO_T>
201 template<
class MACHO_T>
204 template<
class MACHO_T>
207 template<
class MACHO_T>
210 template<
class MACHO_T>
213 template<
class MACHO_T>
216 template<
class MACHO_T>
219 template<
class MACHO_T>
222 template<
class MACHO_T>
232 ok_error_t parse_export_trie(exports_list_t& exports, uint64_t start,
233 uint64_t end,
const std::string& prefix,
234 bool* invalid_names);
238 std::unique_ptr<BinaryStream> stream_;
239 std::unique_ptr<Binary> binary_;
243 std::set<uint64_t> visited_;
244 std::map<std::string, Symbol*> memoized_symbols_;
245 std::map<uint64_t, Symbol*> memoized_symbols_by_address_;
247 std::vector<DylibCommand*> binding_libs_;
248 std::set<uint64_t> dyld_reloc_addrs_;