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 59039eeafSab196087 * Common Development and Distribution License (the "License"). 69039eeafSab196087 * 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 */ 2156deab07SRod Evans 227c478bd9Sstevel@tonic-gate /* 237c478bd9Sstevel@tonic-gate * Copyright (c) 1988 AT&T 247c478bd9Sstevel@tonic-gate * All Rights Reserved 257c478bd9Sstevel@tonic-gate * 26f441771bSRod Evans * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved. 277c478bd9Sstevel@tonic-gate */ 287c478bd9Sstevel@tonic-gate #ifndef __ELF_DOT_H 297c478bd9Sstevel@tonic-gate #define __ELF_DOT_H 307c478bd9Sstevel@tonic-gate 317c478bd9Sstevel@tonic-gate #include <sys/types.h> 3256deab07SRod Evans #include <sys/mman.h> 3308278a5eSRod Evans #include <sgs.h> 347c478bd9Sstevel@tonic-gate #include <elf.h> 357c478bd9Sstevel@tonic-gate #include <_rtld.h> 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate #ifdef __cplusplus 387c478bd9Sstevel@tonic-gate extern "C" { 397c478bd9Sstevel@tonic-gate #endif 407c478bd9Sstevel@tonic-gate 417c478bd9Sstevel@tonic-gate /* 427c478bd9Sstevel@tonic-gate * Common extern functions for ELF file class. 437c478bd9Sstevel@tonic-gate */ 4456deab07SRod Evans extern int elf_config(Rt_map *, int); 4556deab07SRod Evans extern Rtc_obj *elf_config_ent(const char *, Word, int, const char **); 4656deab07SRod Evans extern void elf_config_flt(Lm_list *, const char *, const char *, 4756deab07SRod Evans Alist **, Aliste); 4856deab07SRod Evans #if defined(__i386) 4956deab07SRod Evans extern int elf_copy_gen(Rt_map *); 5056deab07SRod Evans #endif 517c478bd9Sstevel@tonic-gate extern int elf_copy_reloc(char *, Sym *, Rt_map *, void *, Sym *, 527c478bd9Sstevel@tonic-gate Rt_map *, const void *); 5308278a5eSRod Evans extern int elf_find_sym(Slookup *, Sresult *, uint_t *, int *); 5408278a5eSRod Evans extern int elf_lazy_find_sym(Slookup *, Sresult *, uint_t *, int *); 559aa23310Srie extern Rt_map *elf_lazy_load(Rt_map *, Slookup *, uint_t, const char *, 562017c965SRod Evans uint_t, Grp_hdl **, int *); 5708278a5eSRod Evans extern int elf_lookup_filtee(Slookup *, Sresult *, uint_t *, uint_t, 589aa23310Srie int *); 5956deab07SRod Evans extern int elf_mach_flags_check(Rej_desc *, Ehdr *); 6056deab07SRod Evans extern Rt_map *elf_new_lmp(Lm_list *, Aliste, Fdesc *, Addr, size_t, void *, 61*2020b2b6SRod Evans Rt_map *, int *); 62*2020b2b6SRod Evans extern Rt_map *elf_obj_file(Lm_list *, Aliste, Rt_map *, const char *, 6356deab07SRod Evans mmapobj_result_t *, mmapobj_result_t *, uint_t); 64*2020b2b6SRod Evans extern Rt_map *elf_obj_fini(Lm_list *, Rt_map *, Rt_map *, int *); 6556deab07SRod Evans extern void elf_plt_init(void *, caddr_t); 667c478bd9Sstevel@tonic-gate #if defined(__sparcv9) 677c478bd9Sstevel@tonic-gate extern void elf_plt2_init(uint_t *, Rt_map *); 687c478bd9Sstevel@tonic-gate #endif 6956deab07SRod Evans extern int elf_reloc(Rt_map *, uint_t, int *, APlist **); 7056deab07SRod Evans extern void elf_reloc_bad(Rt_map *, void *, uchar_t, ulong_t, 7156deab07SRod Evans ulong_t); 7256deab07SRod Evans extern int elf_reloc_error(Rt_map *, const char *, void *, uint_t); 7356deab07SRod Evans extern int elf_rtld_load(); 7456deab07SRod Evans extern long elf_static_tls(Rt_map *, Sym *, void *, uchar_t, char *, 7556deab07SRod Evans ulong_t, long); 7656deab07SRod Evans extern Fct *elf_verify(caddr_t, size_t, Fdesc *, const char *, Rej_desc *); 7756deab07SRod Evans extern int elf_verify_vers(const char *, Rt_map *, Rt_map *); 787c478bd9Sstevel@tonic-gate 797c478bd9Sstevel@tonic-gate /* 807c478bd9Sstevel@tonic-gate * Padinfo 817c478bd9Sstevel@tonic-gate * 827c478bd9Sstevel@tonic-gate * Used to track the which PLTpadd entries have been used and 837c478bd9Sstevel@tonic-gate * to where they are bound. 847c478bd9Sstevel@tonic-gate * 857c478bd9Sstevel@tonic-gate * NOTE: these are only currently used for SparcV9 867c478bd9Sstevel@tonic-gate */ 877c478bd9Sstevel@tonic-gate typedef struct pltpadinfo { 887c478bd9Sstevel@tonic-gate Addr pp_addr; 897c478bd9Sstevel@tonic-gate void *pp_plt; 907c478bd9Sstevel@tonic-gate } Pltpadinfo; 917c478bd9Sstevel@tonic-gate 927c478bd9Sstevel@tonic-gate /* 937c478bd9Sstevel@tonic-gate * Private data for an ELF file class. 947c478bd9Sstevel@tonic-gate */ 957c478bd9Sstevel@tonic-gate typedef struct _rt_elf_private { 967c478bd9Sstevel@tonic-gate void *e_symtab; /* symbol table */ 979039eeafSab196087 void *e_sunwsymtab; /* symtab augmented with local fcns */ 987c478bd9Sstevel@tonic-gate uint_t *e_hash; /* hash table */ 997c478bd9Sstevel@tonic-gate char *e_strtab; /* string table */ 1007c478bd9Sstevel@tonic-gate void *e_reloc; /* relocation table */ 1017c478bd9Sstevel@tonic-gate uint_t *e_pltgot; /* addrs for procedure linkage table */ 1027c478bd9Sstevel@tonic-gate void *e_jmprel; /* plt relocations */ 103d579eb63Sab196087 ulong_t e_sunwsortent; /* size of sunw[sym|tls]sort entry */ 104d579eb63Sab196087 uint_t *e_sunwsymsort; /* sunwsymtab indices sorted by addr */ 105d579eb63Sab196087 ulong_t e_sunwsymsortsz; /* size of sunwsymtab */ 106d579eb63Sab196087 ulong_t e_sunwsymsz; /* size of e_sunwsymtab */ 1077c478bd9Sstevel@tonic-gate ulong_t e_pltrelsize; /* size of PLT relocation entries */ 1087c478bd9Sstevel@tonic-gate ulong_t e_relsz; /* size of relocs */ 1097c478bd9Sstevel@tonic-gate ulong_t e_relent; /* size of base reloc entry */ 1107c478bd9Sstevel@tonic-gate ulong_t e_movesz; /* size of movetabs */ 1117c478bd9Sstevel@tonic-gate ulong_t e_moveent; /* size of base movetab entry */ 1127c478bd9Sstevel@tonic-gate ulong_t e_tlsstatoff; /* TLS offset into static block */ 1137c478bd9Sstevel@tonic-gate void *e_movetab; /* movetable address */ 1147c478bd9Sstevel@tonic-gate Phdr *e_pttls; /* PT_TLS */ 1157c478bd9Sstevel@tonic-gate Phdr *e_ptunwind; /* PT_SUNW_UNWIND (amd64 specific) */ 1167c478bd9Sstevel@tonic-gate ulong_t e_syment; /* size of symtab entry */ 1177c478bd9Sstevel@tonic-gate Verneed *e_verneed; /* versions needed by this image and */ 1187c478bd9Sstevel@tonic-gate int e_verneednum; /* their associated count */ 1197c478bd9Sstevel@tonic-gate Verdef *e_verdef; /* versions defined by this image and */ 1207c478bd9Sstevel@tonic-gate int e_verdefnum; /* their associated count */ 1213b41b08bSab196087 Versym *e_versym; /* Per-symbol versions */ 1227c478bd9Sstevel@tonic-gate ulong_t e_syminent; /* syminfo entry size */ 1237c478bd9Sstevel@tonic-gate void *e_pltpad; /* PLTpad table */ 1247c478bd9Sstevel@tonic-gate void *e_pltpadend; /* end of PLTpad table */ 12508278a5eSRod Evans Syscapset e_capset; /* capabilities set */ 12608278a5eSRod Evans Capinfo *e_capinfo; /* symbol capabilities information */ 12708278a5eSRod Evans uint_t e_capchainent; /* size of capabilities chain entry */ 12808278a5eSRod Evans uint_t e_capchainsz; /* size of capabilities chain data */ 1297c478bd9Sstevel@tonic-gate } Rt_elfp; 1307c478bd9Sstevel@tonic-gate 1317c478bd9Sstevel@tonic-gate /* 1327c478bd9Sstevel@tonic-gate * Macros for getting to linker ELF private data. 1337c478bd9Sstevel@tonic-gate */ 1347c478bd9Sstevel@tonic-gate #define ELFPRV(X) ((X)->rt_priv) 1357c478bd9Sstevel@tonic-gate #define SYMTAB(X) (((Rt_elfp *)(X)->rt_priv)->e_symtab) 1369039eeafSab196087 #define SUNWSYMTAB(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsymtab) 1377c478bd9Sstevel@tonic-gate #define HASH(X) (((Rt_elfp *)(X)->rt_priv)->e_hash) 1387c478bd9Sstevel@tonic-gate #define STRTAB(X) (((Rt_elfp *)(X)->rt_priv)->e_strtab) 1397c478bd9Sstevel@tonic-gate #define REL(X) (((Rt_elfp *)(X)->rt_priv)->e_reloc) 1407c478bd9Sstevel@tonic-gate #define PLTGOT(X) (((Rt_elfp *)(X)->rt_priv)->e_pltgot) 1417c478bd9Sstevel@tonic-gate #define MOVESZ(X) (((Rt_elfp *)(X)->rt_priv)->e_movesz) 1427c478bd9Sstevel@tonic-gate #define MOVEENT(X) (((Rt_elfp *)(X)->rt_priv)->e_moveent) 1437c478bd9Sstevel@tonic-gate #define MOVETAB(X) (((Rt_elfp *)(X)->rt_priv)->e_movetab) 1447c478bd9Sstevel@tonic-gate #define JMPREL(X) (((Rt_elfp *)(X)->rt_priv)->e_jmprel) 1459039eeafSab196087 #define SUNWSYMSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsymsz) 1467c478bd9Sstevel@tonic-gate #define PTTLS(X) (((Rt_elfp *)(X)->rt_priv)->e_pttls) 1477c478bd9Sstevel@tonic-gate #define PTUNWIND(X) (((Rt_elfp *)(X)->rt_priv)->e_ptunwind) 1487c478bd9Sstevel@tonic-gate #define TLSSTATOFF(X) (((Rt_elfp *)(X)->rt_priv)->e_tlsstatoff) 1497c478bd9Sstevel@tonic-gate #define PLTRELSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_pltrelsize) 1507c478bd9Sstevel@tonic-gate #define RELSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_relsz) 1517c478bd9Sstevel@tonic-gate #define RELENT(X) (((Rt_elfp *)(X)->rt_priv)->e_relent) 1527c478bd9Sstevel@tonic-gate #define SYMENT(X) (((Rt_elfp *)(X)->rt_priv)->e_syment) 1537c478bd9Sstevel@tonic-gate #define VERNEED(X) (((Rt_elfp *)(X)->rt_priv)->e_verneed) 1547c478bd9Sstevel@tonic-gate #define VERNEEDNUM(X) (((Rt_elfp *)(X)->rt_priv)->e_verneednum) 1557c478bd9Sstevel@tonic-gate #define VERDEF(X) (((Rt_elfp *)(X)->rt_priv)->e_verdef) 1567c478bd9Sstevel@tonic-gate #define VERDEFNUM(X) (((Rt_elfp *)(X)->rt_priv)->e_verdefnum) 1573b41b08bSab196087 #define VERSYM(X) (((Rt_elfp *)(X)->rt_priv)->e_versym) 1587c478bd9Sstevel@tonic-gate #define SYMINENT(X) (((Rt_elfp *)(X)->rt_priv)->e_syminent) 1597c478bd9Sstevel@tonic-gate #define PLTPAD(X) (((Rt_elfp *)(X)->rt_priv)->e_pltpad) 1607c478bd9Sstevel@tonic-gate #define PLTPADEND(X) (((Rt_elfp *)(X)->rt_priv)->e_pltpadend) 161d579eb63Sab196087 #define SUNWSORTENT(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsortent) 162d579eb63Sab196087 #define SUNWSYMSORT(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsymsort) 163d579eb63Sab196087 #define SUNWSYMSORTSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_sunwsymsortsz) 16408278a5eSRod Evans #define CAPSET(X) (((Rt_elfp *)(X)->rt_priv)->e_capset) 16508278a5eSRod Evans #define CAPINFO(X) (((Rt_elfp *)(X)->rt_priv)->e_capinfo) 16608278a5eSRod Evans #define CAPCHAINENT(X) (((Rt_elfp *)(X)->rt_priv)->e_capchainent) 16708278a5eSRod Evans #define CAPCHAINSZ(X) (((Rt_elfp *)(X)->rt_priv)->e_capchainsz) 1687c478bd9Sstevel@tonic-gate 16956deab07SRod Evans /* 17056deab07SRod Evans * Most of the above macros are used from ELF specific routines, however there 17156deab07SRod Evans * are a couple of instances where we need to ensure the file being processed 17256deab07SRod Evans * is ELF before dereferencing the macro. 17356deab07SRod Evans */ 17456deab07SRod Evans #define THIS_IS_ELF(X) (FCT(X) == &elf_fct) 17556deab07SRod Evans #define THIS_IS_NOT_ELF(X) (FCT(X) != &elf_fct) 17656deab07SRod Evans 1777c478bd9Sstevel@tonic-gate #ifdef __cplusplus 1787c478bd9Sstevel@tonic-gate } 1797c478bd9Sstevel@tonic-gate #endif 1807c478bd9Sstevel@tonic-gate 1817c478bd9Sstevel@tonic-gate #endif /* __ELF_DOT_H */ 182