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