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