Home | History | Annotate | Download | only in include
      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