16#ifndef LIEF_MACHO_DYLD_INFO_COMMAND_H
17#define LIEF_MACHO_DYLD_INFO_COMMAND_H
47struct dyld_info_command;
61 using info_t = std::pair<uint32_t, uint32_t>;
101 SET_TYPE_IMM = 0x10u,
104 SET_SEGMENT_AND_OFFSET_ULEB = 0x20u,
106 ADD_ADDR_ULEB = 0x30u,
108 ADD_ADDR_IMM_SCALED = 0x40u,
111 DO_REBASE_IMM_TIMES = 0x50u,
114 DO_REBASE_ULEB_TIMES = 0x60u,
117 DO_REBASE_ADD_ADDR_ULEB = 0x70u,
119 DO_REBASE_ULEB_TIMES_SKIPPING_ULEB = 0x80u,
128 SET_DYLIB_ORDINAL_IMM = 0x10u,
131 SET_DYLIB_ORDINAL_ULEB = 0x20u,
134 SET_DYLIB_SPECIAL_IMM = 0x30u,
136 SET_SYMBOL_TRAILING_FLAGS_IMM = 0x40u,
138 SET_TYPE_IMM = 0x50u,
140 SET_ADDEND_SLEB = 0x60u,
143 SET_SEGMENT_AND_OFFSET_ULEB = 0x70u,
145 ADD_ADDR_ULEB = 0x80u,
149 DO_BIND_ADD_ADDR_ULEB = 0xA0u,
151 DO_BIND_ADD_ADDR_IMM_SCALED = 0xB0u,
154 DO_BIND_ULEB_TIMES_SKIPPING_ULEB = 0xC0u,
157 THREADED_APPLY = 0xD0u | 0x01u,
158 THREADED_SET_BIND_ORDINAL_TABLE_SIZE_ULEB = 0xD0u | 0x00u,
162 SET_BIND_ORDINAL_TABLE_SIZE_ULEB = 0x00u,
175 DyldInfo(
const details::dyld_info_command& dyld_info_cmd);
182 std::unique_ptr<LoadCommand>
clone()
const override {
183 return std::unique_ptr<DyldInfo>(
new DyldInfo(*
this));
207 return rebase_opcodes_;
210 return rebase_opcodes_;
239 return bind_opcodes_;
242 return bind_opcodes_;
274 return weak_bind_opcodes_;
277 return weak_bind_opcodes_;
306 return lazy_bind_opcodes_;
309 return lazy_bind_opcodes_;
320 return binding_info_;
324 return binding_info_;
396 rebase_ = {offset, std::get<1>(
rebase())};
403 bind_ = {offset, std::get<1>(
bind())};
406 bind_ = {std::get<0>(
bind()),
size};
410 weak_bind_ = {offset, std::get<1>(
weak_bind())};
417 lazy_bind_ = {offset, std::get<1>(
lazy_bind())};
435 std::ostream&
print(std::ostream& os)
const override;
444 using bind_container_t =
449 bool is_lazy =
false)
const;
451 LIEF_LOCAL void show_trie(std::ostream& output, std::string output_prefix,
453 const std::string& prefix)
const;
458 update_standard_bindings_v1(
const bind_container_t& bindings,
461 update_standard_bindings_v2(
const bind_container_t& bindings,
462 std::vector<RelocationDyld*> rebases,
472 details::dyld_info_command& cmd);
490 export_info_t export_info_;
491 binding_info_t binding_info_;
493 BINDING_ENCODING_VERSION binding_encoding_version_ =
494 BINDING_ENCODING_VERSION::UNKNOWN;
496 Binary* binary_ =
nullptr;
Class that is used to a read stream of data from different sources.
Definition BinaryStream.hpp:34
Class used to parse a single binary (i.e. non-FAT).
Definition BinaryParser.hpp:79
Class which represents a MachO binary.
Definition MachO/Binary.hpp:91
Definition BindingInfoIterator.hpp:32
Class used to rebuild a Mach-O file.
Definition MachO/Builder.hpp:64
This class represents a symbol binding operation associated with the LC_DYLD_INFO bytecode.
Definition DyldBindingInfo.hpp:35
Class that represents the LC_DYLD_INFO and LC_DYLD_INFO_ONLY commands.
Definition DyldInfo.hpp:51
BIND_SYMBOL_FLAGS
Definition DyldInfo.hpp:166
@ NON_WEAK_DEFINITION
Definition DyldInfo.hpp:168
@ WEAK_IMPORT
Definition DyldInfo.hpp:167
void weak_bind(const info_t &info)
Definition DyldInfo.hpp:385
ref_iterator< export_info_t &, ExportInfo * > it_export_info
Iterator which outputs const ExportInfo&.
Definition DyldInfo.hpp:77
std::ostream & print(std::ostream &os) const override
void set_export_size(uint32_t size)
Definition DyldInfo.hpp:427
span< const uint8_t > bind_opcodes() const
Return Binding's opcodes as raw data.
Definition DyldInfo.hpp:238
friend class BindingInfoIterator
Definition DyldInfo.hpp:57
const_ref_iterator< const export_info_t &, ExportInfo * > it_const_export_info
Iterator which outputs const ExportInfo&.
Definition DyldInfo.hpp:80
std::string show_lazy_bind_opcodes() const
Return the lazy opcodes in a human-readable way.
BIND_OPCODES
Opcodes used by Dyld info to bind symbols.
Definition DyldInfo.hpp:123
static constexpr auto OPCODE_MASK
Definition DyldInfo.hpp:171
it_const_binding_info bindings() const
Definition DyldInfo.hpp:323
DyldInfo(const details::dyld_info_command &dyld_info_cmd)
span< const uint8_t > rebase_opcodes() const
Return Rebase's opcodes as raw data.
Definition DyldInfo.hpp:206
void lazy_bind_opcodes(buffer_t raw)
Set new opcodes.
static bool classof(const LoadCommand *cmd)
Definition DyldInfo.hpp:437
void set_weak_bind_size(uint32_t size)
Definition DyldInfo.hpp:412
const info_t & export_info() const
Export information
Definition DyldInfo.hpp:353
REBASE_OPCODES
Definition DyldInfo.hpp:96
void set_bind_size(uint32_t size)
Definition DyldInfo.hpp:405
std::string show_export_trie() const
Return the export trie in a human-readable way.
const info_t & bind() const
Bind information
Definition DyldInfo.hpp:233
friend class BinaryParser
Definition DyldInfo.hpp:53
static constexpr auto IMMEDIATE_MASK
Definition DyldInfo.hpp:172
std::unique_ptr< LoadCommand > clone() const override
Definition DyldInfo.hpp:182
const info_t & rebase() const
Rebase information
Definition DyldInfo.hpp:201
std::vector< std::unique_ptr< DyldBindingInfo > > binding_info_t
Internal container for storing DyldBindingInfo.
Definition DyldInfo.hpp:64
ExportInfo * add(std::unique_ptr< ExportInfo > info)
DyldInfo & operator=(DyldInfo other)
void rebase_opcodes(buffer_t raw)
Set new opcodes.
ref_iterator< binding_info_t &, DyldBindingInfo * > it_binding_info
Iterator which outputs DyldBindingInfo&.
Definition DyldInfo.hpp:67
void set_bind_offset(uint32_t offset)
Definition DyldInfo.hpp:402
BIND_SUBOPCODE_THREADED
Definition DyldInfo.hpp:161
DyldInfo(const DyldInfo ©)
span< uint8_t > lazy_bind_opcodes()
Definition DyldInfo.hpp:308
void set_rebase_offset(uint32_t offset)
Definition DyldInfo.hpp:395
void export_info(const info_t &info)
Definition DyldInfo.hpp:391
BINDING_ENCODING_VERSION
Definition DyldInfo.hpp:83
void set_lazy_bind_size(uint32_t size)
Definition DyldInfo.hpp:419
const info_t & weak_bind() const
Weak Bind information
Definition DyldInfo.hpp:268
span< uint8_t > rebase_opcodes()
Definition DyldInfo.hpp:209
friend class Builder
Definition DyldInfo.hpp:55
void set_export_offset(uint32_t offset)
Definition DyldInfo.hpp:423
it_binding_info bindings()
Iterator over BindingInfo entries.
Definition DyldInfo.hpp:319
span< uint8_t > export_trie()
Definition DyldInfo.hpp:369
void weak_bind_opcodes(buffer_t raw)
Set new opcodes.
it_export_info exports()
Iterator over ExportInfo entries.
Definition DyldInfo.hpp:358
friend class Binary
Definition DyldInfo.hpp:54
void lazy_bind(const info_t &info)
Definition DyldInfo.hpp:388
friend class LinkEdit
Definition DyldInfo.hpp:56
void set_weak_bind_offset(uint32_t offset)
Definition DyldInfo.hpp:409
void bind_opcodes(buffer_t raw)
Set new opcodes.
REBASE_TYPE
Definition DyldInfo.hpp:89
std::pair< uint32_t, uint32_t > info_t
Tuple of offset and size.
Definition DyldInfo.hpp:61
void bind(const info_t &info)
Definition DyldInfo.hpp:382
std::string show_bind_opcodes() const
Return the bind opcodes in a human-readable way.
const_ref_iterator< const binding_info_t &, DyldBindingInfo * > it_const_binding_info
Iterator which outputs const DyldBindingInfo&.
Definition DyldInfo.hpp:70
void rebase(const info_t &info)
Definition DyldInfo.hpp:379
span< uint8_t > weak_bind_opcodes()
Definition DyldInfo.hpp:276
std::string show_rebases_opcodes() const
Return the rebase opcodes in a human-readable way.
void export_trie(buffer_t raw)
Set new trie.
span< const uint8_t > lazy_bind_opcodes() const
Return Lazy Binding's opcodes as raw data.
Definition DyldInfo.hpp:305
it_const_export_info exports() const
Definition DyldInfo.hpp:361
void set_lazy_bind_offset(uint32_t offset)
Definition DyldInfo.hpp:416
const info_t & lazy_bind() const
Lazy Bind information
Definition DyldInfo.hpp:300
span< uint8_t > bind_opcodes()
Definition DyldInfo.hpp:241
std::vector< std::unique_ptr< ExportInfo > > export_info_t
Internal container for storing ExportInfo.
Definition DyldInfo.hpp:74
span< const uint8_t > export_trie() const
Return Export's trie as raw data.
Definition DyldInfo.hpp:366
void swap(DyldInfo &other) noexcept
void accept(Visitor &visitor) const override
void set_rebase_size(uint32_t size)
Definition DyldInfo.hpp:398
span< const uint8_t > weak_bind_opcodes() const
Return Weak Binding's opcodes as raw data.
Definition DyldInfo.hpp:273
std::string show_weak_bind_opcodes() const
Return the bind opcodes in a human-readable way.
Class that provides an interface over the Dyld export info.
Definition ExportInfo.hpp:38
Definition LinkEdit.hpp:47
uint32_t size() const
Size of the command (should be greater than sizeof(load_command)).
Definition LoadCommand.hpp:135
LoadCommand::TYPE command() const
Command type.
Definition LoadCommand.hpp:130
TYPE
Definition LoadCommand.hpp:46
@ DYLD_INFO
Definition LoadCommand.hpp:81
@ DYLD_INFO_ONLY
Definition LoadCommand.hpp:82
Class that represents a relocation found in the DyldInfo structure.
Definition RelocationDyld.hpp:33
Definition Visitor.hpp:212
Iterator which returns reference on container's values.
Definition iterators.hpp:47
Definition iostream.hpp:32
#define LIEF_LIFETIMEBOUND
Definition compiler_attributes.hpp:72
Definition endianness_support.hpp:60
Namespace related to the LIEF's Mach-O module.
Definition Abstract/Header.hpp:36
std::vector< uint8_t > buffer_t
Definition MachO/type_traits.hpp:24
@ UNKNOWN
Definition MachO/enums.hpp:24
const char * to_string(BuildToolVersion::TOOLS tool)
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:320
#define LIEF_API
Definition visibility.h:45
#define LIEF_LOCAL
Definition visibility.h:46