1/* 2 * Copyright (c) 2008 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28#ifndef _KXLD_SYMTAB_H_ 29#define _KXLD_SYMTAB_H_ 30 31#include <sys/types.h> 32#if KERNEL 33 #include <libkern/kxld_types.h> 34#else 35 #include "kxld_types.h" 36#endif 37 38#include "kxld_sym.h" 39#include "kxld_seg.h" 40 41struct kxld_array; 42struct symtab_command; 43typedef struct kxld_symtab KXLDSymtab; 44typedef struct kxld_symtab_iterator KXLDSymtabIterator; 45 46struct kxld_symtab_iterator { 47 const KXLDSymtab *symtab; 48 u_int idx; 49 KXLDSymPredicateTest test; 50 boolean_t negate; 51}; 52 53/******************************************************************************* 54* Constructors and Destructors 55*******************************************************************************/ 56 57size_t kxld_symtab_sizeof(void) 58 __attribute__((const, visibility("hidden"))); 59 60#if KXLD_USER_OR_ILP32 61kern_return_t kxld_symtab_init_from_macho_32(KXLDSymtab *symtab, 62 struct symtab_command *src, u_char *macho, KXLDSeg * kernel_linkedit_seg) 63 __attribute__((nonnull(1,2), visibility("hidden"))); 64#endif /* KXLD_USER_OR_ILP32 */ 65 66#if KXLD_USER_OR_LP64 67kern_return_t kxld_symtab_init_from_macho_64(KXLDSymtab *symtab, 68 struct symtab_command *src, u_char *macho, KXLDSeg * kernel_linkedit_seg) 69 __attribute__((nonnull(1,2), visibility("hidden"))); 70#endif /* KXLD_USER_OR_ILP64 */ 71 72void kxld_symtab_iterator_init(KXLDSymtabIterator *iter, 73 const KXLDSymtab *symtab, KXLDSymPredicateTest test, boolean_t negate) 74 __attribute__((nonnull, visibility("hidden"))); 75 76void kxld_symtab_clear(KXLDSymtab *symtab) 77 __attribute__((nonnull, visibility("hidden"))); 78 79void kxld_symtab_deinit(KXLDSymtab *symtab) 80 __attribute__((nonnull, visibility("hidden"))); 81 82/******************************************************************************* 83* Accessors 84*******************************************************************************/ 85 86u_int kxld_symtab_get_num_symbols(const KXLDSymtab *symtab) 87 __attribute__((pure, nonnull, visibility("hidden"))); 88 89KXLDSym * kxld_symtab_get_symbol_by_index(const KXLDSymtab *symtab, u_int idx) 90 __attribute__((pure, nonnull, visibility("hidden"))); 91 92KXLDSym * kxld_symtab_get_symbol_by_name(const KXLDSymtab *symtab, 93 const char *name) 94 __attribute__((pure, nonnull, visibility("hidden"))); 95 96KXLDSym * kxld_symtab_get_locally_defined_symbol_by_name( 97 const KXLDSymtab *symtab, const char *name) 98 __attribute__((pure, nonnull, visibility("hidden"))); 99 100KXLDSym * kxld_symtab_get_cxx_symbol_by_value(const KXLDSymtab *symtab, 101 kxld_addr_t value) 102 __attribute__((pure, nonnull, visibility("hidden"))); 103 104kern_return_t kxld_symtab_get_sym_index(const KXLDSymtab *symtab, 105 const KXLDSym * sym, u_int *idx) 106 __attribute__((nonnull, visibility("hidden"))); 107 108u_long kxld_symtab_get_macho_header_size(void) 109 __attribute__((pure, visibility("hidden"))); 110 111u_long kxld_symtab_get_macho_data_size(const KXLDSymtab *symtab, 112 boolean_t is_32_bit) 113 __attribute__((pure, nonnull, visibility("hidden"))); 114 115kern_return_t 116kxld_symtab_export_macho(const KXLDSymtab *symtab, u_char *buf, 117 u_long *header_offset, u_long header_size, 118 u_long *data_offset, u_long data_size, 119 boolean_t is_32_bit) 120 __attribute__((nonnull, visibility("hidden"))); 121 122u_int kxld_symtab_iterator_get_num_remaining(const KXLDSymtabIterator *iter) 123 __attribute__((pure, nonnull, visibility("hidden"))); 124 125/******************************************************************************* 126* Modifiers 127*******************************************************************************/ 128 129kern_return_t kxld_symtab_index_symbols_by_name(KXLDSymtab *symtab) 130 __attribute__((nonnull, visibility("hidden"))); 131 132kern_return_t kxld_symtab_index_cxx_symbols_by_value(KXLDSymtab *symtab) 133 __attribute__((nonnull, visibility("hidden"))); 134 135kern_return_t kxld_symtab_relocate(KXLDSymtab *symtab, 136 const struct kxld_array *sectarray) 137 __attribute__((nonnull, visibility("hidden"))); 138 139kern_return_t kxld_symtab_add_symbol(KXLDSymtab *symtab, char *name, 140 kxld_addr_t link_addr, KXLDSym **symout) 141 __attribute__((nonnull, visibility("hidden"))); 142 143KXLDSym * kxld_symtab_iterator_get_next(KXLDSymtabIterator *iter) 144 __attribute__((nonnull, visibility("hidden"))); 145 146void kxld_symtab_iterator_reset(KXLDSymtabIterator *iter) 147 __attribute__((nonnull, visibility("hidden"))); 148 149#endif /* _KXLD_SYMTAB_H_ */ 150 151