OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [newlib-1.17.0/] [newlib/] [libc/] [sys/] [linux/] [include/] [link.h] - Blame information for rev 816

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 148 jeremybenn
/* Data structure for communication from the run-time dynamic linker for
2
   loaded ELF shared objects.
3
   Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
4
   This file is part of the GNU C Library.
5
 
6
   The GNU C Library is free software; you can redistribute it and/or
7
   modify it under the terms of the GNU Lesser General Public
8
   License as published by the Free Software Foundation; either
9
   version 2.1 of the License, or (at your option) any later version.
10
 
11
   The GNU C Library is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
   Lesser General Public License for more details.
15
 
16
   You should have received a copy of the GNU Lesser General Public
17
   License along with the GNU C Library; if not, write to the Free
18
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19
   02111-1307 USA.  */
20
 
21
#ifndef _LINK_H
22
#define _LINK_H 1
23
 
24
#include <features.h>
25
#include <elf.h>
26
#include <dlfcn.h>
27
#include <sys/types.h>
28
 
29
#define DT_THISPROCNUM 0
30
/* We use this macro to refer to ELF types independent of the native wordsize.
31
   `ElfW(TYPE)' is used in place of `Elf32_TYPE' or `Elf64_TYPE'.  */
32
#define ElfW(type)      _ElfW (Elf, __ELF_NATIVE_CLASS, type)
33
#define _ElfW(e,w,t)    _ElfW_1 (e, w, _##t)
34
#define _ElfW_1(e,w,t)  e##w##t
35
 
36
#include <sys/elfclass.h>               /* Defines __ELF_NATIVE_CLASS.  */
37
#include <sys/link.h>
38
#include <dl-lookupcfg.h>
39
 
40
/* Rendezvous structure used by the run-time dynamic linker to communicate
41
   details of shared object loading to the debugger.  If the executable's
42
   dynamic section has a DT_DEBUG element, the run-time linker sets that
43
   element's value to the address where this structure can be found.  */
44
 
45
struct r_debug
46
  {
47
    int r_version;              /* Version number for this protocol.  */
48
 
49
    struct link_map *r_map;     /* Head of the chain of loaded objects.  */
50
 
51
    /* This is the address of a function internal to the run-time linker,
52
       that will always be called when the linker begins to map in a
53
       library or unmap it, and again when the mapping change is complete.
54
       The debugger can set a breakpoint at this address if it wants to
55
       notice shared object mapping changes.  */
56
    ElfW(Addr) r_brk;
57
    enum
58
      {
59
        /* This state value describes the mapping change taking place when
60
           the `r_brk' address is called.  */
61
        RT_CONSISTENT,          /* Mapping change is complete.  */
62
        RT_ADD,                 /* Beginning to add a new object.  */
63
        RT_DELETE               /* Beginning to remove an object mapping.  */
64
      } r_state;
65
 
66
    ElfW(Addr) r_ldbase;        /* Base address the linker is loaded at.  */
67
  };
68
 
69
/* This is the instance of that structure used by the dynamic linker.  */
70
extern struct r_debug _r_debug;
71
 
72
/* This symbol refers to the "dynamic structure" in the `.dynamic' section
73
   of whatever module refers to `_DYNAMIC'.  So, to find its own
74
   `struct r_debug', a program could do:
75
     for (dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn)
76
       if (dyn->d_tag == DT_DEBUG)
77
         r_debug = (struct r_debug *) dyn->d_un.d_ptr;
78
   */
79
extern ElfW(Dyn) _DYNAMIC[];
80
 
81
 
82
/* Some internal data structures of the dynamic linker used in the
83
   linker map.  We only provide forward declarations.  */
84
struct libname_list;
85
struct r_found_version;
86
struct r_search_path_elem;
87
 
88
/* Forward declaration.  */
89
struct link_map;
90
 
91
/* Structure to describe a single list of scope elements.  The lookup
92
   functions get passed an array of pointers to such structures.  */
93
struct r_scope_elem
94
{
95
  /* Array of maps for the scope.  */
96
  struct link_map **r_list;
97
  /* Number of entries in the scope.  */
98
  unsigned int r_nlist;
99
};
100
 
101
 
102
/* Structure to record search path and allocation mechanism.  */
103
struct r_search_path_struct
104
  {
105
    struct r_search_path_elem **dirs;
106
    int malloced;
107
  };
108
 
109
 
110
/* Structure describing a loaded shared object.  The `l_next' and `l_prev'
111
   members form a chain of all the shared objects loaded at startup.
112
 
113
   These data structures exist in space used by the run-time dynamic linker;
114
   modifying them may have disastrous results.
115
 
116
   This data structure might change in future, if necessary.  User-level
117
   programs must avoid defining objects of this type.  */
118
 
119
struct link_map
120
  {
121
    /* These first few members are part of the protocol with the debugger.
122
       This is the same format used in SVR4.  */
123
 
124
    ElfW(Addr) l_addr;          /* Base address shared object is loaded at.  */
125
    char *l_name;               /* Absolute file name object was found in.  */
126
    ElfW(Dyn) *l_ld;            /* Dynamic section of the shared object.  */
127
    struct link_map *l_next, *l_prev; /* Chain of loaded objects.  */
128
 
129
    /* All following members are internal to the dynamic linker.
130
       They may change without notice.  */
131
 
132
    struct libname_list *l_libname;
133
    /* Indexed pointers to dynamic section.
134
       [0,DT_NUM) are indexed by the processor-independent tags.
135
       [DT_NUM,DT_NUM+DT_THISPROCNUM) are indexed by the tag minus DT_LOPROC.
136
       [DT_NUM+DT_THISPROCNUM,DT_NUM+DT_THISPROCNUM+DT_EXTRANUM) are indexed
137
       by DT_EXTRATAGIDX(tagvalue) and
138
       [DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM,
139
        DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM)
140
       are indexed by DT_EXTRATAGIDX(tagvalue) (see <elf.h>).  */
141
 
142
    ElfW(Dyn) *l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM
143
                     + DT_EXTRANUM];
