xref: /illumos-gate/usr/src/cmd/sgs/include/sgs.h (revision fb12490a)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
55aefb655Srie  * Common Development and Distribution License (the "License").
65aefb655Srie  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
227c478bd9Sstevel@tonic-gate /*
237c478bd9Sstevel@tonic-gate  *	Copyright (c) 1988 AT&T
247c478bd9Sstevel@tonic-gate  *	  All Rights Reserved
257c478bd9Sstevel@tonic-gate  *
267c478bd9Sstevel@tonic-gate  *
27bf994817SAli Bahrami  * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
287c478bd9Sstevel@tonic-gate  *
297c478bd9Sstevel@tonic-gate  * Global include file for all sgs.
307c478bd9Sstevel@tonic-gate  */
327c478bd9Sstevel@tonic-gate #ifndef	_SGS_H
337c478bd9Sstevel@tonic-gate #define	_SGS_H
357c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
367c478bd9Sstevel@tonic-gate extern "C" {
377c478bd9Sstevel@tonic-gate #endif
397c478bd9Sstevel@tonic-gate /* <assert.h> keys off of NDEBUG */
407c478bd9Sstevel@tonic-gate #ifdef	DEBUG
417c478bd9Sstevel@tonic-gate #undef	NDEBUG
427c478bd9Sstevel@tonic-gate #else
437c478bd9Sstevel@tonic-gate #define	NDEBUG
447c478bd9Sstevel@tonic-gate #endif
467c478bd9Sstevel@tonic-gate #ifndef	_ASM
477c478bd9Sstevel@tonic-gate #include <sys/types.h>
487c478bd9Sstevel@tonic-gate #include <sys/machelf.h>
497c478bd9Sstevel@tonic-gate #include <stdlib.h>
501007fd6fSAli Bahrami #include <stdarg.h>
517c478bd9Sstevel@tonic-gate #include <libelf.h>
527c478bd9Sstevel@tonic-gate #include <assert.h>
537c478bd9Sstevel@tonic-gate #include <alist.h>
547c478bd9Sstevel@tonic-gate #endif	/* _ASM */
567c478bd9Sstevel@tonic-gate /*
577c478bd9Sstevel@tonic-gate  * Software identification.
587c478bd9Sstevel@tonic-gate  */
597c478bd9Sstevel@tonic-gate #define	SGS		""
607c478bd9Sstevel@tonic-gate #define	SGU_PKG		"Software Generation Utilities"
617c478bd9Sstevel@tonic-gate #define	SGU_REL		"(SGU) Solaris-ELF (4.0)"
647c478bd9Sstevel@tonic-gate #ifndef _ASM
663edf445cSab /*
673edf445cSab  * link_ver_string[] contains a version string for use by the link-editor
683edf445cSab  * and all other linker components. It is found in libconv, and is
693edf445cSab  * generated by sgs/libconv/common/bld_vernote.ksh. That script produces
703edf445cSab  * libconv/{plat}/vernote.s, which is in turn assembled/linked into
713edf445cSab  * libconv.
723edf445cSab  */
733edf445cSab extern const char link_ver_string[];
747c478bd9Sstevel@tonic-gate /*
757c478bd9Sstevel@tonic-gate  * Macro to round to next double word boundary.
767c478bd9Sstevel@tonic-gate  */
777c478bd9Sstevel@tonic-gate #define	S_DROUND(x)	(((x) + sizeof (double) - 1) & ~(sizeof (double) - 1))
797c478bd9Sstevel@tonic-gate /*
807c478bd9Sstevel@tonic-gate  * General align and round macros.
817c478bd9Sstevel@tonic-gate  */
827c478bd9Sstevel@tonic-gate #define	S_ALIGN(x, a)	((x) & ~(((a) ? (a) : 1) - 1))
837c478bd9Sstevel@tonic-gate #define	S_ROUND(x, a)   ((x) + (((a) ? (a) : 1) - 1) & ~(((a) ? (a) : 1) - 1))
857c478bd9Sstevel@tonic-gate /*
867c478bd9Sstevel@tonic-gate  * Bit manipulation macros; generic bit mask and is `v' in the range
877c478bd9Sstevel@tonic-gate  * supportable in `n' bits?
887c478bd9Sstevel@tonic-gate  */
897c478bd9Sstevel@tonic-gate #define	S_MASK(n)	((1 << (n)) -1)
907c478bd9Sstevel@tonic-gate #define	S_INRANGE(v, n)	(((-(1 << (n)) - 1) < (v)) && ((v) < (1 << (n))))
937c478bd9Sstevel@tonic-gate /*
947c478bd9Sstevel@tonic-gate  * Yet another definition of the OFFSETOF macro, used with the AVL routines.
957c478bd9Sstevel@tonic-gate  */
967c478bd9Sstevel@tonic-gate #define	SGSOFFSETOF(s, m)	((size_t)(&(((s *)0)->m)))
98c13de8f6Sab /*
99c13de8f6Sab  * When casting between integer and pointer types, gcc will complain
100c13de8f6Sab  * if the integer type used is not large enough to hold the pointer
101c13de8f6Sab  * value without loss. Although a dubious practice in general, this
102c13de8f6Sab  * is sometimes done by design. In those cases, the general solution
103c13de8f6Sab  * is to introduce an intermediate cast to widen the integer value. The
104c13de8f6Sab  * CAST_PTRINT macro does this, and its use documents the fact that
105c13de8f6Sab  * the programmer is doing that sort of cast.
106c13de8f6Sab  */
107c13de8f6Sab #ifdef __GNUC__
108c13de8f6Sab #define	CAST_PTRINT(cast, value) ((cast)(uintptr_t)value)
109c13de8f6Sab #else
110c13de8f6Sab #define	CAST_PTRINT(cast, value) ((cast)value)
111c13de8f6Sab #endif
1137c478bd9Sstevel@tonic-gate /*
1147c478bd9Sstevel@tonic-gate  * General typedefs.
1157c478bd9Sstevel@tonic-gate  */
1167c478bd9Sstevel@tonic-gate typedef enum {
1177c478bd9Sstevel@tonic-gate 	FALSE = 0,
1187c478bd9Sstevel@tonic-gate 	TRUE = 1
1197c478bd9Sstevel@tonic-gate } Boolean;
1217c478bd9Sstevel@tonic-gate /*
1221007fd6fSAli Bahrami  * Types of errors (used by veprintf()), together with a generic error return
1237c478bd9Sstevel@tonic-gate  * value.
1247c478bd9Sstevel@tonic-gate  */
1257c478bd9Sstevel@tonic-gate typedef enum {
1261007fd6fSAli Bahrami 	ERR_NONE,		/* plain message */
1271007fd6fSAli Bahrami 	ERR_WARNING_NF,		/* warning that cannot be promoted to fatal */
1281007fd6fSAli Bahrami 	ERR_WARNING,		/* warning that can be promoted to fatal */
1291007fd6fSAli Bahrami 	ERR_GUIDANCE,		/* guidance warning that can be promoted */
1301007fd6fSAli Bahrami 	ERR_FATAL,		/* fatal error */
1311007fd6fSAli Bahrami 	ERR_ELF,		/* fatal libelf error */
1321007fd6fSAli Bahrami 	ERR_NUM			/* # of Error codes. Must be last */
1337c478bd9Sstevel@tonic-gate } Error;
13569112eddSAli Bahrami /*
13669112eddSAli Bahrami  * Type used to represent line numbers within files, and a corresponding
13769112eddSAli Bahrami  * printing macro for it.
13869112eddSAli Bahrami  */
13969112eddSAli Bahrami typedef ulong_t Lineno;
14069112eddSAli Bahrami #define	EC_LINENO(_x) EC_XWORD(_x)			/* "llu" */
14169112eddSAli Bahrami 
14269112eddSAli Bahrami 
1437c478bd9Sstevel@tonic-gate #if defined(_LP64) && !defined(_ELF64)
1447c478bd9Sstevel@tonic-gate #define	S_ERROR		(~(uint_t)0)
1457c478bd9Sstevel@tonic-gate #else
1467c478bd9Sstevel@tonic-gate #define	S_ERROR		(~(uintptr_t)0)
1477c478bd9Sstevel@tonic-gate #endif
14908278a5eSRod Evans /*
15008278a5eSRod Evans  * CTF currently does not handle automatic array variables sized via function
15108278a5eSRod Evans  * arguments (VLA arrays) properly, when the code is compiled with gcc.
15208278a5eSRod Evans  * Adding 1 to the size is a workaround.  VLA_SIZE, and its use, should be
15308278a5eSRod Evans  * pulled when CTF is fixed or replaced.
15408278a5eSRod Evans  */
15508278a5eSRod Evans #ifdef __GNUC__
15608278a5eSRod Evans #define	VLA_SIZE(_arg)	((_arg) + 1)
15708278a5eSRod Evans #else
15808278a5eSRod Evans #define	VLA_SIZE(_arg)	(_arg)
15908278a5eSRod Evans #endif
16008278a5eSRod Evans 
1617c478bd9Sstevel@tonic-gate /*
1627c478bd9Sstevel@tonic-gate  * Structure to maintain rejected files elf information.  Files that are not
1637c478bd9Sstevel@tonic-gate  * applicable to the present link-edit are rejected and a search for an
1647c478bd9Sstevel@tonic-gate  * appropriate file may be resumed.  The first rejected files information is
1657c478bd9Sstevel@tonic-gate  * retained so that a better error diagnostic can be given should an appropriate
1667c478bd9Sstevel@tonic-gate  * file not be located.
1677c478bd9Sstevel@tonic-gate  */
1687c478bd9Sstevel@tonic-gate typedef struct {
1697c478bd9Sstevel@tonic-gate 	ushort_t	rej_type;	/* SGS_REJ_ value */
17056deab07SRod Evans 	ushort_t	rej_flags;	/* additional information */
1717c478bd9Sstevel@tonic-gate 	uint_t		rej_info;	/* numeric and string information */
1727c478bd9Sstevel@tonic-gate 	const char	*rej_str;	/*	associated with error */
1737c478bd9Sstevel@tonic-gate 	const char	*rej_name;	/* object name - expanded library */
1747c478bd9Sstevel@tonic-gate 					/*	name and archive members */
1757c478bd9Sstevel@tonic-gate } Rej_desc;
1777c478bd9Sstevel@tonic-gate #define	SGS_REJ_NONE		0
1787c478bd9Sstevel@tonic-gate #define	SGS_REJ_MACH		1	/* wrong ELF machine type */
1797c478bd9Sstevel@tonic-gate #define	SGS_REJ_CLASS		2	/* wrong ELF class (32-bit/64-bit) */
1807c478bd9Sstevel@tonic-gate #define	SGS_REJ_DATA		3	/* wrong ELF data format (MSG/LSB) */
1817c478bd9Sstevel@tonic-gate #define	SGS_REJ_TYPE		4	/* bad ELF type */
1827c478bd9Sstevel@tonic-gate #define	SGS_REJ_BADFLAG		5	/* bad ELF flags value */
1837c478bd9Sstevel@tonic-gate #define	SGS_REJ_MISFLAG		6	/* mismatched ELF flags value */
1847c478bd9Sstevel@tonic-gate #define	SGS_REJ_VERSION		7	/* mismatched ELF/lib version */
1857c478bd9Sstevel@tonic-gate #define	SGS_REJ_HAL		8	/* HAL R1 extensions required */
1867c478bd9Sstevel@tonic-gate #define	SGS_REJ_US3		9	/* Sun UltraSPARC III extensions */
1877c478bd9Sstevel@tonic-gate 					/*	required */
1887c478bd9Sstevel@tonic-gate #define	SGS_REJ_STR		10	/* generic error - info is a string */
1897c478bd9Sstevel@tonic-gate #define	SGS_REJ_UNKFILE		11	/* unknown file type */
19008278a5eSRod Evans #define	SGS_REJ_UNKCAP		12	/* unknown capabilities */
19108278a5eSRod Evans #define	SGS_REJ_HWCAP_1		13	/* hardware capabilities mismatch */
19208278a5eSRod Evans #define	SGS_REJ_SFCAP_1		14	/* software capabilities mismatch */
19308278a5eSRod Evans #define	SGS_REJ_MACHCAP		15	/* machine capability mismatch */
19408278a5eSRod Evans #define	SGS_REJ_PLATCAP		16	/* platform capability mismatch */
19508278a5eSRod Evans #define	SGS_REJ_HWCAP_2		17	/* hardware capabilities mismatch */
196dc0f59e5SAli Bahrami #define	SGS_REJ_ARCHIVE		18	/* archive used in invalid context */
197b6a0e2cdSRichard Lowe #define	SGS_REJ_KMOD		19	/* object is a kernel module */
198b6a0e2cdSRichard Lowe #define	SGS_REJ_NUM		20
201*fb12490aSRichard Lowe #define	FLG_REJ_ALTER		0x01	/* object name is an alternative */
202f3ecd616SRichard Lowe 
2037c478bd9Sstevel@tonic-gate /*
2047c478bd9Sstevel@tonic-gate  * Data structures (defined in libld.h).
2057c478bd9Sstevel@tonic-gate  */
20608278a5eSRod Evans typedef	struct audit_desc	Audit_desc;
20708278a5eSRod Evans typedef	struct audit_info	Audit_info;
20808278a5eSRod Evans typedef	struct audit_list	Audit_list;
20908278a5eSRod Evans typedef struct cap_desc		Cap_desc;
2107c478bd9Sstevel@tonic-gate typedef struct ent_desc		Ent_desc;
2117c478bd9Sstevel@tonic-gate typedef	struct group_desc	Group_desc;
2127c478bd9Sstevel@tonic-gate typedef struct ifl_desc		Ifl_desc;
2137c478bd9Sstevel@tonic-gate typedef struct is_desc		Is_desc;
2147c478bd9Sstevel@tonic-gate typedef struct isa_desc		Isa_desc;
2157c478bd9Sstevel@tonic-gate typedef struct isa_opt		Isa_opt;
2167c478bd9Sstevel@tonic-gate typedef struct os_desc		Os_desc;
21708278a5eSRod Evans typedef struct ofl_desc		Ofl_desc;
2187c478bd9Sstevel@tonic-gate typedef	struct rel_cache	Rel_cache;
219bf994817SAli Bahrami typedef	struct rel_cachebuf	Rel_cachebuf;
220bf994817SAli Bahrami typedef	struct rel_aux_cachebuf	Rel_aux_cachebuf;
221bf994817SAli Bahrami typedef struct rel_aux		Rel_aux;
222bf994817SAli Bahrami typedef struct rel_desc		Rel_desc;
2237c478bd9Sstevel@tonic-gate typedef	struct sdf_desc		Sdf_desc;
2247c478bd9Sstevel@tonic-gate typedef	struct sdv_desc		Sdv_desc;
22508278a5eSRod Evans typedef struct sec_order	Sec_order;
2267c478bd9Sstevel@tonic-gate typedef struct sg_desc		Sg_desc;
2277c478bd9Sstevel@tonic-gate typedef struct sort_desc	Sort_desc;
2287c478bd9Sstevel@tonic-gate typedef	struct sym_avlnode	Sym_avlnode;
22908278a5eSRod Evans typedef struct sym_aux		Sym_aux;
23008278a5eSRod Evans typedef struct sym_desc		Sym_desc;
2317c478bd9Sstevel@tonic-gate typedef	struct uts_desc		Uts_desc;
2327c478bd9Sstevel@tonic-gate typedef struct ver_desc		Ver_desc;
2337c478bd9Sstevel@tonic-gate typedef struct ver_index	Ver_index;
2355aefb655Srie /*
2365aefb655Srie  * Data structures defined in rtld.h.
2375aefb655Srie  */
2385aefb655Srie typedef struct lm_list		Lm_list;
2395aefb655Srie #ifdef _SYSCALL32
2405aefb655Srie typedef struct lm_list32	Lm_list32;
2415aefb655Srie #endif	/* _SYSCALL32 */
2437c478bd9Sstevel@tonic-gate /*
2447c478bd9Sstevel@tonic-gate  * For the various utilities that include sgs.h
2457c478bd9Sstevel@tonic-gate  */
2465aefb655Srie extern int	assfail(const char *, const char *, int);
2475aefb655Srie extern void	eprintf(Lm_list *, Error, const char *, ...);
2481007fd6fSAli Bahrami extern void	veprintf(Lm_list *, Error, const char *, va_list);
2497c478bd9Sstevel@tonic-gate extern uint_t	sgs_str_hash(const char *);
2507c478bd9Sstevel@tonic-gate extern uint_t	findprime(uint_t);
2527c478bd9Sstevel@tonic-gate #endif /* _ASM */
2547c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
2557c478bd9Sstevel@tonic-gate }
2567c478bd9Sstevel@tonic-gate #endif
2597c478bd9Sstevel@tonic-gate #endif /* _SGS_H */