1*df930be7Sderaadt /* $NetBSD: link.h,v 1.9 1995/09/23 22:26:15 pk Exp $ */ 2*df930be7Sderaadt 3*df930be7Sderaadt /* 4*df930be7Sderaadt * Copyright (c) 1993 Paul Kranenburg 5*df930be7Sderaadt * All rights reserved. 6*df930be7Sderaadt * 7*df930be7Sderaadt * Redistribution and use in source and binary forms, with or without 8*df930be7Sderaadt * modification, are permitted provided that the following conditions 9*df930be7Sderaadt * are met: 10*df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright 11*df930be7Sderaadt * notice, this list of conditions and the following disclaimer. 12*df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright 13*df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the 14*df930be7Sderaadt * documentation and/or other materials provided with the distribution. 15*df930be7Sderaadt * 3. All advertising materials mentioning features or use of this software 16*df930be7Sderaadt * must display the following acknowledgement: 17*df930be7Sderaadt * This product includes software developed by Paul Kranenburg. 18*df930be7Sderaadt * 4. The name of the author may not be used to endorse or promote products 19*df930be7Sderaadt * derived from this software withough specific prior written permission 20*df930be7Sderaadt * 21*df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22*df930be7Sderaadt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23*df930be7Sderaadt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24*df930be7Sderaadt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25*df930be7Sderaadt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26*df930be7Sderaadt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27*df930be7Sderaadt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28*df930be7Sderaadt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29*df930be7Sderaadt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30*df930be7Sderaadt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31*df930be7Sderaadt */ 32*df930be7Sderaadt 33*df930be7Sderaadt /* 34*df930be7Sderaadt * RRS section definitions. 35*df930be7Sderaadt * 36*df930be7Sderaadt * The layout of some data structures defined in this header file is 37*df930be7Sderaadt * such that we can provide compatibility with the SunOS 4.x shared 38*df930be7Sderaadt * library scheme. 39*df930be7Sderaadt */ 40*df930be7Sderaadt 41*df930be7Sderaadt #ifndef _LINK_H_ 42*df930be7Sderaadt #define _LINK_H_ 43*df930be7Sderaadt 44*df930be7Sderaadt /* 45*df930be7Sderaadt * A `Shared Object Descriptor' descibes a shared object that is needed 46*df930be7Sderaadt * to complete the link edit process of the object containing it. 47*df930be7Sderaadt * A list of such objects (chained through `sod_next') is pointed at 48*df930be7Sderaadt * by `sdt_sods' in the section_dispatch_table structure. 49*df930be7Sderaadt */ 50*df930be7Sderaadt 51*df930be7Sderaadt struct sod { /* Shared Object Descriptor */ 52*df930be7Sderaadt long sod_name; /* name (relative to load address) */ 53*df930be7Sderaadt u_int sod_library : 1, /* Searched for by library rules */ 54*df930be7Sderaadt sod_reserved : 31; 55*df930be7Sderaadt short sod_major; /* major version number */ 56*df930be7Sderaadt short sod_minor; /* minor version number */ 57*df930be7Sderaadt long sod_next; /* next sod */ 58*df930be7Sderaadt }; 59*df930be7Sderaadt 60*df930be7Sderaadt /* 61*df930be7Sderaadt * `Shared Object Map's are used by the run-time link editor (ld.so) to 62*df930be7Sderaadt * keep track of all shared objects loaded into a process' address space. 63*df930be7Sderaadt * These structures are only used at run-time and do not occur within 64*df930be7Sderaadt * the text or data segment of an executable or shared library. 65*df930be7Sderaadt */ 66*df930be7Sderaadt struct so_map { /* Shared Object Map */ 67*df930be7Sderaadt caddr_t som_addr; /* Address at which object mapped */ 68*df930be7Sderaadt char *som_path; /* Path to mmap'ed file */ 69*df930be7Sderaadt struct so_map *som_next; /* Next map in chain */ 70*df930be7Sderaadt struct sod *som_sod; /* Sod responsible for this map */ 71*df930be7Sderaadt caddr_t som_sodbase; /* Base address of this sod */ 72*df930be7Sderaadt u_int som_write : 1; /* Text is currently writable */ 73*df930be7Sderaadt struct _dynamic *som_dynamic; /* _dynamic structure */ 74*df930be7Sderaadt caddr_t som_spd; /* Private data */ 75*df930be7Sderaadt }; 76*df930be7Sderaadt 77*df930be7Sderaadt /* 78*df930be7Sderaadt * Symbol description with size. This is simply an `nlist' with 79*df930be7Sderaadt * one field (nz_size) added. 80*df930be7Sderaadt * Used to convey size information on items in the data segment 81*df930be7Sderaadt * of shared objects. An array of these live in the shared object's 82*df930be7Sderaadt * text segment and is addressed by the `sdt_nzlist' field. 83*df930be7Sderaadt */ 84*df930be7Sderaadt struct nzlist { 85*df930be7Sderaadt struct nlist nlist; 86*df930be7Sderaadt u_long nz_size; 87*df930be7Sderaadt #define nz_un nlist.n_un 88*df930be7Sderaadt #define nz_strx nlist.n_un.n_strx 89*df930be7Sderaadt #define nz_name nlist.n_un.n_name 90*df930be7Sderaadt #define nz_type nlist.n_type 91*df930be7Sderaadt #define nz_value nlist.n_value 92*df930be7Sderaadt #define nz_desc nlist.n_desc 93*df930be7Sderaadt #define nz_other nlist.n_other 94*df930be7Sderaadt }; 95*df930be7Sderaadt 96*df930be7Sderaadt #define N_AUX(p) ((p)->n_other & 0xf) 97*df930be7Sderaadt #define N_BIND(p) (((unsigned int)(p)->n_other >> 4) & 0xf) 98*df930be7Sderaadt #define N_OTHER(r, v) (((unsigned int)(r) << 4) | ((v) & 0xf)) 99*df930be7Sderaadt 100*df930be7Sderaadt #define AUX_OBJECT 1 101*df930be7Sderaadt #define AUX_FUNC 2 102*df930be7Sderaadt /*#define BIND_LOCAL 0 not used */ 103*df930be7Sderaadt /*#define BIND_GLOBAL 1 not used */ 104*df930be7Sderaadt #define BIND_WEAK 2 105*df930be7Sderaadt 106*df930be7Sderaadt 107*df930be7Sderaadt /* 108*df930be7Sderaadt * The `section_dispatch_table' structure contains offsets to various data 109*df930be7Sderaadt * structures needed to do run-time relocation. 110*df930be7Sderaadt */ 111*df930be7Sderaadt struct section_dispatch_table { 112*df930be7Sderaadt struct so_map *sdt_loaded; /* List of loaded objects */ 113*df930be7Sderaadt long sdt_sods; /* List of shared objects descriptors */ 114*df930be7Sderaadt long sdt_paths; /* Library search paths */ 115*df930be7Sderaadt long sdt_got; /* Global offset table */ 116*df930be7Sderaadt long sdt_plt; /* Procedure linkage table */ 117*df930be7Sderaadt long sdt_rel; /* Relocation table */ 118*df930be7Sderaadt long sdt_hash; /* Symbol hash table */ 119*df930be7Sderaadt long sdt_nzlist; /* Symbol table itself */ 120*df930be7Sderaadt long sdt_filler2; /* Unused (was: stab_hash) */ 121*df930be7Sderaadt long sdt_buckets; /* Number of hash buckets */ 122*df930be7Sderaadt long sdt_strings; /* Symbol strings */ 123*df930be7Sderaadt long sdt_str_sz; /* Size of symbol strings */ 124*df930be7Sderaadt long sdt_text_sz; /* Size of text area */ 125*df930be7Sderaadt long sdt_plt_sz; /* Size of procedure linkage table */ 126*df930be7Sderaadt }; 127*df930be7Sderaadt 128*df930be7Sderaadt /* 129*df930be7Sderaadt * RRS symbol hash table, addressed by `sdt_hash' in section_dispatch_table. 130*df930be7Sderaadt * Used to quickly lookup symbols of the shared object by hashing 131*df930be7Sderaadt * on the symbol's name. `rh_symbolnum' is the index of the symbol 132*df930be7Sderaadt * in the shared object's symbol list (`sdt_nzlist'), `rh_next' is 133*df930be7Sderaadt * the next symbol in the hash bucket (in case of collisions). 134*df930be7Sderaadt */ 135*df930be7Sderaadt struct rrs_hash { 136*df930be7Sderaadt int rh_symbolnum; /* Symbol number */ 137*df930be7Sderaadt int rh_next; /* Next hash entry */ 138*df930be7Sderaadt }; 139*df930be7Sderaadt 140*df930be7Sderaadt /* 141*df930be7Sderaadt * `rt_symbols' is used to keep track of run-time allocated commons 142*df930be7Sderaadt * and data items copied from shared objects. 143*df930be7Sderaadt */ 144*df930be7Sderaadt struct rt_symbol { 145*df930be7Sderaadt struct nzlist *rt_sp; /* The symbol */ 146*df930be7Sderaadt struct rt_symbol *rt_next; /* Next in linear list */ 147*df930be7Sderaadt struct rt_symbol *rt_link; /* Next in bucket */ 148*df930be7Sderaadt caddr_t rt_srcaddr; /* Address of "master" copy */ 149*df930be7Sderaadt struct so_map *rt_smp; /* Originating map */ 150*df930be7Sderaadt }; 151*df930be7Sderaadt 152*df930be7Sderaadt /* 153*df930be7Sderaadt * Debugger interface structure. 154*df930be7Sderaadt */ 155*df930be7Sderaadt struct so_debug { 156*df930be7Sderaadt int dd_version; /* Version # of interface */ 157*df930be7Sderaadt int dd_in_debugger; /* Set when run by debugger */ 158*df930be7Sderaadt int dd_sym_loaded; /* Run-time linking brought more 159*df930be7Sderaadt symbols into scope */ 160*df930be7Sderaadt char *dd_bpt_addr; /* Address of rtld-generated bpt */ 161*df930be7Sderaadt int dd_bpt_shadow; /* Original contents of bpt */ 162*df930be7Sderaadt struct rt_symbol *dd_cc; /* Allocated commons/copied data */ 163*df930be7Sderaadt }; 164*df930be7Sderaadt 165*df930be7Sderaadt /* 166*df930be7Sderaadt * Entry points into ld.so - user interface to the run-time linker. 167*df930be7Sderaadt */ 168*df930be7Sderaadt struct ld_entry { 169*df930be7Sderaadt void *(*dlopen) __P((char *, int)); 170*df930be7Sderaadt int (*dlclose) __P((void *)); 171*df930be7Sderaadt void *(*dlsym) __P((void *, char *)); 172*df930be7Sderaadt int (*dlctl) __P((void *, int, void *)); 173*df930be7Sderaadt void (*dlexit) __P((void)); 174*df930be7Sderaadt void (*dlrsrvd[3]) __P((void)); 175*df930be7Sderaadt }; 176*df930be7Sderaadt 177*df930be7Sderaadt /* 178*df930be7Sderaadt * This is the structure pointed at by the __DYNAMIC symbol if an 179*df930be7Sderaadt * executable requires the attention of the run-time link editor. 180*df930be7Sderaadt * __DYNAMIC is given the value zero if no run-time linking needs to 181*df930be7Sderaadt * be done (it is always present in shared objects). 182*df930be7Sderaadt * The union `d_un' provides for different versions of the dynamic 183*df930be7Sderaadt * linking mechanism (switched on by `d_version'). The last version 184*df930be7Sderaadt * used by Sun is 3. We leave some room here and go to version number 185*df930be7Sderaadt * 8 for NetBSD, the main difference lying in the support for the 186*df930be7Sderaadt * `nz_list' type of symbols. 187*df930be7Sderaadt */ 188*df930be7Sderaadt 189*df930be7Sderaadt struct _dynamic { 190*df930be7Sderaadt int d_version; /* version # of this interface */ 191*df930be7Sderaadt struct so_debug *d_debug; 192*df930be7Sderaadt union { 193*df930be7Sderaadt struct section_dispatch_table *d_sdt; 194*df930be7Sderaadt } d_un; 195*df930be7Sderaadt struct ld_entry *d_entry; /* compat - now in crt_ldso */ 196*df930be7Sderaadt }; 197*df930be7Sderaadt 198*df930be7Sderaadt #define LD_VERSION_SUN (3) 199*df930be7Sderaadt #define LD_VERSION_BSD (8) 200*df930be7Sderaadt #define LD_VERSION_NZLIST_P(v) ((v) >= 8) 201*df930be7Sderaadt 202*df930be7Sderaadt #define LD_GOT(x) ((x)->d_un.d_sdt->sdt_got) 203*df930be7Sderaadt #define LD_PLT(x) ((x)->d_un.d_sdt->sdt_plt) 204*df930be7Sderaadt #define LD_REL(x) ((x)->d_un.d_sdt->sdt_rel) 205*df930be7Sderaadt #define LD_SYMBOL(x) ((x)->d_un.d_sdt->sdt_nzlist) 206*df930be7Sderaadt #define LD_HASH(x) ((x)->d_un.d_sdt->sdt_hash) 207*df930be7Sderaadt #define LD_STRINGS(x) ((x)->d_un.d_sdt->sdt_strings) 208*df930be7Sderaadt #define LD_NEED(x) ((x)->d_un.d_sdt->sdt_sods) 209*df930be7Sderaadt #define LD_BUCKETS(x) ((x)->d_un.d_sdt->sdt_buckets) 210*df930be7Sderaadt #define LD_PATHS(x) ((x)->d_un.d_sdt->sdt_paths) 211*df930be7Sderaadt 212*df930be7Sderaadt #define LD_GOTSZ(x) ((x)->d_un.d_sdt->sdt_plt - (x)->d_un.d_sdt->sdt_got) 213*df930be7Sderaadt #define LD_RELSZ(x) ((x)->d_un.d_sdt->sdt_hash - (x)->d_un.d_sdt->sdt_rel) 214*df930be7Sderaadt #define LD_HASHSZ(x) ((x)->d_un.d_sdt->sdt_nzlist - (x)->d_un.d_sdt->sdt_hash) 215*df930be7Sderaadt #define LD_STABSZ(x) ((x)->d_un.d_sdt->sdt_strings - (x)->d_un.d_sdt->sdt_nzlist) 216*df930be7Sderaadt #define LD_PLTSZ(x) ((x)->d_un.d_sdt->sdt_plt_sz) 217*df930be7Sderaadt #define LD_STRSZ(x) ((x)->d_un.d_sdt->sdt_str_sz) 218*df930be7Sderaadt #define LD_TEXTSZ(x) ((x)->d_un.d_sdt->sdt_text_sz) 219*df930be7Sderaadt 220*df930be7Sderaadt /* 221*df930be7Sderaadt * Interface to ld.so 222*df930be7Sderaadt */ 223*df930be7Sderaadt struct crt_ldso { 224*df930be7Sderaadt int crt_ba; /* Base address of ld.so */ 225*df930be7Sderaadt int crt_dzfd; /* "/dev/zero" file decriptor (SunOS) */ 226*df930be7Sderaadt int crt_ldfd; /* ld.so file descriptor */ 227*df930be7Sderaadt struct _dynamic *crt_dp; /* Main's __DYNAMIC */ 228*df930be7Sderaadt char **crt_ep; /* environment strings */ 229*df930be7Sderaadt caddr_t crt_bp; /* Breakpoint if run from debugger */ 230*df930be7Sderaadt char *crt_prog; /* Program name (v3) */ 231*df930be7Sderaadt char *crt_ldso; /* Link editor name (v4) */ 232*df930be7Sderaadt struct ld_entry *crt_ldentry; /* dl*() access (v4) */ 233*df930be7Sderaadt }; 234*df930be7Sderaadt 235*df930be7Sderaadt /* 236*df930be7Sderaadt * Version passed from crt0 to ld.so (1st argument to _rtld()). 237*df930be7Sderaadt */ 238*df930be7Sderaadt #define CRT_VERSION_SUN 1 239*df930be7Sderaadt #define CRT_VERSION_BSD_2 2 240*df930be7Sderaadt #define CRT_VERSION_BSD_3 3 241*df930be7Sderaadt #define CRT_VERSION_BSD_4 4 242*df930be7Sderaadt 243*df930be7Sderaadt 244*df930be7Sderaadt /* 245*df930be7Sderaadt * Maximum number of recognized shared object version numbers. 246*df930be7Sderaadt */ 247*df930be7Sderaadt #define MAXDEWEY 8 248*df930be7Sderaadt 249*df930be7Sderaadt /* 250*df930be7Sderaadt * Header of the hints file. 251*df930be7Sderaadt */ 252*df930be7Sderaadt struct hints_header { 253*df930be7Sderaadt long hh_magic; 254*df930be7Sderaadt #define HH_MAGIC 011421044151 255*df930be7Sderaadt long hh_version; /* Interface version number */ 256*df930be7Sderaadt #define LD_HINTS_VERSION_1 1 257*df930be7Sderaadt long hh_hashtab; /* Location of hash table */ 258*df930be7Sderaadt long hh_nbucket; /* Number of buckets in hashtab */ 259*df930be7Sderaadt long hh_strtab; /* Location of strings */ 260*df930be7Sderaadt long hh_strtab_sz; /* Size of strings */ 261*df930be7Sderaadt long hh_ehints; /* End of hints (max offset in file) */ 262*df930be7Sderaadt }; 263*df930be7Sderaadt 264*df930be7Sderaadt #define HH_BADMAG(hdr) ((hdr).hh_magic != HH_MAGIC) 265*df930be7Sderaadt 266*df930be7Sderaadt /* 267*df930be7Sderaadt * Hash table element in hints file. 268*df930be7Sderaadt */ 269*df930be7Sderaadt struct hints_bucket { 270*df930be7Sderaadt /* namex and pathx are indices into the string table */ 271*df930be7Sderaadt int hi_namex; /* Library name */ 272*df930be7Sderaadt int hi_pathx; /* Full path */ 273*df930be7Sderaadt int hi_dewey[MAXDEWEY]; /* The versions */ 274*df930be7Sderaadt int hi_ndewey; /* Number of version numbers */ 275*df930be7Sderaadt #define hi_major hi_dewey[0] 276*df930be7Sderaadt #define hi_minor hi_dewey[1] 277*df930be7Sderaadt int hi_next; /* Next in this bucket */ 278*df930be7Sderaadt }; 279*df930be7Sderaadt 280*df930be7Sderaadt #define _PATH_LD_HINTS "/var/run/ld.so.hints" 281*df930be7Sderaadt 282*df930be7Sderaadt #endif /* _LINK_H_ */ 283*df930be7Sderaadt 284