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 (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
  28  *
  29  * Global include file for all sgs.
  30  */
  31 
  32 #ifndef _SGS_H
  33 #define _SGS_H
  34 
  35 #ifdef  __cplusplus
  36 extern "C" {
  37 #endif
  38 
  39 /* <assert.h> keys off of NDEBUG */
  40 #ifdef  DEBUG
  41 #undef  NDEBUG
  42 #else
  43 #define NDEBUG
  44 #endif
  45 
  46 #ifndef _ASM
  47 #include <sys/types.h>
  48 #include <sys/machelf.h>
  49 #include <stdlib.h>
  50 #include <stdarg.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 veprintf()), together with a generic error return
 123  * value.
 124  */
 125 typedef enum {
 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 */
 133 } Error;
 134 
 135 /*
 136  * Type used to represent line numbers within files, and a corresponding
 137  * printing macro for it.
 138  */
 139 typedef ulong_t Lineno;
 140 #define EC_LINENO(_x) EC_XWORD(_x)                      /* "llu" */
 141 
 142 
 143 #if defined(_LP64) && !defined(_ELF64)
 144 #define S_ERROR         (~(uint_t)0)
 145 #else
 146 #define S_ERROR         (~(uintptr_t)0)
 147 #endif
 148 
 149 /*
 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.
 154  */
 155 #ifdef __GNUC__
 156 #define VLA_SIZE(_arg)  ((_arg) + 1)
 157 #else
 158 #define VLA_SIZE(_arg)  (_arg)
 159 #endif
 160 
 161 /*
 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.
 167  */
 168 typedef struct {
 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 */
 175 } Rej_desc;
 176 
 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 */
 187                                         /*      required */
 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_KMOD            19      /* object is a kernel module */
 198 #define SGS_REJ_NUM             20
 199 
 200 #define FLG_REJ_ALTER           0x01    /* object name is an alternative */
 201 
 202 /*
 203  * For those source files used both inside and outside of the
 204  * libld source base (tools/common/string_table.c) we can
 205  * automatically switch between the allocation models
 206  * based off of the 'cc -DUSE_LIBLD_MALLOC' flag.
 207  */
 208 #ifdef  USE_LIBLD_MALLOC
 209 #define calloc(x, a)            libld_malloc(((size_t)x) * ((size_t)a))
 210 #define free                    libld_free
 211 #define malloc                  libld_malloc
 212 #define realloc                 libld_realloc
 213 
 214 #define libld_calloc(x, a)      libld_malloc(((size_t)x) * ((size_t)a))
 215 extern void                     libld_free(void *);
 216 extern void                     *libld_malloc(size_t);
 217 extern void                     *libld_realloc(void *, size_t);
 218 #endif
 219 
 220 /*
 221  * Data structures (defined in libld.h).
 222  */
 223 typedef struct audit_desc       Audit_desc;
 224 typedef struct audit_info       Audit_info;
 225 typedef struct audit_list       Audit_list;
 226 typedef struct cap_desc         Cap_desc;
 227 typedef struct ent_desc         Ent_desc;
 228 typedef struct group_desc       Group_desc;
 229 typedef struct ifl_desc         Ifl_desc;
 230 typedef struct is_desc          Is_desc;
 231 typedef struct isa_desc         Isa_desc;
 232 typedef struct isa_opt          Isa_opt;
 233 typedef struct os_desc          Os_desc;
 234 typedef struct ofl_desc         Ofl_desc;
 235 typedef struct rel_cache        Rel_cache;
 236 typedef struct rel_cachebuf     Rel_cachebuf;
 237 typedef struct rel_aux_cachebuf Rel_aux_cachebuf;
 238 typedef struct rel_aux          Rel_aux;
 239 typedef struct rel_desc         Rel_desc;
 240 typedef struct sdf_desc         Sdf_desc;
 241 typedef struct sdv_desc         Sdv_desc;
 242 typedef struct sec_order        Sec_order;
 243 typedef struct sg_desc          Sg_desc;
 244 typedef struct sort_desc        Sort_desc;
 245 typedef struct sym_avlnode      Sym_avlnode;
 246 typedef struct sym_aux          Sym_aux;
 247 typedef struct sym_desc         Sym_desc;
 248 typedef struct uts_desc         Uts_desc;
 249 typedef struct ver_desc         Ver_desc;
 250 typedef struct ver_index        Ver_index;
 251 
 252 /*
 253  * Data structures defined in rtld.h.
 254  */
 255 typedef struct lm_list          Lm_list;
 256 #ifdef _SYSCALL32
 257 typedef struct lm_list32        Lm_list32;
 258 #endif  /* _SYSCALL32 */
 259 
 260 /*
 261  * For the various utilities that include sgs.h
 262  */
 263 extern int      assfail(const char *, const char *, int);
 264 extern void     eprintf(Lm_list *, Error, const char *, ...);
 265 extern void     veprintf(Lm_list *, Error, const char *, va_list);
 266 extern uint_t   sgs_str_hash(const char *);
 267 extern uint_t   findprime(uint_t);
 268 
 269 #endif /* _ASM */
 270 
 271 #ifdef  __cplusplus
 272 }
 273 #endif
 274 
 275 
 276 #endif /* _SGS_H */