xref: /illumos-gate/usr/src/cmd/sgs/rtld/common/globals.c (revision 56726c7e)
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  */
21bebb829dSRod Evans 
227c478bd9Sstevel@tonic-gate /*
237c478bd9Sstevel@tonic-gate  *	Copyright (c) 1988 AT&T
247c478bd9Sstevel@tonic-gate  *	  All Rights Reserved
257c478bd9Sstevel@tonic-gate  *
26dc0f59e5SAli Bahrami  * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
27*56726c7eSRobert Mustacchi  * Copyright 2022 Oxide Computer Company
287c478bd9Sstevel@tonic-gate  */
297c478bd9Sstevel@tonic-gate 
307c478bd9Sstevel@tonic-gate #include	<sys/types.h>
317c478bd9Sstevel@tonic-gate #include	<sys/mman.h>
327c478bd9Sstevel@tonic-gate #include	<signal.h>
337c478bd9Sstevel@tonic-gate #include	<dlfcn.h>
347c478bd9Sstevel@tonic-gate #include	<synch.h>
355aefb655Srie #include	<debug.h>
367c478bd9Sstevel@tonic-gate #include	"_rtld.h"
377c478bd9Sstevel@tonic-gate 
387c478bd9Sstevel@tonic-gate /*
397c478bd9Sstevel@tonic-gate  * Declarations of global variables used in ld.so.
407c478bd9Sstevel@tonic-gate  */
417c478bd9Sstevel@tonic-gate Rt_lock		rtldlock;
428cd45542Sraf int		thr_flg_nolock = 0;
438cd45542Sraf int		thr_flg_reenter = 0;
447c478bd9Sstevel@tonic-gate 
457c478bd9Sstevel@tonic-gate /*
467c478bd9Sstevel@tonic-gate  * Major link-map lists.
477c478bd9Sstevel@tonic-gate  */
487c478bd9Sstevel@tonic-gate Lm_list		lml_main =	{ 0 };		/* the `main's link map list */
497c478bd9Sstevel@tonic-gate Lm_list		lml_rtld =	{ 0 };		/* rtld's link map list */
507c478bd9Sstevel@tonic-gate 
5175e7992aSrie /*
529aa23310Srie  * Entrance count.  Each time ld.so.1 is entered following initial process
539aa23310Srie  * setup, this count is bumped.  This value serves to identify the present
549aa23310Srie  * ld.so.1 operation.
559aa23310Srie  *
569aa23310Srie  * An ld.so.1 operation can result in many symbol lookup requests (i.e., loading
579aa23310Srie  * objects and relocating all symbolic bindings).  This count is used to protect
589aa23310Srie  * against attempting to re-load a failed lazy load within a single call to
599aa23310Srie  * ld.so.1, while allowing such attempts across calls.  Should a lazy load fail,
609aa23310Srie  * the present operation identifier is saved in the current symbol lookup data
6175e7992aSrie  * block (Slookup).  Should a lazy load fall back operation be triggered, the
629aa23310Srie  * identifier in the symbol lookup block is compared to the current ld.so.1
6375e7992aSrie  * entry count, and if the two are equal the fall back is skipped.
6475e7992aSrie  *
6575e7992aSrie  * With this count, there is a danger of wrap-around, although as an unsigned
6675e7992aSrie  * 32-bit value, it is highly unlikely that any application could usefully make
6775e7992aSrie  * 4.3 giga-calls into ld.so.1.  The worst that can occur is that a fall back
6875e7992aSrie  * lazy load isn't triggered.  However, most lazy loads that fail typically
6975e7992aSrie  * continue to fail unless the user takes corrective action (adds the necessary
709aa23310Srie  * (fixed) dependencies to the system).
7175e7992aSrie  */
729aa23310Srie ulong_t		ld_entry_cnt = 1;
7375e7992aSrie 
747c478bd9Sstevel@tonic-gate /*
757c478bd9Sstevel@tonic-gate  * BEGIN: Exposed to rtld_db, don't change without a coordinated handshake with
767c478bd9Sstevel@tonic-gate  * librtld_db (remembering that librtld_db must be able to read old as well as
777c478bd9Sstevel@tonic-gate  * current core files).
787c478bd9Sstevel@tonic-gate  */
7957ef7aa9SRod Evans APlist		*dynlm_list = NULL;	/* dynamic list of link-maps */
807c478bd9Sstevel@tonic-gate /*
817c478bd9Sstevel@tonic-gate  * END: Exposed to rtld_db
827c478bd9Sstevel@tonic-gate  */
837c478bd9Sstevel@tonic-gate 
8408278a5eSRod Evans Reglist		*reglist = NULL;	/* list of register symbols */
857c478bd9Sstevel@tonic-gate 
867c478bd9Sstevel@tonic-gate /*
879aa23310Srie  * Set of integers to track how many of what type of PLT's have been bound.
889aa23310Srie  * This is only really interesting for SPARC since ia32 has only one PLT.
897c478bd9Sstevel@tonic-gate  */
907c478bd9Sstevel@tonic-gate uint32_t	pltcnt21d = 0;
917c478bd9Sstevel@tonic-gate uint32_t	pltcnt24d = 0;
927c478bd9Sstevel@tonic-gate uint32_t	pltcntu32 = 0;
937c478bd9Sstevel@tonic-gate uint32_t	pltcntu44 = 0;
947c478bd9Sstevel@tonic-gate uint32_t	pltcntfull = 0;
957c478bd9Sstevel@tonic-gate uint32_t	pltcntfar = 0;
967c478bd9Sstevel@tonic-gate 
979aa23310Srie /*
9808278a5eSRod Evans  * AVL tree pointers.
999aa23310Srie  */
10008278a5eSRod Evans avl_tree_t	*capavl = NULL;		/* capabilities files */
10108278a5eSRod Evans avl_tree_t	*nfavl = NULL;		/* not-found path names */
10208278a5eSRod Evans avl_tree_t	*spavl = NULL;		/* secure path names */
1039aa23310Srie 
1047c478bd9Sstevel@tonic-gate /*
10556deab07SRod Evans  * Various other global data.
1067c478bd9Sstevel@tonic-gate  */
10756deab07SRod Evans uint_t		rtld_flags = 0;
1087c478bd9Sstevel@tonic-gate uint_t		rtld_flags2 = 0;
1097c478bd9Sstevel@tonic-gate 
11010a4fa49Srie Lc_desc		glcs[CI_MAX];		/* global external interfaces */
11110a4fa49Srie 
11256deab07SRod Evans const char	*procname = NULL;
11341072f3cSrie const char	*rtldname = MSG_ORIG(MSG_FIL_RTLD);
11441072f3cSrie 
11556deab07SRod Evans char		*lasterr = NULL;	/* string describing last error */
1162020b2b6SRod Evans 					/*    cleared by each dlerror() */
11756deab07SRod Evans Interp		*interp = NULL;		/* ELF interpreter info */
11856deab07SRod Evans APlist		*hdl_alp[HDLIST_SZ+2];	/* dlopen() handle list */
1197c478bd9Sstevel@tonic-gate size_t		syspagsz = 0;		/* system page size */
12056deab07SRod Evans ulong_t		at_flags = 0;		/* machine specific file flags */
121b6a0e2cdSRichard Lowe Uts_desc	*uts = NULL;		/* utsname descriptor */
12256deab07SRod Evans Isa_desc	*isa = NULL;		/* isalist descriptor */
1237c478bd9Sstevel@tonic-gate 
1247c478bd9Sstevel@tonic-gate uint_t		audit_argcnt = 64;	/* no. of stack args to copy (default */
1252020b2b6SRod Evans 					/*    is all) */
12656deab07SRod Evans Audit_desc	*auditors = NULL;	/* global auditors (LD_AUDIT) */
1272020b2b6SRod Evans APlist		*aud_preinit = NULL;	/* list of objects defining local */
1282020b2b6SRod Evans APlist		*aud_activity = NULL;	/*    preinit and activity auditors */
12956deab07SRod Evans 
13056deab07SRod Evans const char	*rpl_audit = NULL;	/* replaceable LD_AUDIT string */
13156deab07SRod Evans const char	*rpl_debug = NULL;	/* replaceable LD_DEBUG string */
13256deab07SRod Evans const char	*rpl_ldflags = NULL;	/* replaceable LD_FLAGS string */
13356deab07SRod Evans const char	*rpl_libpath = NULL;	/* replaceable LD_LIBRARY_PATH string */
1342020b2b6SRod Evans Alist		*rpl_libdirs = NULL;	/*    and associated Pdesc list */
13556deab07SRod Evans const char	*rpl_preload = NULL;	/* replaceable LD_PRELOAD string */
13656deab07SRod Evans 
13756deab07SRod Evans const char	*prm_audit = NULL;	/* permanent LD_AUDIT string */
13856deab07SRod Evans const char	*prm_debug = NULL;	/* permanent LD_DEBUG string */
13956deab07SRod Evans const char	*prm_ldflags = NULL;	/* permanent LD_FLAGS string */
14056deab07SRod Evans const char	*prm_libpath = NULL;	/* permanent LD_LIBRARY_PATH string */
1412020b2b6SRod Evans Alist		*prm_libdirs = NULL;	/*    and associated Pdesc list */
14256deab07SRod Evans const char	*prm_preload = NULL;	/* permanent LD_PRELOAD string */
1437c478bd9Sstevel@tonic-gate 
1447c478bd9Sstevel@tonic-gate uint_t		env_info = 0;		/* information regarding environment */
1452020b2b6SRod Evans 					/*    variables */
1467c478bd9Sstevel@tonic-gate int		killsig = SIGKILL;	/* signal sent on fatal exit */
14756deab07SRod Evans APlist		*free_alp = NULL;	/* defragmentation list */
1485aefb655Srie 
14908278a5eSRod Evans /*
15008278a5eSRod Evans  * Capabilities are provided by the system.  However, users can define an
15108278a5eSRod Evans  * alternative set of system capabilities, where they can add, subtract, or
15208278a5eSRod Evans  * override the system capabilities for testing purposes.  Furthermore, these
15308278a5eSRod Evans  * alternative capabilities can be specified such that they only apply to
15408278a5eSRod Evans  * specified files rather than to all objects.
155f3390f39SRobert Mustacchi  *
156f3390f39SRobert Mustacchi  * The org_scapset is relied upon by the amd64 version of elf_rtbndr to
157f3390f39SRobert Mustacchi  * determine whether or not AVX registers are present in the system.
15808278a5eSRod Evans  */
15908278a5eSRod Evans static Syscapset	scapset = { 0 };
16008278a5eSRod Evans Syscapset	*org_scapset = &scapset;	/* original system and */
16108278a5eSRod Evans Syscapset	*alt_scapset = &scapset;	/* alternative system */
16208278a5eSRod Evans 						/*	capabilities */
16308278a5eSRod Evans 
16408278a5eSRod Evans const char	*rpl_hwcap = NULL;	/* replaceable hwcap str */
16508278a5eSRod Evans const char	*rpl_sfcap = NULL;	/* replaceable sfcap str */
16608278a5eSRod Evans const char	*rpl_machcap = NULL;	/* replaceable machcap str */
16708278a5eSRod Evans const char	*rpl_platcap = NULL;	/* replaceable platcap str */
16808278a5eSRod Evans const char	*rpl_cap_files = NULL;	/* associated files */
16908278a5eSRod Evans 
17008278a5eSRod Evans const char	*prm_hwcap = NULL;	/* permanent hwcap str */
17108278a5eSRod Evans const char	*prm_sfcap = NULL;	/* permanent sfcap str */
17208278a5eSRod Evans const char	*prm_machcap = NULL;	/* permanent machcap str */
17308278a5eSRod Evans const char	*prm_platcap = NULL;	/* permanent platcap str */
17408278a5eSRod Evans const char	*prm_cap_files = NULL;	/* associated files */
17508278a5eSRod Evans 
1765aefb655Srie /*
1775aefb655Srie  * Note, the debugging descriptor interposes on the default definition provided
1785aefb655Srie  * by liblddbg.  This is required as ld.so.1 must only have outstanding relative
1795aefb655Srie  * relocations.
1805aefb655Srie  */
1815aefb655Srie static Dbg_desc	_dbg_desc = {0, 0, 0};
1825aefb655Srie Dbg_desc	*dbg_desc = &_dbg_desc;	/* debugging descriptor */
18356deab07SRod Evans const char	*dbg_file = NULL;	/* debugging directed to file */
1847c478bd9Sstevel@tonic-gate 
1857c478bd9Sstevel@tonic-gate #pragma weak	environ = _environ	/* environ for PLT tracing - we */
18656deab07SRod Evans char		**_environ = NULL;	/* supply the pair to satisfy any */
1877c478bd9Sstevel@tonic-gate 					/* libc requirements (hwmuldiv) */
1887c478bd9Sstevel@tonic-gate 
18956deab07SRod Evans const char	*profile_name = NULL;	/* object being profiled */
19056deab07SRod Evans const char	*profile_out = NULL;	/* profile output file */
19156deab07SRod Evans const char	*profile_lib = NULL;	/* audit library to perform profile */
1927c478bd9Sstevel@tonic-gate 
19356deab07SRod Evans uchar_t		search_rules[] = {	/* dependency search rules */
1947c478bd9Sstevel@tonic-gate 		RPLENV,			/*	replaceable LD_LIBRARY_PATH */
1957c478bd9Sstevel@tonic-gate 		PRMENV,			/*	permanent LD_LIBRARY_PATH */
1967c478bd9Sstevel@tonic-gate 		RUNPATH,		/*	callers runpath */
1977c478bd9Sstevel@tonic-gate 		DEFAULT,		/*	default library path */
1987c478bd9Sstevel@tonic-gate 		0
1997c478bd9Sstevel@tonic-gate };
2007c478bd9Sstevel@tonic-gate 
20141072f3cSrie Dl_argsinfo	argsinfo = { 0 };	/* process argument, environment and */
20241072f3cSrie 					/*	auxv information. */
20341072f3cSrie 
2047c478bd9Sstevel@tonic-gate /*
2057c478bd9Sstevel@tonic-gate  * Frequently used messages are cached here to reduce _dgettext() overhead and
2067c478bd9Sstevel@tonic-gate  * also provide for resetting should the locale change (see _ld_libc()).
2077c478bd9Sstevel@tonic-gate  */
20843d7826aSRod Evans const char	*err_strs[ERR_NUM] = { NULL };
20956deab07SRod Evans const char	*nosym_str = NULL;
2107c478bd9Sstevel@tonic-gate 
2117c478bd9Sstevel@tonic-gate 
2127c478bd9Sstevel@tonic-gate /*
2137c478bd9Sstevel@tonic-gate  * Rejection error message tables.
2147c478bd9Sstevel@tonic-gate  */
2157c478bd9Sstevel@tonic-gate const Msg
216dc0f59e5SAli Bahrami ldd_reject[SGS_REJ_NUM] = {
2177c478bd9Sstevel@tonic-gate 		MSG_STR_EMPTY,
2187c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_MACH,	/* MSG_INTL(MSG_LDD_REJ_MACH) */
2197c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_CLASS,	/* MSG_INTL(MSG_LDD_REJ_CLASS) */
2207c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_DATA,	/* MSG_INTL(MSG_LDD_REJ_DATA) */
2217c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_TYPE,	/* MSG_INTL(MSG_LDD_REJ_TYPE) */
2227c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_BADFLAG,	/* MSG_INTL(MSG_LDD_REJ_BADFLAG) */
2237c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_MISFLAG,	/* MSG_INTL(MSG_LDD_REJ_MISFLAG) */
2247c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_VERSION,	/* MSG_INTL(MSG_LDD_REJ_VERSION) */
2257c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_HAL,	/* MSG_INTL(MSG_LDD_REJ_HAL) */
2267c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_US3,	/* MSG_INTL(MSG_LDD_REJ_US3) */
2277c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_STR,	/* MSG_INTL(MSG_LDD_REJ_STR) */
2287c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_UNKFILE,	/* MSG_INTL(MSG_LDD_REJ_UNKFILE) */
22908278a5eSRod Evans 		MSG_LDD_REJ_UNKCAP,	/* MSG_INTL(MSG_LDD_REJ_UNKCAP) */
2307c478bd9Sstevel@tonic-gate 		MSG_LDD_REJ_HWCAP_1,	/* MSG_INTL(MSG_LDD_REJ_HWCAP_1) */
231bebb829dSRod Evans 		MSG_LDD_REJ_SFCAP_1,	/* MSG_INTL(MSG_LDD_REJ_SFCAP_1) */
23208278a5eSRod Evans 		MSG_LDD_REJ_MACHCAP,	/* MSG_INTL(MSG_LDD_REJ_MACHCAP) */
23308278a5eSRod Evans 		MSG_LDD_REJ_PLATCAP,	/* MSG_INTL(MSG_LDD_REJ_PLATCAP) */
234dc0f59e5SAli Bahrami 		MSG_LDD_REJ_HWCAP_2,	/* MSG_INTL(MSG_LDD_REJ_HWCAP_2) */
235b6a0e2cdSRichard Lowe 		MSG_LDD_REJ_ARCHIVE,	/* MSG_INTL(MSG_LDD_REJ_ARCHIVE) */
236*56726c7eSRobert Mustacchi 		MSG_LDD_REJ_KMOD,	/* MSG_INTL(MSG_LDD_REJ_KMOD) */
237*56726c7eSRobert Mustacchi 		MSG_LDD_REJ_HWCAP_3	/* MSG_INTL(MSG_LDD_REJ_HWCAP_3) */
2387c478bd9Sstevel@tonic-gate 	};
239*56726c7eSRobert Mustacchi #if SGS_REJ_NUM != (SGS_REJ_HWCAP_3 + 1)
240dc0f59e5SAli Bahrami #error SGS_REJ_NUM has changed
241dc0f59e5SAli Bahrami #endif
2427c478bd9Sstevel@tonic-gate 
2437c478bd9Sstevel@tonic-gate const Msg
244dc0f59e5SAli Bahrami err_reject[SGS_REJ_NUM] = {
2457c478bd9Sstevel@tonic-gate 		MSG_STR_EMPTY,
2467c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_MACH,	/* MSG_INTL(MSG_ERR_REJ_MACH) */
2477c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_CLASS,	/* MSG_INTL(MSG_ERR_REJ_CLASS) */
2487c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_DATA,	/* MSG_INTL(MSG_ERR_REJ_DATA) */
2497c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_TYPE,	/* MSG_INTL(MSG_ERR_REJ_TYPE) */
2507c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_BADFLAG,	/* MSG_INTL(MSG_ERR_REJ_BADFLAG) */
2517c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_MISFLAG,	/* MSG_INTL(MSG_ERR_REJ_MISFLAG) */
2527c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_VERSION,	/* MSG_INTL(MSG_ERR_REJ_VERSION) */
2537c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_HAL,	/* MSG_INTL(MSG_ERR_REJ_HAL) */
2547c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_US3,	/* MSG_INTL(MSG_ERR_REJ_US3) */
2557c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_STR,	/* MSG_INTL(MSG_ERR_REJ_STR) */
2567c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_UNKFILE,	/* MSG_INTL(MSG_ERR_REJ_UNKFILE) */
25708278a5eSRod Evans 		MSG_ERR_REJ_UNKCAP,	/* MSG_INTL(MSG_ERR_REJ_UNKCAP) */
2587c478bd9Sstevel@tonic-gate 		MSG_ERR_REJ_HWCAP_1,	/* MSG_INTL(MSG_ERR_REJ_HWCAP_1) */
259bebb829dSRod Evans 		MSG_ERR_REJ_SFCAP_1,	/* MSG_INTL(MSG_ERR_REJ_SFCAP_1) */
26008278a5eSRod Evans 		MSG_ERR_REJ_MACHCAP,	/* MSG_INTL(MSG_ERR_REJ_MACHCAP) */
26108278a5eSRod Evans 		MSG_ERR_REJ_PLATCAP,	/* MSG_INTL(MSG_ERR_REJ_PLATCAP) */
262dc0f59e5SAli Bahrami 		MSG_ERR_REJ_HWCAP_2,	/* MSG_INTL(MSG_ERR_REJ_HWCAP_2) */
263dc0f59e5SAli Bahrami 		MSG_ERR_REJ_ARCHIVE,	/* MSG_INTL(MSG_ERR_REJ_ARCHIVE) */
264b6a0e2cdSRichard Lowe 		MSG_ERR_REJ_KMOD,	/* MSG_INTL(MSG_ERR_REJ_KMOD) */
265*56726c7eSRobert Mustacchi 		MSG_ERR_REJ_HWCAP_3	/* MSG_INTL(MSG_ERR_REJ_HWCAP_3) */
26608278a5eSRod Evans 	};
267*56726c7eSRobert Mustacchi #if SGS_REJ_NUM != (SGS_REJ_HWCAP_3 + 1)
268dc0f59e5SAli Bahrami #error SGS_REJ_NUM has changed
269dc0f59e5SAli Bahrami #endif
27008278a5eSRod Evans 
27108278a5eSRod Evans const Msg
272dc0f59e5SAli Bahrami ldd_warn[SGS_REJ_NUM] = {
27308278a5eSRod Evans 		MSG_STR_EMPTY,
27408278a5eSRod Evans 		MSG_STR_EMPTY,
27508278a5eSRod Evans 		MSG_STR_EMPTY,
27608278a5eSRod Evans 		MSG_STR_EMPTY,
27708278a5eSRod Evans 		MSG_STR_EMPTY,
27808278a5eSRod Evans 		MSG_STR_EMPTY,
27908278a5eSRod Evans 		MSG_STR_EMPTY,
28008278a5eSRod Evans 		MSG_STR_EMPTY,
28108278a5eSRod Evans 		MSG_STR_EMPTY,
28208278a5eSRod Evans 		MSG_STR_EMPTY,
28308278a5eSRod Evans 		MSG_STR_EMPTY,
28408278a5eSRod Evans 		MSG_STR_EMPTY,
28508278a5eSRod Evans 		MSG_LDD_WARN_UNKCAP,	/* MSG_INTL(MSG_LDD_WARN_UNKCAP) */
28608278a5eSRod Evans 		MSG_LDD_WARN_HWCAP_1,	/* MSG_INTL(MSG_LDD_WARN_HWCAP_1) */
28708278a5eSRod Evans 		MSG_LDD_WARN_SFCAP_1,	/* MSG_INTL(MSG_LDD_WARN_SFCAP_1) */
28808278a5eSRod Evans 		MSG_LDD_WARN_MACHCAP,	/* MSG_INTL(MSG_LDD_WARN_MACHCAP) */
28908278a5eSRod Evans 		MSG_LDD_WARN_PLATCAP,	/* MSG_INTL(MSG_LDD_WARN_PLATCAP) */
290dc0f59e5SAli Bahrami 		MSG_LDD_WARN_HWCAP_2,	/* MSG_INTL(MSG_LDD_WARN_HWCAP_2) */
291b6a0e2cdSRichard Lowe 		MSG_STR_EMPTY,
292b6a0e2cdSRichard Lowe 		MSG_STR_EMPTY,
293*56726c7eSRobert Mustacchi 		MSG_LDD_WARN_HWCAP_3	/* MSG_INTL(MSG_LDD_WARN_HWCAP_3) */
2947c478bd9Sstevel@tonic-gate 	};
295*56726c7eSRobert Mustacchi #if SGS_REJ_NUM != (SGS_REJ_HWCAP_3 + 1)
296dc0f59e5SAli Bahrami #error SGS_REJ_NUM has changed
297dc0f59e5SAli Bahrami #endif
298