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  * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
  23  */
  24 
  25 #ifndef _LINK_H
  26 #define _LINK_H
  27 
  28 #include <sys/link.h>
  29 
  30 #ifndef _ASM
  31 #include <elf.h>
  32 #include <sys/types.h>
  33 #include <dlfcn.h>
  34 #endif
  35 
  36 #ifdef  __cplusplus
  37 extern "C" {
  38 #endif
  39 
  40 #ifndef _ASM
  41 /*
  42  * ld support library calls.
  43  *
  44  * These cannot be used in a 32bit large file capable environment,
  45  * thanks to the use of libelf.
  46  */
  47 #if !defined(_ILP32) || _FILE_OFFSET_BITS != 64
  48 #ifdef __STDC__
  49 #include <libelf.h>
  50 extern uint_t   ld_version(uint_t);
  51 extern void     ld_input_done(uint_t *);
  52 
  53 extern void     ld_start(const char *, const Elf32_Half, const char *);
  54 extern void     ld_atexit(int);
  55 extern void     ld_open(const char **, const char **, int *, int, Elf **,
  56                         Elf *, size_t, const Elf_Kind);
  57 extern void     ld_file(const char *, const Elf_Kind, int, Elf *);
  58 extern void     ld_input_section(const char *, Elf32_Shdr **, Elf32_Word,
  59                         Elf_Data *, Elf *, uint_t *);
  60 extern void     ld_section(const char *, Elf32_Shdr *, Elf32_Word,
  61                         Elf_Data *, Elf *);
  62 
  63 #if defined(_LP64) || defined(_LONGLONG_TYPE)
  64 extern void     ld_start64(const char *, const Elf64_Half, const char *);
  65 extern void     ld_atexit64(int);
  66 extern void     ld_open64(const char **, const char **, int *, int, Elf **,
  67                         Elf *, size_t, const Elf_Kind);
  68 extern void     ld_file64(const char *, const Elf_Kind, int, Elf *);
  69 extern void     ld_input_section64(const char *, Elf64_Shdr **, Elf64_Word,
  70                         Elf_Data *, Elf *, uint_t *);
  71 extern void     ld_section64(const char *, Elf64_Shdr *, Elf64_Word,
  72                         Elf_Data *, Elf *);
  73 
  74 #endif /* (defined(_LP64) || defined(_LONGLONG_TYPE) */
  75 #else
  76 extern void     ld_version();
  77 extern void     ld_input_done();
  78 
  79 extern void     ld_start();
  80 extern void     ld_atexit();
  81 extern void     ld_open();
  82 extern void     ld_file();
  83 extern void     ld_input_section();
  84 extern void     ld_section();
  85 
  86 #if defined(_LP64) || defined(_LONGLONG_TYPE)
  87 extern void     ld_start64();
  88 extern void     ld_atexit64();
  89 extern void     ld_open64();
  90 extern void     ld_file64();
  91 extern void     ld_input_section64();
  92 extern void     ld_section64();
  93 
  94 #endif /* (defined(_LP64) || defined(_LONGLONG_TYPE) */
  95 #endif /* __STDC__ */
  96 #endif /* !defined(_ILP32) || _FILE_OFFSET_BITS != 64 */
  97 
  98 /*
  99  * ld_version() version values.
 100  */
 101 #define LD_SUP_VNONE    0
 102 #define LD_SUP_VERSION1 1
 103 #define LD_SUP_VERSION2 2
 104 #define LD_SUP_VERSION3 3
 105 #define LD_SUP_VCURRENT LD_SUP_VERSION3
 106 
 107 /*
 108  * Flags passed to ld support calls.
 109  */
 110 #define LD_SUP_DERIVED          0x1     /* derived filename */
 111 #define LD_SUP_INHERITED        0x2     /* file inherited from .so DT_NEEDED */
 112 #define LD_SUP_EXTRACTED        0x4     /* file extracted from archive */
 113 #endif
 114 
 115 /*
 116  * Runtime link-map identifiers.
 117  */
 118 #define LM_ID_BASE              0x00
 119 #define LM_ID_LDSO              0x01
 120 #define LM_ID_NUM               2
 121 
 122 #define LM_ID_BRAND             0xfd    /* brand emulation linkmap objs */
 123 #define LM_ID_NONE              0xfe    /* no link map specified */
 124 #define LM_ID_NEWLM             0xff    /* create a new link-map */
 125 
 126 /*
 127  * Runtime Link-Edit Auditing.
 128  */
 129 #define LAV_NONE                0
 130 #define LAV_VERSION1            1
 131 #define LAV_VERSION2            2
 132 #define LAV_VERSION3            3
 133 #define LAV_VERSION4            4
 134 #define LAV_VERSION5            5
 135 #define LAV_CURRENT             LAV_VERSION5
 136 #define LAV_NUM                 6
 137 
 138 /*
 139  * Flags that can be or'd into the la_objopen() return code
 140  */
 141 #define LA_FLG_BINDTO           0x0001  /* audit symbinds TO this object */
 142 #define LA_FLG_BINDFROM         0x0002  /* audit symbinding FROM this object */
 143 
 144 /*
 145  * Flags that can be or'd into the 'flags' argument of la_symbind()
 146  */
 147 #define LA_SYMB_NOPLTENTER      0x0001  /* disable pltenter for this symbol */
 148 #define LA_SYMB_NOPLTEXIT       0x0002  /* disable pltexit for this symbol */
 149 #define LA_SYMB_STRUCTCALL      0x0004  /* this function call passes a */
 150                                         /*      structure as it's return code */
 151 #define LA_SYMB_DLSYM           0x0008  /* this symbol bindings is due to */
 152                                         /*      a call to dlsym() */
 153 #define LA_SYMB_ALTVALUE        0x0010  /* alternate symbol binding returned */
 154                                         /*      by la_symbind() */
 155 
 156 /*
 157  * Flags that describe the object passed to la_objsearch()
 158  */
 159 #define LA_SER_ORIG             0x001   /* original (needed) name */
 160 #define LA_SER_LIBPATH          0x002   /* LD_LIBRARY_PATH entry prepended */
 161 #define LA_SER_RUNPATH          0x004   /* runpath entry prepended */
 162 #define LA_SER_CONFIG           0x008   /* configuration entry prepended */
 163 #define LA_SER_DEFAULT          0x040   /* default path prepended */
 164 #define LA_SER_SECURE           0x080   /* default (secure) path prepended */
 165 
 166 #define LA_SER_MASK             0xfff   /* mask of known flags */
 167 
 168 /*
 169  * Flags that describe the la_activity()
 170  */
 171 #define LA_ACT_CONSISTENT       0x00    /* add/deletion of objects complete */
 172 #define LA_ACT_ADD              0x01    /* objects being added */
 173 #define LA_ACT_DELETE           0x02    /* objects being deleted */
 174 #define LA_ACT_MAX              3
 175 
 176 
 177 #ifndef _KERNEL
 178 #ifndef _ASM
 179 
 180 #if defined(_LP64)
 181 typedef long    lagreg_t;
 182 #else
 183 typedef int     lagreg_t;
 184 #endif
 185 
 186 struct _la_sparc_regs {
 187         lagreg_t        lr_rego0;
 188         lagreg_t        lr_rego1;
 189         lagreg_t        lr_rego2;
 190         lagreg_t        lr_rego3;
 191         lagreg_t        lr_rego4;
 192         lagreg_t        lr_rego5;
 193         lagreg_t        lr_rego6;
 194         lagreg_t        lr_rego7;
 195 };
 196 
 197 #if defined(_LP64)
 198 typedef struct _la_sparc_regs   La_sparcv9_regs;
 199 typedef struct {
 200         lagreg_t        lr_rsp;
 201         lagreg_t        lr_rbp;
 202         lagreg_t        lr_rdi;     /* arg1 */
 203         lagreg_t        lr_rsi;     /* arg2 */
 204         lagreg_t        lr_rdx;     /* arg3 */
 205         lagreg_t        lr_rcx;     /* arg4 */
 206         lagreg_t        lr_r8;      /* arg5 */
 207         lagreg_t        lr_r9;      /* arg6 */
 208 } La_amd64_regs;
 209 #else
 210 typedef struct _la_sparc_regs   La_sparcv8_regs;
 211 typedef struct {
 212         lagreg_t        lr_esp;
 213         lagreg_t        lr_ebp;
 214 } La_i86_regs;
 215 #endif
 216 
 217 #if     !defined(_SYS_INT_TYPES_H)
 218 #if     defined(_LP64) || defined(_I32LPx)
 219 typedef unsigned long           uintptr_t;
 220 #else
 221 typedef unsigned int            uintptr_t;
 222 #endif
 223 #endif
 224 
 225 
 226 #ifdef  __STDC__
 227 extern uint_t           la_version(uint_t);
 228 extern void             la_activity(uintptr_t *, uint_t);
 229 extern void             la_preinit(uintptr_t *);
 230 extern char             *la_objsearch(const char *, uintptr_t *, uint_t);
 231 extern uint_t           la_objopen(Link_map *, Lmid_t, uintptr_t *);
 232 extern uint_t           la_objclose(uintptr_t *);
 233 extern int              la_objfilter(uintptr_t *, const char *, uintptr_t *,
 234                                 uint_t);
 235 #if     defined(_LP64)
 236 extern uintptr_t        la_amd64_pltenter(Elf64_Sym *, uint_t, uintptr_t *,
 237                                 uintptr_t *, La_amd64_regs *,   uint_t *,
 238                                 const char *);
 239 extern uintptr_t        la_symbind64(Elf64_Sym *, uint_t, uintptr_t *,
 240                                 uintptr_t *, uint_t *, const char *);
 241 extern uintptr_t        la_sparcv9_pltenter(Elf64_Sym *, uint_t, uintptr_t *,
 242                                 uintptr_t *, La_sparcv9_regs *, uint_t *,
 243                                 const char *);
 244 extern uintptr_t        la_pltexit64(Elf64_Sym *, uint_t, uintptr_t *,
 245                                 uintptr_t *, uintptr_t, const char *);
 246 #else  /* !defined(_LP64) */
 247 extern uintptr_t        la_symbind32(Elf32_Sym *, uint_t, uintptr_t *,
 248                                 uintptr_t *, uint_t *);
 249 extern uintptr_t        la_sparcv8_pltenter(Elf32_Sym *, uint_t, uintptr_t *,
 250                                 uintptr_t *, La_sparcv8_regs *, uint_t *);
 251 extern uintptr_t        la_i86_pltenter(Elf32_Sym *, uint_t, uintptr_t *,
 252                                 uintptr_t *, La_i86_regs *, uint_t *);
 253 extern uintptr_t        la_pltexit(Elf32_Sym *, uint_t, uintptr_t *,
 254                                 uintptr_t *, uintptr_t);
 255 #endif /* _LP64 */
 256 #else  /* __STDC__ */
 257 extern uint_t           la_version();
 258 extern void             la_preinit();
 259 extern uint_t           la_objopen();
 260 extern uint_t           la_objclose();
 261 extern int              la_objfilter();
 262 #if     defined(_LP64)
 263 extern uintptr_t        la_sparcv9_pltenter();
 264 extern uintptr_t        la_pltexit64();
 265 extern uintptr_t        la_symbind64();
 266 #else  /* _ILP32 */
 267 extern uintptr_t        la_sparcv8_pltenter();
 268 extern uintptr_t        la_i86_pltenter();
 269 extern uintptr_t        la_pltexit();
 270 extern uintptr_t        la_symbind32();
 271 #endif /* _LP64 */
 272 #endif /* __STDC__ */
 273 
 274 #ifdef  __STDC__
 275 /*
 276  * The ElfW() macro is a GNU/Linux feature, provided as support for
 277  * the dl_phdr_info structure used by dl_phdr_iterate(), which also
 278  * originated under Linux. Given an ELF data type, without the ElfXX_
 279  * prefix, it supplies the appropriate prefix (Elf32_ or Elf64_) for
 280  * the ELFCLASS of the code being compiled.
 281  *
 282  * Note that ElfW() is not suitable in situations in which the ELFCLASS
 283  * of the code being compiled does not match that of the objects that
 284  * code is intended to operate on (e.g. a 32-bit link-editor building
 285  * a 64-bit object). The macros defined in <sys/machelf.h> are
 286  * recommended in such cases.
 287  */
 288 #ifdef _LP64
 289 #define ElfW(type)      Elf64_ ## type
 290 #else
 291 #define ElfW(type)      Elf32_ ## type
 292 #endif
 293 
 294 /*
 295  * The callback function to dl_interate_phdr() receives a pointer
 296  * to a structure of this type.
 297  *
 298  * dlpi_addr is defined such that the address of any segment in
 299  * the program header array can be calculated as:
 300  *
 301  *      addr == info->dlpi_addr + info->dlpi_phdr[x].p_vaddr;
 302  *
 303  * It is therefore 0 for ET_EXEC objects, and the base address at
 304  * which the object is mapped otherwise.
 305  */
 306 struct dl_phdr_info {
 307         ElfW(Addr)              dlpi_addr;      /* Base address of object */
 308         const char              *dlpi_name;     /* Null-terminated obj name */
 309         const ElfW(Phdr)        *dlpi_phdr;     /* Ptr to ELF program hdr arr */
 310         ElfW(Half)              dlpi_phnum;     /* # of items in dlpi_phdr[] */
 311 
 312         /*
 313          * Note: Following members were introduced after the first version
 314          * of this structure was available.  The dl_iterate_phdr() callback
 315          * function is passed a 'size' argument giving the size of the info
 316          * structure, and must compare that size to the offset of these fields
 317          * before accessing them to ensure that they are present.
 318          */
 319 
 320         /* Incremented when a new object is mapped into the process */
 321         u_longlong_t            dlpi_adds;
 322         /* Incremented when an object is unmapped from the process */
 323         u_longlong_t            dlpi_subs;
 324 };
 325 
 326 extern  int dl_iterate_phdr(int (*)(struct dl_phdr_info *, size_t, void *),
 327             void *);
 328 #endif /* __STDC__ */
 329 
 330 #endif  /* _ASM */
 331 #endif /* _KERNEL */
 332 
 333 
 334 #ifdef __cplusplus
 335 }
 336 #endif
 337 
 338 #endif  /* _LINK_H */