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.
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.
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]
23 * Copyright (c) 1988 AT&T
27 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
29 * Global include file for all sgs.
39 /* <assert.h> keys off of NDEBUG */
47 #include <sys/types.h>
48 #include <sys/machelf.h>
57 * Software identification.
60 #define SGU_PKG "Software Generation Utilities"
61 #define SGU_REL "(SGU) Solaris-ELF (4.0)"
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
73 extern const char link_ver_string
[];
75 * Macro to round to next double word boundary.
77 #define S_DROUND(x) (((x) + sizeof (double) - 1) & ~(sizeof (double) - 1))
80 * General align and round macros.
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))
86 * Bit manipulation macros; generic bit mask and is `v' in the range
87 * supportable in `n' bits?
89 #define S_MASK(n) ((1 << (n)) -1)
90 #define S_INRANGE(v, n) (((-(1 << (n)) - 1) < (v)) && ((v) < (1 << (n))))
94 * Yet another definition of the OFFSETOF macro, used with the AVL routines.
96 #define SGSOFFSETOF(s, m) ((size_t)(&(((s *)0)->m)))
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.
108 #define CAST_PTRINT(cast, value) ((cast)(uintptr_t)value)
110 #define CAST_PTRINT(cast, value) ((cast)value)
122 * Types of errors (used by veprintf()), together with a generic error return
126 ERR_NONE
, /* plain message */
127 ERR_WARNING_NF
, /* warning that cannot be promoted to fatal */
128 ERR_WARNING
, /* warning that can be promoted to fatal */
129 ERR_GUIDANCE
, /* guidance warning that can be promoted */
130 ERR_FATAL
, /* fatal error */
131 ERR_ELF
, /* fatal libelf error */
132 ERR_NUM
/* # of Error codes. Must be last */
136 * Type used to represent line numbers within files, and a corresponding
137 * printing macro for it.
139 typedef ulong_t Lineno
;
140 #define EC_LINENO(_x) EC_XWORD(_x) /* "llu" */
143 #if defined(_LP64) && !defined(_ELF64)
144 #define S_ERROR (~(uint_t)0)
146 #define S_ERROR (~(uintptr_t)0)
150 * CTF currently does not handle automatic array variables sized via function
151 * arguments (VLA arrays) properly, when the code is compiled with gcc.
152 * Adding 1 to the size is a workaround. VLA_SIZE, and its use, should be
153 * pulled when CTF is fixed or replaced.
156 #define VLA_SIZE(_arg) ((_arg) + 1)
158 #define VLA_SIZE(_arg) (_arg)
162 * Structure to maintain rejected files elf information. Files that are not
163 * applicable to the present link-edit are rejected and a search for an
164 * appropriate file may be resumed. The first rejected files information is
165 * retained so that a better error diagnostic can be given should an appropriate
166 * file not be located.
169 ushort_t rej_type
; /* SGS_REJ_ value */
170 ushort_t rej_flags
; /* additional information */
171 uint_t rej_info
; /* numeric and string information */
172 const char *rej_str
; /* associated with error */
173 const char *rej_name
; /* object name - expanded library */
174 /* name and archive members */
177 #define SGS_REJ_NONE 0
178 #define SGS_REJ_MACH 1 /* wrong ELF machine type */
179 #define SGS_REJ_CLASS 2 /* wrong ELF class (32-bit/64-bit) */
180 #define SGS_REJ_DATA 3 /* wrong ELF data format (MSG/LSB) */
181 #define SGS_REJ_TYPE 4 /* bad ELF type */
182 #define SGS_REJ_BADFLAG 5 /* bad ELF flags value */
183 #define SGS_REJ_MISFLAG 6 /* mismatched ELF flags value */
184 #define SGS_REJ_VERSION 7 /* mismatched ELF/lib version */
185 #define SGS_REJ_HAL 8 /* HAL R1 extensions required */
186 #define SGS_REJ_US3 9 /* Sun UltraSPARC III extensions */
188 #define SGS_REJ_STR 10 /* generic error - info is a string */
189 #define SGS_REJ_UNKFILE 11 /* unknown file type */
190 #define SGS_REJ_UNKCAP 12 /* unknown capabilities */
191 #define SGS_REJ_HWCAP_1 13 /* hardware capabilities mismatch */
192 #define SGS_REJ_SFCAP_1 14 /* software capabilities mismatch */
193 #define SGS_REJ_MACHCAP 15 /* machine capability mismatch */
194 #define SGS_REJ_PLATCAP 16 /* platform capability mismatch */
195 #define SGS_REJ_HWCAP_2 17 /* hardware capabilities mismatch */
196 #define SGS_REJ_ARCHIVE 18 /* archive used in invalid context */
197 #define SGS_REJ_NUM 19
199 #define FLG_REJ_ALTER 0x01 /* object name is an alternative */
202 * For those source files used both inside and outside of the
203 * libld source base (tools/common/string_table.c) we can
204 * automatically switch between the allocation models
205 * based off of the 'cc -DUSE_LIBLD_MALLOC' flag.
207 #ifdef USE_LIBLD_MALLOC
208 #define calloc(x, a) libld_malloc(((size_t)x) * ((size_t)a))
209 #define free libld_free
210 #define malloc libld_malloc
211 #define realloc libld_realloc
213 #define libld_calloc(x, a) libld_malloc(((size_t)x) * ((size_t)a))
214 extern void libld_free(void *);
215 extern void *libld_malloc(size_t);
216 extern void *libld_realloc(void *, size_t);
220 * Data structures (defined in libld.h).
222 typedef struct audit_desc Audit_desc
;
223 typedef struct audit_info Audit_info
;
224 typedef struct audit_list Audit_list
;
225 typedef struct cap_desc Cap_desc
;
226 typedef struct ent_desc Ent_desc
;
227 typedef struct group_desc Group_desc
;
228 typedef struct ifl_desc Ifl_desc
;
229 typedef struct is_desc Is_desc
;
230 typedef struct isa_desc Isa_desc
;
231 typedef struct isa_opt Isa_opt
;
232 typedef struct os_desc Os_desc
;
233 typedef struct ofl_desc Ofl_desc
;
234 typedef struct rel_cache Rel_cache
;
235 typedef struct rel_cachebuf Rel_cachebuf
;
236 typedef struct rel_aux_cachebuf Rel_aux_cachebuf
;
237 typedef struct rel_aux Rel_aux
;
238 typedef struct rel_desc Rel_desc
;
239 typedef struct sdf_desc Sdf_desc
;
240 typedef struct sdv_desc Sdv_desc
;
241 typedef struct sec_order Sec_order
;
242 typedef struct sg_desc Sg_desc
;
243 typedef struct sort_desc Sort_desc
;
244 typedef struct sym_avlnode Sym_avlnode
;
245 typedef struct sym_aux Sym_aux
;
246 typedef struct sym_desc Sym_desc
;
247 typedef struct uts_desc Uts_desc
;
248 typedef struct ver_desc Ver_desc
;
249 typedef struct ver_index Ver_index
;
252 * Data structures defined in rtld.h.
254 typedef struct lm_list Lm_list
;
256 typedef struct lm_list32 Lm_list32
;
257 #endif /* _SYSCALL32 */
260 * For the various utilities that include sgs.h
262 extern int assfail(const char *, const char *, int);
263 extern void eprintf(Lm_list
*, Error
, const char *, ...);
264 extern void veprintf(Lm_list
*, Error
, const char *, va_list);
265 extern uint_t
sgs_str_hash(const char *);
266 extern uint_t
findprime(uint_t
);