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