1 | /* |
2 | * Copyright (c) 2007-2012 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_TYPES_H |
29 | #define _KXLD_TYPES_H |
30 | |
31 | #include <stdarg.h> |
32 | #include <stdint.h> |
33 | #include <mach/boolean.h> // boolean_t |
34 | #include <mach/kern_return.h> |
35 | |
36 | /******************************************************************************* |
37 | * Macros |
38 | *******************************************************************************/ |
39 | |
40 | /* For 32-bit-specific linking code */ |
41 | #if (!KERNEL || !__LP64__) |
42 | #define KXLD_USER_OR_ILP32 1 |
43 | #endif |
44 | |
45 | /* For 64-bit-specific linking code */ |
46 | #if (!KERNEL || __LP64__) |
47 | #define KXLD_USER_OR_LP64 1 |
48 | #endif |
49 | |
50 | /* For i386-specific linking code */ |
51 | #if (!KERNEL || __i386__) |
52 | #define KXLD_USER_OR_I386 1 |
53 | #endif |
54 | |
55 | /* For x86_64-specific linking code */ |
56 | #if (!KERNEL || __x86_64__) |
57 | #define KXLD_USER_OR_X86_64 1 |
58 | #endif |
59 | |
60 | /* For arm-specific linking code */ |
61 | #if (!KERNEL || __arm__) |
62 | #define KXLD_USER_OR_ARM 1 |
63 | #endif |
64 | |
65 | /* For arm64-specific linking code */ |
66 | #if (!KERNEL || __arm64__) |
67 | #define KXLD_USER_OR_ARM64 1 |
68 | #endif |
69 | |
70 | /* For linking code specific to architectures that support common symbols */ |
71 | #if (!KERNEL || __i386__) |
72 | #define KXLD_USER_OR_COMMON 1 |
73 | #endif |
74 | |
75 | /* For linking code specific to architectures that support strict patching */ |
76 | #define KXLD_USER_OR_STRICT_PATCHING 1 |
77 | |
78 | /* For linking code specific to architectures that use MH_OBJECT */ |
79 | #if (!KERNEL || __i386__) |
80 | #define KXLD_USER_OR_OBJECT 1 |
81 | #endif |
82 | |
83 | /* For linking code specific to architectures that use MH_KEXT_BUNDLE */ |
84 | #define KXLD_USER_OR_BUNDLE 1 |
85 | |
86 | /* We no longer need to generate our own GOT for any architectures, but the code |
87 | * required to do this will be saved inside this macro. |
88 | */ |
89 | #define KXLD_USER_OR_GOT 0 |
90 | |
91 | /* for building the dysymtab command generation into the dylib */ |
92 | #if (!KERNEL) |
93 | #define KXLD_PIC_KEXTS 1 |
94 | // #define SPLIT_KEXTS 1 |
95 | #define SPLIT_KEXTS_DEBUG 0 |
96 | #endif |
97 | |
98 | /******************************************************************************* |
99 | * Types |
100 | *******************************************************************************/ |
101 | |
102 | /* Maintains linker state across links. One context should be allocated for |
103 | * each link thread. |
104 | */ |
105 | typedef struct kxld_context KXLDContext; |
106 | |
107 | /* Unless we're in a 32-bit kernel, all internal math is performed in 64 bits |
108 | * and cast to smaller values as needed by the architecture for which we are |
109 | * linking. All returned arguments should be handled similarly. |
110 | * Note: This size can be increased for future architectural size increases |
111 | */ |
112 | #if KERNEL && !__LP64__ |
113 | typedef uint32_t kxld_addr_t; |
114 | typedef uint32_t kxld_size_t; |
115 | #else |
116 | typedef uint64_t kxld_addr_t; |
117 | typedef uint64_t kxld_size_t; |
118 | #endif /* KERNEL && !__LP64__ */ |
119 | |
120 | typedef struct splitKextLinkInfo { |
121 | u_char * kextExecutable; // kext we will link |
122 | size_t kextSize; // size of kextExecutable |
123 | u_char * linkedKext; // linked kext |
124 | size_t linkedKextSize; // size of linkedKext |
125 | uint64_t vmaddr_TEXT; // vmaddr of kext __TEXT segment |
126 | uint64_t vmaddr_TEXT_EXEC; // vmaddr of kext __TEXT_EXEC segment |
127 | uint64_t vmaddr_DATA; // vmaddr of kext __DATA segment |
128 | uint64_t vmaddr_DATA_CONST; // vmaddr of kext __DATA_CONST segment |
129 | uint64_t vmaddr_LINKEDIT; // vmaddr of kext __LINKEDIT segment |
130 | uint64_t vmaddr_LLVM_COV; // vmaddr of kext __LLVM_COV segment |
131 | uint32_t kaslr_offsets_count; // offsets into the kext to slide |
132 | uint32_t * kaslr_offsets; // offsets into the kext to slide |
133 | } splitKextLinkInfo; |
134 | |
135 | /* Flags for general linker behavior */ |
136 | enum kxld_flags { |
137 | kKxldFlagDefault = 0x0, |
138 | kKXLDFlagIncludeRelocs = 0x01 |
139 | }; |
140 | typedef enum kxld_flags KXLDFlags; |
141 | |
142 | /* Flags for the allocation callback */ |
143 | enum kxld_allocate_flags { |
144 | kKxldAllocateDefault = 0x0, |
145 | kKxldAllocateWritable = 0x1, /* kxld may write into the allocated memory */ |
146 | }; |
147 | typedef enum kxld_allocate_flags KXLDAllocateFlags; |
148 | |
149 | /* This specifies the function type of the callback that the linker uses to get |
150 | * the base address and allocated memory for relocation and linker output, |
151 | * respectively. Note that it is compatible with the standard allocators (e.g. |
152 | * malloc). |
153 | */ |
154 | typedef kxld_addr_t (*KXLDAllocateCallback)(size_t size, |
155 | KXLDAllocateFlags *flags, void *user_data); |
156 | |
157 | /* Flags for the logging callback */ |
158 | typedef enum kxld_log_subsystem { |
159 | kKxldLogLinking = 0x0, |
160 | kKxldLogPatching = 0x01 |
161 | } KXLDLogSubsystem; |
162 | |
163 | typedef enum kxld_log_level { |
164 | kKxldLogExplicit = 0x0, |
165 | kKxldLogErr = 0x1, |
166 | kKxldLogWarn = 0x2, |
167 | kKxldLogBasic = 0x3, |
168 | kKxldLogDetail = 0x4, |
169 | kKxldLogDebug = 0x5 |
170 | } KXLDLogLevel; |
171 | |
172 | /* This structure is used to describe a dependency kext. The kext field |
173 | * is a pointer to the binary executable of the dependency. The interface |
174 | * field is a pointer to an optional interface kext that restricts the |
175 | * symbols that may be accessed in the dependency kext. |
176 | * |
177 | * For example, to use this structure with the KPIs, set the kext field |
178 | * to point to the kernel's Mach-O binary, and set interface to point |
179 | * to the KPI's Mach-O binary. |
180 | */ |
181 | typedef struct kxld_dependency { |
182 | u_char * kext; |
183 | u_long kext_size; |
184 | char * kext_name; |
185 | u_char * interface; |
186 | u_long interface_size; |
187 | char * interface_name; |
188 | boolean_t is_direct_dependency; |
189 | } KXLDDependency; |
190 | |
191 | typedef void (*KXLDLoggingCallback) (KXLDLogSubsystem sys, KXLDLogLevel level, |
192 | const char *format, va_list ap, void *user_data); |
193 | |
194 | #endif /* _KXLD_TYPES_H */ |
195 | |
196 | |