Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / link_aout.h @ 13

History | View | Annotate | Download (9.85 KB)

1
/*        $NetBSD: link_aout.h,v 1.21 2008/04/28 20:22:54 martin 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
        u_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
        u_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
        u_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_ */