#ifndef _KXLD_VTABLE_H_
#define _KXLD_VTABLE_H_
#include <sys/types.h>
#if KERNEL
#include <libkern/kxld_types.h>
#else
#include "kxld_types.h"
#endif
#include "kxld_array.h"
struct kxld_array;
struct kxld_reloc;
struct kxld_relocator;
struct kxld_sect;
struct kxld_sym;
struct kxld_symtab;
struct kxld_vtable_hdr;
struct section;
typedef struct kxld_vtable KXLDVTable;
typedef union kxld_vtable_entry KXLDVTableEntry;
struct kxld_vtable {
u_char *vtable;
const char *name;
KXLDArray entries;
boolean_t is_patched;
};
struct kxld_vtable_patched_entry {
char *name;
kxld_addr_t addr;
};
struct kxld_vtable_unpatched_entry {
struct kxld_sym *sym;
struct kxld_reloc *reloc;
};
union kxld_vtable_entry {
struct kxld_vtable_patched_entry patched;
struct kxld_vtable_unpatched_entry unpatched;
};
kern_return_t kxld_vtable_init_from_kernel_macho(KXLDVTable *vtable,
const struct kxld_sym *sym, const struct kxld_sect *sect,
const struct kxld_symtab *symtab, const struct kxld_relocator *relocator)
__attribute__((nonnull, visibility("hidden")));
kern_return_t kxld_vtable_init_from_final_macho(KXLDVTable *vtable,
const struct kxld_sym *sym, const struct kxld_sect *sect,
const struct kxld_symtab *symtab, const struct kxld_relocator *relocator,
const struct kxld_array *relocs)
__attribute__((nonnull, visibility("hidden")));
kern_return_t kxld_vtable_init_from_object_macho(KXLDVTable *vtable,
const struct kxld_sym *sym, const struct kxld_sect *sect,
const struct kxld_symtab *symtab, const struct kxld_relocator *relocator)
__attribute__((nonnull, visibility("hidden")));
kern_return_t kxld_vtable_init_from_link_state_32(KXLDVTable *vtable, u_char *state,
struct kxld_vtable_hdr *hdr)
__attribute__((nonnull, visibility("hidden")));
kern_return_t kxld_vtable_init_from_link_state_64(KXLDVTable *vtable, u_char *state,
struct kxld_vtable_hdr *hdr)
__attribute__((nonnull, visibility("hidden")));
kern_return_t kxld_vtable_copy(KXLDVTable *vtable, const KXLDVTable *src)
__attribute__((nonnull, visibility("hidden")));
void kxld_vtable_clear(KXLDVTable *vtable)
__attribute__((visibility("hidden")));
void kxld_vtable_deinit(KXLDVTable *vtable)
__attribute__((visibility("hidden")));
kern_return_t kxld_vtable_patch(KXLDVTable *vtable, const KXLDVTable *super_vtable,
struct kxld_symtab *symtab, boolean_t strict_patching)
__attribute__((nonnull, visibility("hidden")));
#endif