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) 1988 AT&T 23 * All Rights Reserved 24 * 25 * 26 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 27 * Use is subject to license terms. 28 */ 29 30 #ifndef __ELF_DOT_H 31 #define __ELF_DOT_H 32 33 #pragma ident "%Z%%M% %I% %E% SMI" 34 35 #include <sys/types.h> 36 #include <elf.h> 37 #include <_rtld.h> 38 39 #ifdef __cplusplus 40 extern "C" { 41 #endif 42 43 /* 44 * Common extern functions for ELF file class. 45 */ 46 extern int elf_reloc(Rt_map *, uint_t); 47 extern void elf_plt_init(void *, caddr_t); 48 extern int elf_set_prot(Rt_map *, int); 49 extern Rt_map *elf_obj_file(Lm_list *, Aliste, const char *, int); 50 extern Rt_map *elf_obj_fini(Lm_list *, Rt_map *); 51 extern int elf_copy_reloc(char *, Sym *, Rt_map *, void *, Sym *, 52 Rt_map *, const void *); 53 extern Sym *elf_find_sym(Slookup *, Rt_map **, uint_t *); 54 extern Sym *elf_lazy_find_sym(Slookup *, Rt_map **, uint_t *); 55 extern Rt_map *elf_lazy_load(Rt_map *, uint_t, const char *); 56 extern Sym *elf_lookup_filtee(Slookup *, Rt_map **, uint_t *, uint_t); 57 extern Rt_map *elf_new_lm(Lm_list *, const char *, const char *, Dyn *, 58 ulong_t, ulong_t, Aliste, ulong_t, ulong_t, ulong_t, 59 ulong_t, Mmap *, uint_t); 60 extern int elf_rtld_load(); 61 62 #if defined(__sparcv9) 63 extern void elf_plt2_init(uint_t *, Rt_map *); 64 #endif 65 66 #if defined(i386) 67 extern ulong_t elf_reloc_relacount(ulong_t, ulong_t, ulong_t, ulong_t); 68 extern int elf_copy_gen(Rt_map *); 69 #endif 70 71 /* 72 * Padinfo 73 * 74 * Used to track the which PLTpadd entries have been used and 75 * to where they are bound. 76 * 77 * NOTE: these are only currently used for SparcV9 78 */ 79 typedef struct pltpadinfo { 80 Addr pp_addr; 81 void *pp_plt; 82 } Pltpadinfo; 83 84 /* 85 * Private data for an ELF file class. 86 */ 87 typedef struct _rt_elf_private { 88 void *e_symtab; /* symbol table */ 89 void *e_sunwsymtab; /* symtab augmented with local fcns */ 90 uint_t *e_hash; /* hash table */ 91 char *e_strtab; /* string table */ 92 void *e_reloc; /* relocation table */ 93 uint_t *e_pltgot; /* addrs for procedure linkage table */ 94 void *e_pltreserve; /* ia64: DT_IA_64_PLTRESERVE */ 95 void *e_dynplt; /* dynamic plt table - used by prof */ 96 void *e_jmprel; /* plt relocations */ 97 ulong_t e_sunwsymsz; /* size of w_sunwsymtab */ 98 ulong_t e_pltrelsize; /* size of PLT relocation entries */ 99 ulong_t e_relsz; /* size of relocs */ 100 ulong_t e_relent; /* size of base reloc entry */ 101 ulong_t e_movesz; /* size of movetabs */ 102 ulong_t e_moveent; /* size of base movetab entry */ 103 ulong_t e_tlsstatoff; /* TLS offset into static block */ 104 void *e_movetab; /* movetable address */ 105 Phdr *e_sunwbss; /* program header for SUNWBSS */ 106 Phdr *e_pttls; /* PT_TLS */ 107 Phdr *e_ptunwind; /* PT_SUNW_UNWIND (amd64 specific) */ 108 ulong_t e_syment; /* size of symtab entry */ 109 ulong_t e_entry; /* entry point for file */ 110 Verneed *e_verneed; /* versions needed by this image and */ 111 int e_verneednum; /* their associated count */ 112 Verdef *e_verdef; /* versions defined by this image and */ 113 int e_verdefnum; /* their associated count */ 114 ulong_t e_syminent; /* syminfo entry size */ 115 void *e_pltpad; /* PLTpad table */ 116 void *e_pltpadend; /* end of PLTpad table */ 117 } Rt_elfp; 118 119 /* 120 * Macros for getting to linker ELF private data. 121 */ 122 #define ELFPRV(X) ((X)->rt_priv) 123 #define SYMTAB(X) (((Rt_elfp *)(X)->rt_priv)->e_symtab) 124 #define SUNWSYMTAB(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsymtab) 125 #define HASH(X) (((Rt_elfp *)(X)->rt_priv)->e_hash) 126 #define STRTAB(X) (((Rt_elfp *)(X)->rt_priv)->e_strtab) 127 #define REL(X) (((Rt_elfp *)(X)->rt_priv)->e_reloc) 128 #define PLTGOT(X) (((Rt_elfp *)(X)->rt_priv)->e_pltgot) 129 #define MOVESZ(X) (((Rt_elfp *)(X)->rt_priv)->e_movesz) 130 #define MOVEENT(X) (((Rt_elfp *)(X)->rt_priv)->e_moveent) 131 #define MOVETAB(X) (((Rt_elfp *)(X)->rt_priv)->e_movetab) 132 #define DYNPLT(X) (((Rt_elfp *)(X)->rt_priv)->e_dynplt) 133 #define JMPREL(X) (((Rt_elfp *)(X)->rt_priv)->e_jmprel) 134 #define SUNWSYMSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsymsz) 135 #define PTTLS(X) (((Rt_elfp *)(X)->rt_priv)->e_pttls) 136 #define PTUNWIND(X) (((Rt_elfp *)(X)->rt_priv)->e_ptunwind) 137 #define TLSSTATOFF(X) (((Rt_elfp *)(X)->rt_priv)->e_tlsstatoff) 138 #define PLTRELSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_pltrelsize) 139 #define RELSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_relsz) 140 #define RELENT(X) (((Rt_elfp *)(X)->rt_priv)->e_relent) 141 #define SYMENT(X) (((Rt_elfp *)(X)->rt_priv)->e_syment) 142 #define ENTRY(X) (((Rt_elfp *)(X)->rt_priv)->e_entry) 143 #define VERNEED(X) (((Rt_elfp *)(X)->rt_priv)->e_verneed) 144 #define VERNEEDNUM(X) (((Rt_elfp *)(X)->rt_priv)->e_verneednum) 145 #define VERDEF(X) (((Rt_elfp *)(X)->rt_priv)->e_verdef) 146 #define VERDEFNUM(X) (((Rt_elfp *)(X)->rt_priv)->e_verdefnum) 147 #define SUNWBSS(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwbss) 148 #define SYMINENT(X) (((Rt_elfp *)(X)->rt_priv)->e_syminent) 149 #define PLTPAD(X) (((Rt_elfp *)(X)->rt_priv)->e_pltpad) 150 #define PLTPADEND(X) (((Rt_elfp *)(X)->rt_priv)->e_pltpadend) 151 #define PLTRESERVE(X) (((Rt_elfp *)(X)->rt_priv)->e_pltreserve) 152 153 #ifdef __cplusplus 154 } 155 #endif 156 157 #endif /* __ELF_DOT_H */ 158