1 /* Look up a symbol in the loaded objects.
2 Copyright (C) 1995-2005, 2006, 2007 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 <sysdep-cancel.h>
29 #include <bits/libc-lock.h>
34 #define VERSTAG(tag) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (tag))
36 /* We need this string more than once. */
37 static const char undefined_msg
[] = "undefined symbol: ";
47 #define make_string(string, rest...) \
49 const char *all[] = { string, ## rest }; \
54 for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt) \
55 len += strlen (all[cnt]); \
57 cp = result = alloca (len); \
58 for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt) \
59 cp = __stpcpy (cp, all[cnt]); \
64 /* Statistics function. */
66 # define bump_num_relocations() ++GL(dl_num_relocations)
68 # define bump_num_relocations() ((void) 0)
72 /* The actual lookup code. */
73 #include "do-lookup.h"
77 dl_new_hash (const char *s
)
79 uint_fast32_t h
= 5381;
80 for (unsigned char c
= *s
; c
!= '\0'; c
= *++s
)
82 return h
& 0xffffffff;
86 /* Add extra dependency on MAP to UNDEF_MAP. */
89 add_dependency (struct link_map
*undef_map
, struct link_map
*map
, int flags
)
91 struct link_map
**list
;
92 struct link_map
*runp
;
97 /* Avoid self-references and references to objects which cannot be
102 /* Make sure nobody can unload the object while we are at it.
103 If we hold a scope lock drop it now to avoid ABBA locking problems. */
104 if ((flags
& DL_LOOKUP_SCOPE_LOCK
) != 0 && !RTLD_SINGLE_THREAD_P
)
106 __rtld_mrlock_unlock (undef_map
->l_scope_lock
);
108 __rtld_lock_lock_recursive (GL(dl_load_lock
));
110 __rtld_mrlock_lock (undef_map
->l_scope_lock
);
113 __rtld_lock_lock_recursive (GL(dl_load_lock
));
115 /* Avoid references to objects which cannot be unloaded anyway. */
116 if (map
->l_type
!= lt_loaded
117 || (map
->l_flags_1
& DF_1_NODELETE
) != 0)
120 /* If the object with the undefined reference cannot be removed ever
121 just make sure the same is true for the object which contains the
123 if (undef_map
->l_type
!= lt_loaded
124 || (undef_map
->l_flags_1
& DF_1_NODELETE
) != 0)
126 map
->l_flags_1
|= DF_1_NODELETE
;
130 /* Determine whether UNDEF_MAP already has a reference to MAP. First
131 look in the normal dependencies. */
132 if (undef_map
->l_initfini
!= NULL
)
134 list
= undef_map
->l_initfini
;
136 for (i
= 0; list
[i
] != NULL
; ++i
)
141 /* No normal dependency. See whether we already had to add it
142 to the special list of dynamic dependencies. */
143 list
= undef_map
->l_reldeps
;
144 act
= undef_map
->l_reldepsact
;
146 for (i
= 0; i
< act
; ++i
)
150 /* The object is not yet in the dependency list. Before we add
151 it make sure just one more time the object we are about to
152 reference is still available. There is a brief period in
153 which the object could have been removed since we found the
155 runp
= GL(dl_ns
)[undef_map
->l_ns
]._ns_loaded
;
156 while (runp
!= NULL
&& runp
!= map
)
161 /* The object is still available. Add the reference now. */
162 if (__builtin_expect (act
>= undef_map
->l_reldepsmax
, 0))
164 /* Allocate more memory for the dependency list. Since this
165 can never happen during the startup phase we can use
169 undef_map
->l_reldepsmax
+= 5;
170 newp
= realloc (undef_map
->l_reldeps
,
171 undef_map
->l_reldepsmax
172 * sizeof (struct link_map
*));
174 if (__builtin_expect (newp
!= NULL
, 1))
175 undef_map
->l_reldeps
= (struct link_map
**) newp
;
177 /* Correct the addition. */
178 undef_map
->l_reldepsmax
-= 5;
181 /* If we didn't manage to allocate memory for the list this is
182 no fatal mistake. We simply increment the use counter of the
183 referenced object and don't record the dependencies. This
184 means this increment can never be reverted and the object
185 will never be unloaded. This is semantically the correct
187 if (__builtin_expect (act
< undef_map
->l_reldepsmax
, 1))
188 undef_map
->l_reldeps
[undef_map
->l_reldepsact
++] = map
;
190 /* Display information if we are debugging. */
191 if (__builtin_expect (GLRO(dl_debug_mask
) & DL_DEBUG_FILES
, 0))
193 \nfile=%s [%lu]; needed by %s [%lu] (relocation dependency)\n\n",
194 map
->l_name
[0] ? map
->l_name
: rtld_progname
,
197 ? undef_map
->l_name
: rtld_progname
,
201 /* Whoa, that was bad luck. We have to search again. */
205 /* Release the lock. */
206 __rtld_lock_unlock_recursive (GL(dl_load_lock
));
213 _dl_debug_bindings (const char *undef_name
, struct link_map
*undef_map
,
214 const ElfW(Sym
) **ref
, struct sym_val
*value
,
215 const struct r_found_version
*version
, int type_class
,
219 /* Search loaded objects' symbol tables for a definition of the symbol
220 UNDEF_NAME, perhaps with a requested version for the symbol.
222 We must never have calls to the audit functions inside this function
223 or in any function which gets called. If this would happen the audit
224 code might create a thread which can throw off all the scope locking. */
227 _dl_lookup_symbol_x (const char *undef_name
, struct link_map
*undef_map
,
228 const ElfW(Sym
) **ref
,
229 struct r_scope_elem
*symbol_scope
[],
230 const struct r_found_version
*version
,
231 int type_class
, int flags
, struct link_map
*skip_map
)
233 const uint_fast32_t new_hash
= dl_new_hash (undef_name
);
234 unsigned long int old_hash
= 0xffffffff;
235 struct sym_val current_value
= { NULL
, NULL
};
236 struct r_scope_elem
**scope
= symbol_scope
;
238 bump_num_relocations ();
240 /* No other flag than DL_LOOKUP_ADD_DEPENDENCY and DL_LOOKUP_SCOPE_LOCK
241 is allowed if we look up a versioned symbol. */
242 assert (version
== NULL
|| (flags
& ~(DL_LOOKUP_ADD_DEPENDENCY
243 | DL_LOOKUP_SCOPE_LOCK
)) == 0);
246 if (__builtin_expect (skip_map
!= NULL
, 0))
247 /* Search the relevant loaded objects for a definition. */
248 while ((*scope
)->r_list
[i
] != skip_map
)
251 /* Search the relevant loaded objects for a definition. */
252 for (size_t start
= i
; *scope
!= NULL
; start
= 0, ++scope
)
254 int res
= do_lookup_x (undef_name
, new_hash
, &old_hash
, *ref
,
255 ¤t_value
, *scope
, start
, version
, flags
,
256 skip_map
, type_class
);
260 if (__builtin_expect (res
, 0) < 0 && skip_map
== NULL
)
262 /* Oh, oh. The file named in the relocation entry does not
263 contain the needed symbol. This code is never reached
264 for unversioned lookups. */
265 assert (version
!= NULL
);
266 const char *reference_name
= undef_map
? undef_map
->l_name
: NULL
;
268 /* XXX We cannot translate the message. */
269 _dl_signal_cerror (0, (reference_name
[0]
271 : (rtld_progname
?: "<main program>")),
272 N_("relocation error"),
273 make_string ("symbol ", undef_name
, ", version ",
275 " not defined in file ",
277 " with link time reference",
279 ? " (no version symbols)" : ""));
285 if (__builtin_expect (current_value
.s
== NULL
, 0))
287 if ((*ref
== NULL
|| ELFW(ST_BIND
) ((*ref
)->st_info
) != STB_WEAK
)
290 /* We could find no value for a strong reference. */
291 const char *reference_name
= undef_map
? undef_map
->l_name
: "";
292 const char *versionstr
= version
? ", version " : "";
293 const char *versionname
= (version
&& version
->name
294 ? version
->name
: "");
296 /* XXX We cannot translate the message. */
297 _dl_signal_cerror (0, (reference_name
[0]
299 : (rtld_progname
?: "<main program>")),
300 N_("symbol lookup error"),
301 make_string (undefined_msg
, undef_name
,
302 versionstr
, versionname
));
308 int protected = (*ref
309 && ELFW(ST_VISIBILITY
) ((*ref
)->st_other
) == STV_PROTECTED
);
310 if (__builtin_expect (protected != 0, 0))
312 /* It is very tricky. We need to figure out what value to
313 return for the protected symbol. */
314 if (type_class
== ELF_RTYPE_CLASS_PLT
)
316 if (current_value
.s
!= NULL
&& current_value
.m
!= undef_map
)
318 current_value
.s
= *ref
;
319 current_value
.m
= undef_map
;
324 struct sym_val protected_value
= { NULL
, NULL
};
326 for (scope
= symbol_scope
; *scope
!= NULL
; i
= 0, ++scope
)
327 if (do_lookup_x (undef_name
, new_hash
, &old_hash
, *ref
,
328 &protected_value
, *scope
, i
, version
, flags
,
329 skip_map
, ELF_RTYPE_CLASS_PLT
) != 0)
332 if (protected_value
.s
!= NULL
&& protected_value
.m
!= undef_map
)
334 current_value
.s
= *ref
;
335 current_value
.m
= undef_map
;
340 /* We have to check whether this would bind UNDEF_MAP to an object
341 in the global scope which was dynamically loaded. In this case
342 we have to prevent the latter from being unloaded unless the
343 UNDEF_MAP object is also unloaded. */
344 if (__builtin_expect (current_value
.m
->l_type
== lt_loaded
, 0)
345 /* Don't do this for explicit lookups as opposed to implicit
347 && (flags
& DL_LOOKUP_ADD_DEPENDENCY
) != 0
348 /* Add UNDEF_MAP to the dependencies. */
349 && add_dependency (undef_map
, current_value
.m
, flags
) < 0)
350 /* Something went wrong. Perhaps the object we tried to reference
351 was just removed. Try finding another definition. */
352 return _dl_lookup_symbol_x (undef_name
, undef_map
, ref
,
353 (flags
& DL_LOOKUP_SCOPE_LOCK
) == 0
354 ? symbol_scope
: undef_map
->l_scope
, version
,
355 type_class
, flags
, skip_map
);
357 /* The object is used. */
358 current_value
.m
->l_used
= 1;
360 if (__builtin_expect (GLRO(dl_debug_mask
)
361 & (DL_DEBUG_BINDINGS
|DL_DEBUG_PRELINK
), 0))
362 _dl_debug_bindings (undef_name
, undef_map
, ref
,
363 ¤t_value
, version
, type_class
, protected);
365 *ref
= current_value
.s
;
366 return LOOKUP_VALUE (current_value
.m
);
370 /* Cache the location of MAP's hash table. */
374 _dl_setup_hash (struct link_map
*map
)
379 if (__builtin_expect (map
->l_info
[DT_ADDRTAGIDX (DT_GNU_HASH
) + DT_NUM
380 + DT_THISPROCNUM
+ DT_VERSIONTAGNUM
381 + DT_EXTRANUM
+ DT_VALNUM
] != NULL
, 1))
384 = (void *) D_PTR (map
, l_info
[DT_ADDRTAGIDX (DT_GNU_HASH
) + DT_NUM
385 + DT_THISPROCNUM
+ DT_VERSIONTAGNUM
386 + DT_EXTRANUM
+ DT_VALNUM
]);
387 map
->l_nbuckets
= *hash32
++;
388 Elf32_Word symbias
= *hash32
++;
389 Elf32_Word bitmask_nwords
= *hash32
++;
390 /* Must be a power of two. */
391 assert ((bitmask_nwords
& (bitmask_nwords
- 1)) == 0);
392 map
->l_gnu_bitmask_idxbits
= bitmask_nwords
- 1;
393 map
->l_gnu_shift
= *hash32
++;
395 map
->l_gnu_bitmask
= (ElfW(Addr
) *) hash32
;
396 hash32
+= __ELF_NATIVE_CLASS
/ 32 * bitmask_nwords
;
398 map
->l_gnu_buckets
= hash32
;
399 hash32
+= map
->l_nbuckets
;
400 map
->l_gnu_chain_zero
= hash32
- symbias
;
404 if (!map
->l_info
[DT_HASH
])
406 hash
= (void *) D_PTR (map
, l_info
[DT_HASH
]);
408 map
->l_nbuckets
= *hash
++;
410 map
->l_buckets
= hash
;
411 hash
+= map
->l_nbuckets
;
418 _dl_debug_bindings (const char *undef_name
, struct link_map
*undef_map
,
419 const ElfW(Sym
) **ref
, struct sym_val
*value
,
420 const struct r_found_version
*version
, int type_class
,
423 const char *reference_name
= undef_map
->l_name
;
425 if (GLRO(dl_debug_mask
) & DL_DEBUG_BINDINGS
)
427 _dl_debug_printf ("binding file %s [%lu] to %s [%lu]: %s symbol `%s'",
430 : (rtld_progname
?: "<main program>")),
432 value
->m
->l_name
[0] ? value
->m
->l_name
: rtld_progname
,
434 protected ? "protected" : "normal", undef_name
);
436 _dl_debug_printf_c (" [%s]\n", version
->name
);
438 _dl_debug_printf_c ("\n");
441 if (GLRO(dl_debug_mask
) & DL_DEBUG_PRELINK
)
444 struct sym_val val
= { NULL
, NULL
};
446 if ((GLRO(dl_trace_prelink_map
) == NULL
447 || GLRO(dl_trace_prelink_map
) == GL(dl_ns
)[LM_ID_BASE
]._ns_loaded
)
448 && undef_map
!= GL(dl_ns
)[LM_ID_BASE
]._ns_loaded
)
450 const uint_fast32_t new_hash
= dl_new_hash (undef_name
);
451 unsigned long int old_hash
= 0xffffffff;
453 do_lookup_x (undef_name
, new_hash
, &old_hash
, *ref
, &val
,
454 undef_map
->l_local_scope
[0], 0, version
, 0, NULL
,
457 if (val
.s
!= value
->s
|| val
.m
!= value
->m
)
462 && (__builtin_expect (ELFW(ST_TYPE
) (value
->s
->st_info
)
467 || GLRO(dl_trace_prelink_map
) == undef_map
468 || GLRO(dl_trace_prelink_map
) == NULL
471 _dl_printf ("%s 0x%0*Zx 0x%0*Zx -> 0x%0*Zx 0x%0*Zx ",
472 conflict
? "conflict" : "lookup",
473 (int) sizeof (ElfW(Addr
)) * 2,
474 (size_t) undef_map
->l_map_start
,
475 (int) sizeof (ElfW(Addr
)) * 2,
476 (size_t) (((ElfW(Addr
)) *ref
) - undef_map
->l_map_start
),
477 (int) sizeof (ElfW(Addr
)) * 2,
478 (size_t) (value
->s
? value
->m
->l_map_start
: 0),
479 (int) sizeof (ElfW(Addr
)) * 2,
480 (size_t) (value
->s
? value
->s
->st_value
: 0));
483 _dl_printf ("x 0x%0*Zx 0x%0*Zx ",
484 (int) sizeof (ElfW(Addr
)) * 2,
485 (size_t) (val
.s
? val
.m
->l_map_start
: 0),
486 (int) sizeof (ElfW(Addr
)) * 2,
487 (size_t) (val
.s
? val
.s
->st_value
: 0));
489 _dl_printf ("/%x %s\n", type_class
, undef_name
);