enum chain_format_t {
CHAIN_FORMAT_NONE = 0,
CHAIN_FORMAT_ARM64E = 1,
CHAIN_FORMAT_PTR_64 = 2,
CHAIN_FORMAT_PTR_32 = 3,
CHAIN_FORMAT_PTR_32_CACHE = 4,
CHAIN_FORMAT_PTR_32_FIRMWARE = 5,
CHAIN_FORMAT_PTR_64_OFFSET = 6,
CHAIN_FORMAT_PTR_ARM64E_KERNEL = 7,
CHAIN_FORMAT_PTR_64_KERNEL_CACHE = 8,
CHAIN_FORMAT_PTR_ARM64E_USERLAND = 9,
CHAIN_FORMAT_PTR_ARM64E_FIRMWARE = 10,
CHAIN_FORMAT_PTR_X86_64_KERNEL_CACHE = 11,
CHAIN_FORMAT_PTR_ARM64E_USERLAND24 = 12,
};
enum chain_header_t {
CHAIN_HEADER_UNKNOWN,
CHAIN_HEADER_LOAD_COMMAND,
CHAIN_HEADER_SECTION,
};
struct dyld_bind_info {
const char *segname;
const char *sectname;
uint64_t address;
int bind_type;
const char *bind_name;
uint64_t addend;
const char *dylibname;
const char *symbolname;
enum bool weak_import;
uint64_t pointer_value;
uint64_t pointer_ondisk;
uint32_t pointer_format;
enum bool has_auth;
uint16_t auth_diversity;
enum bool auth_addr_div;
uint8_t auth_key;
};
extern void get_dyld_bind_info(
const uint8_t *start,
const uint8_t *end,
const char **dylibs,
uint32_t ndylibs,
struct segment_command **segs,
uint32_t nsegs,
struct segment_command_64 **segs64,
uint32_t nsegs64,
enum bool swapped,
char *object_addr,
uint64_t object_size,
struct dyld_bind_info **dbi,
uint64_t *ndbi,
enum chain_format_t *chain_format,
enum bool print_errors);
extern struct dyld_bind_info **get_dyld_bind_info_index(
struct dyld_bind_info *dbi,
uint64_t ndbi);
extern void print_dyld_bind_info(
struct dyld_bind_info *dbi,
uint64_t ndbi);
extern void print_dyld_rebase_opcodes(
const uint8_t* object_addr,
uint64_t object_size,
uint32_t offset,
uint32_t size);
extern void print_dyld_bind_opcodes(
const uint8_t* object_addr,
uint64_t object_size,
const char* type,
uint32_t offset,
uint32_t size);
extern const char * get_dyld_bind_info_symbolname(
uint64_t address,
struct dyld_bind_info *dbi,
uint64_t ndbi,
struct dyld_bind_info **dbi_index,
enum chain_format_t chain_format,
int64_t *addend);
extern void get_dyld_chained_fixups(
const uint8_t *start,
const uint8_t *end,
const char **dylibs,
uint32_t ndylibs,
struct segment_command **segs,
uint32_t nsegs,
struct segment_command_64 **segs64,
uint32_t nsegs64,
enum bool swapped,
char *object_addr,
uint64_t object_size,
struct dyld_bind_info **dbi,
uint64_t *ndbi,
enum chain_format_t *chain_format,
enum chain_header_t header_type,
enum bool print_errors);
extern uint64_t get_chained_rebase_value(
uint64_t chain_value,
enum chain_format_t chain_format,
uint64_t textbase);
extern void print_dyld_chained_fixups(
struct load_command *load_commands,
uint32_t ncmds,
uint32_t sizeofcmds,
enum byte_sex load_commands_byte_sex,
char *object_addr,
uint64_t object_size);