144
    const ElfW(Phdr) *l_phdr;   /* Pointer to program header table in core.  */
145
    ElfW(Addr) l_entry;         /* Entry point location.  */
146
    ElfW(Half) l_phnum;         /* Number of program header entries.  */
147
    ElfW(Half) l_ldnum; /* Number of dynamic segment entries.  */
148
 
149
    /* Array of DT_NEEDED dependencies and their dependencies, in
150
       dependency order for symbol lookup (with and without
151
       duplicates).  There is no entry before the dependencies have
152
       been loaded.  */
153
    struct r_scope_elem l_searchlist;
154
 
155
    /* We need a special searchlist to process objects marked with
156
       DT_SYMBOLIC.  */
157
    struct r_scope_elem l_symbolic_searchlist;
158
 
159
    /* Dependent object that first caused this object to be loaded.  */
160
    struct link_map *l_loader;
161
 
162
    /* Symbol hash table.  */
163
    Elf_Symndx l_nbuckets;
164
    const Elf_Symndx *l_buckets, *l_chain;
165
 
166
    unsigned int l_opencount;   /* Reference count for dlopen/dlclose.  */
167
    enum                        /* Where this object came from.  */
168
      {
169
        lt_executable,          /* The main executable program.  */
170
        lt_library,             /* Library needed by main executable.  */
171
        lt_loaded               /* Extra run-time loaded shared object.  */
172
      } l_type:2;
173
    unsigned int l_relocated:1; /* Nonzero if object's relocations done.  */
174
    unsigned int l_init_called:1; /* Nonzero if DT_INIT function called.  */
175
    unsigned int l_global:1;    /* Nonzero if object in _dl_global_scope.  */
176
    unsigned int l_reserved:2;  /* Reserved for internal use.  */
177
    unsigned int l_phdr_allocated:1; /* Nonzero if the data structure pointed
178
                                        to by `l_phdr' is allocated.  */
179
    unsigned int l_soname_added:1; /* Nonzero if the SONAME is for sure in
180
                                      the l_libname list.  */
181
    unsigned int l_faked:1;     /* Nonzero if this is a faked descriptor
182
                                   without associated file.  */
183
 
184
    /* Array with version names.  */
185
    unsigned int l_nversions;
186
    struct r_found_version *l_versions;
187
 
188
    /* Collected information about own RPATH directories.  */
189
    struct r_search_path_struct l_rpath_dirs;
190
 
191
    /* Collected results of relocation while profiling.  */
192
    ElfW(Addr) *l_reloc_result;
193
 
194
    /* Pointer to the version information if available.  */
195
    ElfW(Versym) *l_versyms;
196
 
197
    /* String specifying the path where this object was found.  */
198
    const char *l_origin;
199
 
200
    /* Start and finish of memory map for this object.  l_map_start
201
       need not be the same as l_addr.  */
202
    ElfW(Addr) l_map_start, l_map_end;
203
 
204
    /* Default array for 'l_scope'.  */
205
    struct r_scope_elem *l_scope_mem[4];
206
    /* Size of array allocated for 'l_scope'.  */
207
    size_t l_scope_max;
208
    /* This is an array defining the lookup scope for this link map.
209
       There are at most three different scope lists.  */
210
    struct r_scope_elem **l_scope;
211
 
212
    /* A similar array, this time only with the local scope.  This is
213
       used occasionally.  */
214
    struct r_scope_elem *l_local_scope[2];
215
 
216
    /* This information is kept to check for sure whether a shared
217
       object is the same as one already loaded.  */
218
    dev_t l_dev;
219
    ino64_t l_ino;
220
 
221
    /* Collected information about own RUNPATH directories.  */
222
    struct r_search_path_struct l_runpath_dirs;
223
 
224
    /* List of object in order of the init and fini calls.  */
225
    struct link_map **l_initfini;
226
 
227
    /* List of the dependencies introduced through symbol binding.  */
228
    unsigned int l_reldepsmax;
229
    unsigned int l_reldepsact;
230
    struct link_map **l_reldeps;
231
 
232
    /* Various flag words.  */
233
    ElfW(Word) l_feature_1;
234
    ElfW(Word) l_flags_1;
235
 
236
    /* Temporarily used in `dl_close'.  */
237
    unsigned int l_idx;
238
 
239
    struct link_map_machine l_mach;
240
 
241
    struct
242
    {
243
      const ElfW(Sym) *sym;
244
      int type_class;
245
#ifdef DL_LOOKUP_RETURNS_MAP
246
      struct link_map *value;
247
#else
248
      ElfW(Addr) value;
249
#endif
250
      const ElfW(Sym) *ret;
251
    } l_lookup_cache;
252
  };
253
 
254
struct dl_phdr_info
255
  {
256
    ElfW(Addr) dlpi_addr;
257
    const char *dlpi_name;
258
    const ElfW(Phdr) *dlpi_phdr;
259
    ElfW(Half) dlpi_phnum;
260
  };
261
 
262
extern int dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
263
                                             size_t size, void *data),
264
                            void *data);
265
extern int __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
266
                                               size_t size, void *data),
267
                              void *data);
268
 
269
#endif /* link.h */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.