1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright (c) 1988 AT&T 24 * All Rights Reserved 25 * 26 * 27 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 28 * Use is subject to license terms. 29 * 30 * Global include file for all sgs. 31 */ 32 33 #ifndef _SGS_H 34 #define _SGS_H 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 /* <assert.h> keys off of NDEBUG */ 41 #ifdef DEBUG 42 #undef NDEBUG 43 #else 44 #define NDEBUG 45 #endif 46 47 #ifndef _ASM 48 #include <sys/types.h> 49 #include <sys/machelf.h> 50 #include <stdlib.h> 51 #include <libelf.h> 52 #include <assert.h> 53 #include <alist.h> 54 #endif /* _ASM */ 55 56 /* 57 * Software identification. 58 */ 59 #define SGS "" 60 #define SGU_PKG "Software Generation Utilities" 61 #define SGU_REL "(SGU) Solaris-ELF (4.0)" 62 63 64 #ifndef _ASM 65 66 /* 67 * link_ver_string[] contains a version string for use by the link-editor 68 * and all other linker components. It is found in libconv, and is 69 * generated by sgs/libconv/common/bld_vernote.ksh. That script produces 70 * libconv/{plat}/vernote.s, which is in turn assembled/linked into 71 * libconv. 72 */ 73 extern const char link_ver_string[]; 74 /* 75 * Macro to round to next double word boundary. 76 */ 77 #define S_DROUND(x) (((x) + sizeof (double) - 1) & ~(sizeof (double) - 1)) 78 79 /* 80 * General align and round macros. 81 */ 82 #define S_ALIGN(x, a) ((x) & ~(((a) ? (a) : 1) - 1)) 83 #define S_ROUND(x, a) ((x) + (((a) ? (a) : 1) - 1) & ~(((a) ? (a) : 1) - 1)) 84 85 /* 86 * Bit manipulation macros; generic bit mask and is `v' in the range 87 * supportable in `n' bits? 88 */ 89 #define S_MASK(n) ((1 << (n)) -1) 90 #define S_INRANGE(v, n) (((-(1 << (n)) - 1) < (v)) && ((v) < (1 << (n)))) 91 92 93 /* 94 * Yet another definition of the OFFSETOF macro, used with the AVL routines. 95 */ 96 #define SGSOFFSETOF(s, m) ((size_t)(&(((s *)0)->m))) 97 98 /* 99 * When casting between integer and pointer types, gcc will complain 100 * if the integer type used is not large enough to hold the pointer 101 * value without loss. Although a dubious practice in general, this 102 * is sometimes done by design. In those cases, the general solution 103 * is to introduce an intermediate cast to widen the integer value. The 104 * CAST_PTRINT macro does this, and its use documents the fact that 105 * the programmer is doing that sort of cast. 106 */ 107 #ifdef __GNUC__ 108 #define CAST_PTRINT(cast, value) ((cast)(uintptr_t)value) 109 #else 110 #define CAST_PTRINT(cast, value) ((cast)value) 111 #endif 112 113 /* 114 * General typedefs. 115 */ 116 typedef enum { 117 FALSE = 0, 118 TRUE = 1 119 } Boolean; 120 121 /* 122 * Types of errors (used by eprintf()), together with a generic error return 123 * value. 124 */ 125 typedef enum { 126 ERR_NONE, 127 ERR_WARNING, 128 ERR_FATAL, 129 ERR_ELF, 130 ERR_NUM /* Must be last */ 131 } Error; 132 133 #if defined(_LP64) && !defined(_ELF64) 134 #define S_ERROR (~(uint_t)0) 135 #else 136 #define S_ERROR (~(uintptr_t)0) 137 #endif 138 139 /* 140 * Structure to maintain rejected files elf information. Files that are not 141 * applicable to the present link-edit are rejected and a search for an 142 * appropriate file may be resumed. The first rejected files information is 143 * retained so that a better error diagnostic can be given should an appropriate 144 * file not be located. 145 */ 146 typedef struct { 147 ushort_t rej_type; /* SGS_REJ_ value */ 148 ushort_t rej_flags; /* additional information */ 149 uint_t rej_info; /* numeric and string information */ 150 const char *rej_str; /* associated with error */ 151 const char *rej_name; /* object name - expanded library */ 152 /* name and archive members */ 153 } Rej_desc; 154 155 #define SGS_REJ_NONE 0 156 #define SGS_REJ_MACH 1 /* wrong ELF machine type */ 157 #define SGS_REJ_CLASS 2 /* wrong ELF class (32-bit/64-bit) */ 158 #define SGS_REJ_DATA 3 /* wrong ELF data format (MSG/LSB) */ 159 #define SGS_REJ_TYPE 4 /* bad ELF type */ 160 #define SGS_REJ_BADFLAG 5 /* bad ELF flags value */ 161 #define SGS_REJ_MISFLAG 6 /* mismatched ELF flags value */ 162 #define SGS_REJ_VERSION 7 /* mismatched ELF/lib version */ 163 #define SGS_REJ_HAL 8 /* HAL R1 extensions required */ 164 #define SGS_REJ_US3 9 /* Sun UltraSPARC III extensions */ 165 /* required */ 166 #define SGS_REJ_STR 10 /* generic error - info is a string */ 167 #define SGS_REJ_UNKFILE 11 /* unknown file type */ 168 #define SGS_REJ_HWCAP_1 12 /* hardware capabilities mismatch */ 169 #define SGS_REJ_SFCAP_1 13 /* software capabilities mismatch */ 170 171 #define FLG_REJ_ALTER 0x01 /* object name is an alternative */ 172 173 /* 174 * For those source files used both inside and outside of the 175 * libld source base (tools/common/string_table.c) we can 176 * automatically switch between the allocation models 177 * based off of the 'cc -DUSE_LIBLD_MALLOC' flag. 178 */ 179 #ifdef USE_LIBLD_MALLOC 180 #define calloc(x, a) libld_malloc(((size_t)x) * ((size_t)a)) 181 #define free libld_free 182 #define malloc libld_malloc 183 #define realloc libld_realloc 184 185 #define libld_calloc(x, a) libld_malloc(((size_t)x) * ((size_t)a)) 186 extern void libld_free(void *); 187 extern void *libld_malloc(size_t); 188 extern void *libld_realloc(void *, size_t); 189 #endif 190 191 /* 192 * Data structures (defined in libld.h). 193 */ 194 typedef struct ent_desc Ent_desc; 195 typedef struct group_desc Group_desc; 196 typedef struct ifl_desc Ifl_desc; 197 typedef struct is_desc Is_desc; 198 typedef struct isa_desc Isa_desc; 199 typedef struct isa_opt Isa_opt; 200 typedef struct ofl_desc Ofl_desc; 201 typedef struct os_desc Os_desc; 202 typedef struct rel_cache Rel_cache; 203 typedef struct sdf_desc Sdf_desc; 204 typedef struct sdv_desc Sdv_desc; 205 typedef struct sg_desc Sg_desc; 206 typedef struct sort_desc Sort_desc; 207 typedef struct sec_order Sec_order; 208 typedef struct sym_desc Sym_desc; 209 typedef struct sym_aux Sym_aux; 210 typedef struct sym_avlnode Sym_avlnode; 211 typedef struct uts_desc Uts_desc; 212 typedef struct ver_desc Ver_desc; 213 typedef struct ver_index Ver_index; 214 typedef struct audit_desc Audit_desc; 215 typedef struct audit_info Audit_info; 216 typedef struct audit_list Audit_list; 217 218 /* 219 * Data structures defined in machrel.h. 220 */ 221 typedef struct rel_desc Rel_desc; 222 223 /* 224 * Data structures defined in rtld.h. 225 */ 226 typedef struct lm_list Lm_list; 227 #ifdef _SYSCALL32 228 typedef struct lm_list32 Lm_list32; 229 #endif /* _SYSCALL32 */ 230 231 /* 232 * For the various utilities that include sgs.h 233 */ 234 extern int assfail(const char *, const char *, int); 235 extern void eprintf(Lm_list *, Error, const char *, ...); 236 extern uint_t sgs_str_hash(const char *); 237 extern uint_t findprime(uint_t); 238 239 #endif /* _ASM */ 240 241 #ifdef __cplusplus 242 } 243 #endif 244 245 246 #endif /* _SGS_H */ 247