xref: /xnu-11215.41.3/libkern/kxld/kxld_vtable.h (revision 33de042d024d46de5ff4e89f2471de6608e37fa4)
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_VTABLE_H_
29 #define _KXLD_VTABLE_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_array.h"
39 
40 struct kxld_array;
41 struct kxld_object;
42 struct kxld_reloc;
43 struct kxld_relocator;
44 struct kxld_sect;
45 struct kxld_sym;
46 struct kxld_symtab;
47 struct kxld_vtable_hdr;
48 struct section;
49 
50 typedef struct kxld_vtable KXLDVTable;
51 typedef union kxld_vtable_entry KXLDVTableEntry;
52 
53 struct kxld_vtable {
54 	u_char *vtable;
55 	const char *name;
56 	KXLDArray entries;
57 	boolean_t is_patched;
58 };
59 
60 struct kxld_vtable_patched_entry {
61 	char *name;
62 	kxld_addr_t addr;
63 };
64 
65 struct kxld_vtable_unpatched_entry {
66 	const struct kxld_sym *sym;
67 	struct kxld_reloc *reloc;
68 };
69 
70 union kxld_vtable_entry {
71 	struct kxld_vtable_patched_entry patched;
72 	struct kxld_vtable_unpatched_entry unpatched;
73 };
74 
75 /*******************************************************************************
76 * Constructors and destructors
77 *******************************************************************************/
78 
79 kern_return_t kxld_vtable_init(KXLDVTable *vtable,
80     const struct kxld_sym *vtable_sym, const struct kxld_object *object,
81     const struct kxld_dict *defined_cxx_symbols)
82 __attribute__((nonnull, visibility("hidden")));
83 
84 void kxld_vtable_clear(KXLDVTable *vtable)
85 __attribute__((visibility("hidden")));
86 
87 void kxld_vtable_deinit(KXLDVTable *vtable)
88 __attribute__((visibility("hidden")));
89 
90 /*******************************************************************************
91 * Accessors
92 *******************************************************************************/
93 
94 KXLDVTableEntry * kxld_vtable_get_entry_for_offset(const KXLDVTable *vtable,
95     u_long offset, boolean_t is_32_bit)
96 __attribute__((pure, nonnull, visibility("hidden")));
97 
98 /*******************************************************************************
99 * Modifiers
100 *******************************************************************************/
101 
102 /* With strict patching, the vtable patcher with only patch pad slots */
103 kern_return_t kxld_vtable_patch(KXLDVTable *vtable, const KXLDVTable *super_vtable,
104     struct kxld_object *object)
105 __attribute__((nonnull, visibility("hidden")));
106 
107 #endif /* _KXLD_VTABLE_H_ */
108