1 | /* 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 */ |
---|