1 /* Look up a symbol in the loaded objects.
2 Copyright (C) 1995-2005, 2006 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27 #include <dl-machine.h>
28 #include <bits/libc-lock.h>
33 #define VERSTAG(tag) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (tag))
35 /* We need this string more than once. */
36 static const char undefined_msg
[] = "undefined symbol: ";
46 #define make_string(string, rest...) \
48 const char *all[] = { string, ## rest }; \
53 for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt) \
54 len += strlen (all[cnt]); \
56 cp = result = alloca (len); \
57 for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt) \
58 cp = __stpcpy (cp, all[cnt]); \
63 /* Statistics function. */
65 # define bump_num_relocations() ++GL(dl_num_relocations)
67 # define bump_num_relocations() ((void) 0)
71 /* The actual lookup code. */
72 #include "do-lookup.h"
76 dl_new_hash (const char *s
)
78 uint_fast32_t h
= 5381;
79 for (unsigned char c
= *s
; c
!= '\0'; c
= *++s
)
81 return h
& 0xffffffff;
85 /* Add extra dependency on MAP to UNDEF_MAP. */
88 add_dependency (struct link_map
*undef_map
, struct link_map
*map
)
90 struct link_map
**list
;
91 struct link_map
*runp
;
96 /* Avoid self-references and references to objects which cannot be
101 /* Make sure nobody can unload the object while we are at it. */
102 __rtld_lock_lock_recursive (GL(dl_load_lock
));
104 /* Avoid references to objects which cannot be unloaded anyway. */
105 if (map
->l_type
!= lt_loaded
106 || (map
->l_flags_1
& DF_1_NODELETE
) != 0)
109 /* If the object with the undefined reference cannot be removed ever
110 just make sure the same is true for the object which contains the
112 if (undef_map
->l_type
!= lt_loaded
113 || (undef_map
->l_flags_1
& DF_1_NODELETE
) != 0)
115 map
->l_flags_1
|= DF_1_NODELETE
;
119 /* Determine whether UNDEF_MAP already has a reference to MAP. First
120 look in the normal dependencies. */
121 if (undef_map
->l_initfini
!= NULL
)
123 list
= undef_map
->l_initfini
;
125 for (i
= 0; list
[i
] != NULL
; ++i
)
130 /* No normal dependency. See whether we already had to add it
131 to the special list of dynamic dependencies. */
132 list
= undef_map
->l_reldeps
;
133 act
= undef_map
->l_reldepsact
;
135 for (i
= 0; i
< act
; ++i
)
139 /* The object is not yet in the dependency list. Before we add
140 it make sure just one more time the object we are about to
141 reference is still available. There is a brief period in
142 which the object could have been removed since we found the
144 runp
= GL(dl_ns
)[undef_map
->l_ns
]._ns_loaded
;
145 while (runp
!= NULL
&& runp
!= map
)
150 /* The object is still available. Add the reference now. */
151 if (__builtin_expect (act
>= undef_map
->l_reldepsmax
, 0))
153 /* Allocate more memory for the dependency list. Since this
154 can never happen during the startup phase we can use
158 undef_map
->l_reldepsmax
+= 5;
159 newp
= realloc (undef_map
->l_reldeps
,
160 undef_map
->l_reldepsmax
161 * sizeof (struct link_map
*));
163 if (__builtin_expect (newp
!= NULL
, 1))
164 undef_map
->l_reldeps
= (struct link_map
**) newp
;
166 /* Correct the addition. */
167 undef_map
->l_reldepsmax
-= 5;
170 /* If we didn't manage to allocate memory for the list this is
171 no fatal mistake. We simply increment the use counter of the
172 referenced object and don't record the dependencies. This
173 means this increment can never be reverted and the object
174 will never be unloaded. This is semantically the correct
176 if (__builtin_expect (act
< undef_map
->l_reldepsmax
, 1))
177 undef_map
->l_reldeps
[undef_map
->l_reldepsact
++] = map
;
179 /* Display information if we are debugging. */
180 if (__builtin_expect (GLRO(dl_debug_mask
) & DL_DEBUG_FILES
, 0))
182 \nfile=%s [%lu]; needed by %s [%lu] (relocation dependency)\n\n",
183 map
->l_name
[0] ? map
->l_name
: rtld_progname
,
186 ? undef_map
->l_name
: rtld_progname
,
190 /* Whoa, that was bad luck. We have to search again. */
194 /* Release the lock. */
195 __rtld_lock_unlock_recursive (GL(dl_load_lock
));
202 _dl_debug_bindings (const char *undef_name
, struct link_map
*undef_map
,
203 const ElfW(Sym
) **ref
, struct sym_val
*value
,
204 const struct r_found_version
*version
, int type_class
,
208 /* Search loaded objects' symbol tables for a definition of the symbol
209 UNDEF_NAME, perhaps with a requested version for the symbol.
211 We must never have calls to the audit functions inside this function
212 or in any function which gets called. If this would happen the audit
213 code might create a thread which can throw off all the scope locking. */
216 _dl_lookup_symbol_x (const char *undef_name
, struct link_map
*undef_map
,
217 const ElfW(Sym
) **ref
,
218 struct r_scope_elem
*symbol_scope
[],
219 const struct r_found_version
*version
,
220 int type_class
, int flags
, struct link_map
*skip_map
)
222 const uint_fast32_t new_hash
= dl_new_hash (undef_name
);
223 unsigned long int old_hash
= 0xffffffff;
224 struct sym_val current_value
= { NULL
, NULL
};
225 struct r_scope_elem
**scope
= symbol_scope
;
227 bump_num_relocations ();
229 /* No other flag than DL_LOOKUP_ADD_DEPENDENCY is allowed if we look
230 up a versioned symbol. */
231 assert (version
== NULL
|| flags
== 0 || flags
== DL_LOOKUP_ADD_DEPENDENCY
);
234 if (__builtin_expect (skip_map
!= NULL
, 0))
236 /* Search the relevant loaded objects for a definition. */
237 while ((*scope
)->r_list
[i
] != skip_map
)
240 assert (i
< (*scope
)->r_nlist
);
243 /* Search the relevant loaded objects for a definition. */
244 for (size_t start
= i
; *scope
!= NULL
; start
= 0, ++scope
)
246 int res
= do_lookup_x (undef_name
, new_hash
, &old_hash
, *ref
,
247 ¤t_value
, *scope
, start
, version
, flags
,
248 skip_map
, type_class
);
252 if (__builtin_expect (res
, 0) < 0 && skip_map
== NULL
)
254 /* Oh, oh. The file named in the relocation entry does not
255 contain the needed symbol. This code is never reached
256 for unversioned lookups. */
257 assert (version
!= NULL
);
258 const char *reference_name
= undef_map
? undef_map
->l_name
: NULL
;
260 /* XXX We cannot translate the message. */
261 _dl_signal_cerror (0, (reference_name
[0]
263 : (rtld_progname
?: "<main program>")),
264 N_("relocation error"),
265 make_string ("symbol ", undef_name
, ", version ",
267 " not defined in file ",
269 " with link time reference",
271 ? " (no version symbols)" : ""));
277 if (__builtin_expect (current_value
.s
== NULL
, 0))
279 if ((*ref
== NULL
|| ELFW(ST_BIND
) ((*ref
)->st_info
) != STB_WEAK
)
282 /* We could find no value for a strong reference. */
283 const char *reference_name
= undef_map
? undef_map
->l_name
: "";
284 const char *versionstr
= version
? ", version " : "";
285 const char *versionname
= (version
&& version
->name
286 ? version
->name
: "");
288 /* XXX We cannot translate the message. */
289 _dl_signal_cerror (0, (reference_name
[0]
291 : (rtld_progname
?: "<main program>")),
292 N_("symbol lookup error"),
293 make_string (undefined_msg
, undef_name
,
294 versionstr
, versionname
));
300 int protected = (*ref
301 && ELFW(ST_VISIBILITY
) ((*ref
)->st_other
) == STV_PROTECTED
);
302 if (__builtin_expect (protected != 0, 0))
304 /* It is very tricky. We need to figure out what value to
305 return for the protected symbol. */
306 if (type_class
== ELF_RTYPE_CLASS_PLT
)
308 if (current_value
.s
!= NULL
&& current_value
.m
!= undef_map
)
310 current_value
.s
= *ref
;
311 current_value
.m
= undef_map
;
316 struct sym_val protected_value
= { NULL
, NULL
};
318 for (scope
= symbol_scope
; *scope
!= NULL
; i
= 0, ++scope
)
319 if (do_lookup_x (undef_name
, new_hash
, &old_hash
, *ref
,
320 &protected_value
, *scope
, i
, version
, flags
,
321 skip_map
, ELF_RTYPE_CLASS_PLT
) != 0)
324 if (protected_value
.s
!= NULL
&& protected_value
.m
!= undef_map
)
326 current_value
.s
= *ref
;
327 current_value
.m
= undef_map
;
332 /* We have to check whether this would bind UNDEF_MAP to an object
333 in the global scope which was dynamically loaded. In this case
334 we have to prevent the latter from being unloaded unless the
335 UNDEF_MAP object is also unloaded. */
336 if (__builtin_expect (current_value
.m
->l_type
== lt_loaded
, 0)
337 /* Don't do this for explicit lookups as opposed to implicit
339 && (flags
& DL_LOOKUP_ADD_DEPENDENCY
) != 0
340 /* Add UNDEF_MAP to the dependencies. */
341 && add_dependency (undef_map
, current_value
.m
) < 0)
342 /* Something went wrong. Perhaps the object we tried to reference
343 was just removed. Try finding another definition. */
344 return _dl_lookup_symbol_x (undef_name
, undef_map
, ref
,
345 symbol_scope
, version
, type_class
,
348 /* The object is used. */
349 current_value
.m
->l_used
= 1;
351 if (__builtin_expect (GLRO(dl_debug_mask
)
352 & (DL_DEBUG_BINDINGS
|DL_DEBUG_PRELINK
), 0))
353 _dl_debug_bindings (undef_name
, undef_map
, ref
,
354 ¤t_value
, version
, type_class
, protected);
356 *ref
= current_value
.s
;
357 return LOOKUP_VALUE (current_value
.m
);
361 /* Cache the location of MAP's hash table. */
365 _dl_setup_hash (struct link_map
*map
)
370 if (__builtin_expect (map
->l_info
[DT_ADDRTAGIDX (DT_GNU_HASH
) + DT_NUM
371 + DT_THISPROCNUM
+ DT_VERSIONTAGNUM
372 + DT_EXTRANUM
+ DT_VALNUM
] != NULL
, 1))
375 = (void *) D_PTR (map
, l_info
[DT_ADDRTAGIDX (DT_GNU_HASH
) + DT_NUM
376 + DT_THISPROCNUM
+ DT_VERSIONTAGNUM
377 + DT_EXTRANUM
+ DT_VALNUM
]);
378 map
->l_nbuckets
= *hash32
++;
379 Elf32_Word symbias
= *hash32
++;
380 Elf32_Word bitmask_nwords
= *hash32
++;
381 /* Must be a power of two. */
382 assert ((bitmask_nwords
& (bitmask_nwords
- 1)) == 0);
383 map
->l_gnu_bitmask_idxbits
= bitmask_nwords
- 1;
384 map
->l_gnu_shift
= *hash32
++;
386 map
->l_gnu_bitmask
= (ElfW(Addr
) *) hash32
;
387 hash32
+= __ELF_NATIVE_CLASS
/ 32 * bitmask_nwords
;
389 map
->l_gnu_buckets
= hash32
;
390 hash32
+= map
->l_nbuckets
;
391 map
->l_gnu_chain_zero
= hash32
- symbias
;
395 if (!map
->l_info
[DT_HASH
])
397 hash
= (void *) D_PTR (map
, l_info
[DT_HASH
]);
399 map
->l_nbuckets
= *hash
++;
401 map
->l_buckets
= hash
;
402 hash
+= map
->l_nbuckets
;
409 _dl_debug_bindings (const char *undef_name
, struct link_map
*undef_map
,
410 const ElfW(Sym
) **ref
, struct sym_val
*value
,
411 const struct r_found_version
*version
, int type_class
,
414 const char *reference_name
= undef_map
->l_name
;
416 if (GLRO(dl_debug_mask
) & DL_DEBUG_BINDINGS
)
418 _dl_debug_printf ("binding file %s [%lu] to %s [%lu]: %s symbol `%s'",
421 : (rtld_progname
?: "<main program>")),
423 value
->m
->l_name
[0] ? value
->m
->l_name
: rtld_progname
,
425 protected ? "protected" : "normal", undef_name
);
427 _dl_debug_printf_c (" [%s]\n", version
->name
);
429 _dl_debug_printf_c ("\n");
432 if (GLRO(dl_debug_mask
) & DL_DEBUG_PRELINK
)
435 struct sym_val val
= { NULL
, NULL
};
437 if ((GLRO(dl_trace_prelink_map
) == NULL
438 || GLRO(dl_trace_prelink_map
) == GL(dl_ns
)[LM_ID_BASE
]._ns_loaded
)
439 && undef_map
!= GL(dl_ns
)[LM_ID_BASE
]._ns_loaded
)
441 const uint_fast32_t new_hash
= dl_new_hash (undef_name
);
442 unsigned long int old_hash
= 0xffffffff;
444 do_lookup_x (undef_name
, new_hash
, &old_hash
, *ref
, &val
,
445 undef_map
->l_local_scope
[0], 0, version
, 0, NULL
,
448 if (val
.s
!= value
->s
|| val
.m
!= value
->m
)
453 && (__builtin_expect (ELFW(ST_TYPE
) (value
->s
->st_info
)
458 || GLRO(dl_trace_prelink_map
) == undef_map
459 || GLRO(dl_trace_prelink_map
) == NULL
462 _dl_printf ("%s 0x%0*Zx 0x%0*Zx -> 0x%0*Zx 0x%0*Zx ",
463 conflict
? "conflict" : "lookup",
464 (int) sizeof (ElfW(Addr
)) * 2,
465 (size_t) undef_map
->l_map_start
,
466 (int) sizeof (ElfW(Addr
)) * 2,
467 (size_t) (((ElfW(Addr
)) *ref
) - undef_map
->l_map_start
),
468 (int) sizeof (ElfW(Addr
)) * 2,
469 (size_t) (value
->s
? value
->m
->l_map_start
: 0),
470 (int) sizeof (ElfW(Addr
)) * 2,
471 (size_t) (value
->s
? value
->s
->st_value
: 0));
474 _dl_printf ("x 0x%0*Zx 0x%0*Zx ",
475 (int) sizeof (ElfW(Addr
)) * 2,
476 (size_t) (val
.s
? val
.m
->l_map_start
: 0),
477 (int) sizeof (ElfW(Addr
)) * 2,
478 (size_t) (val
.s
? val
.s
->st_value
: 0));
480 _dl_printf ("/%x %s\n", type_class
, undef_name
);