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 linking code specific to architectures that support common symbols */ 66#if (!KERNEL || __i386__) 67 #define KXLD_USER_OR_COMMON 1 68#endif 69 70/* For linking code specific to architectures that support strict patching */ 71 #define KXLD_USER_OR_STRICT_PATCHING 1 72 73/* For linking code specific to architectures that use MH_OBJECT */ 74#if (!KERNEL || __i386__) 75 #define KXLD_USER_OR_OBJECT 1 76#endif 77 78/* For linking code specific to architectures that use MH_KEXT_BUNDLE */ 79#define KXLD_USER_OR_BUNDLE 1 80 81/* We no longer need to generate our own GOT for any architectures, but the code 82 * required to do this will be saved inside this macro. 83 */ 84#define KXLD_USER_OR_GOT 0 85 86/* for building the dysymtab command generation into the dylib */ 87#if (!KERNEL) 88 #define KXLD_PIC_KEXTS 1 89#endif 90 91/******************************************************************************* 92* Types 93*******************************************************************************/ 94 95/* Maintains linker state across links. One context should be allocate for 96 * each link thread. 97 */ 98typedef struct kxld_context KXLDContext; 99 100/* Unless we're in a 32-bit kernel, all internal math is performed in 64 bits 101 * and cast to smaller values as needed by the architecture for which we are 102 * linking. All returned arguments should be handled similarly. 103 * Note: This size can be increased for future architectural size increases 104 */ 105#if KERNEL && !__LP64__ 106typedef uint32_t kxld_addr_t; 107typedef uint32_t kxld_size_t; 108#else 109typedef uint64_t kxld_addr_t; 110typedef uint64_t kxld_size_t; 111#endif /* KERNEL && !__LP64__ */ 112 113/* Flags for general linker behavior */ 114enum kxld_flags { 115 kKxldFlagDefault = 0x0, 116 kKXLDFlagIncludeRelocs = 0x01 117}; 118typedef enum kxld_flags KXLDFlags; 119 120/* Flags for the allocation callback */ 121enum kxld_allocate_flags { 122 kKxldAllocateDefault = 0x0, 123 kKxldAllocateWritable = 0x1, /* kxld may write into the allocated memory */ 124}; 125typedef enum kxld_allocate_flags KXLDAllocateFlags; 126 127/* This specifies the function type of the callback that the linker uses to get 128 * the base address and allocated memory for relocation and linker output, 129 * respectively. Note that it is compatible with the standard allocators (e.g. 130 * malloc). 131 */ 132typedef kxld_addr_t (*KXLDAllocateCallback)(size_t size, 133 KXLDAllocateFlags *flags, void *user_data); 134 135/* Flags for the logging callback */ 136typedef enum kxld_log_subsystem { 137 kKxldLogLinking = 0x0, 138 kKxldLogPatching = 0x01 139} KXLDLogSubsystem; 140 141typedef enum kxld_log_level { 142 kKxldLogExplicit = 0x0, 143 kKxldLogErr = 0x1, 144 kKxldLogWarn = 0x2, 145 kKxldLogBasic = 0x3, 146 kKxldLogDetail = 0x4, 147 kKxldLogDebug = 0x5 148} KXLDLogLevel; 149 150/* This structure is used to describe a dependency kext. The kext field 151 * is a pointer to the binary executable of the dependency. The interface 152 * field is a pointer to an optional interface kext that restricts the 153 * symbols that may be accessed in the dependency kext. 154 * 155 * For example, to use this structure with the KPIs, set the kext field 156 * to point to the kernel's Mach-O binary, and set interface to point 157 * to the KPI's Mach-O binary. 158 */ 159typedef struct kxld_dependency { 160 u_char * kext; 161 u_long kext_size; 162 char * kext_name; 163 u_char * interface; 164 u_long interface_size; 165 char * interface_name; 166 boolean_t is_direct_dependency; 167} KXLDDependency; 168 169typedef void (*KXLDLoggingCallback) (KXLDLogSubsystem sys, KXLDLogLevel level, 170 const char *format, va_list ap, void *user_data); 171 172#endif /* _KXLD_TYPES_H */ 173 174