1 /* Look up a symbol in the loaded objects.
2 Copyright (C) 1995-2005, 2006, 2007, 2009, 2010
3 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
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.
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.
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
28 #include <dl-machine.h>
29 #include <sysdep-cancel.h>
30 #include <bits/libc-lock.h>
35 #define VERSTAG(tag) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (tag))
37 /* We need this string more than once. */
38 static const char undefined_msg
[] = "undefined symbol: ";
48 #define make_string(string, rest...) \
50 const char *all[] = { string, ## rest }; \
55 for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt) \
56 len += strlen (all[cnt]); \
58 cp = result = alloca (len); \
59 for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt) \
60 cp = __stpcpy (cp, all[cnt]); \
65 /* Statistics function. */
67 # define bump_num_relocations() ++GL(dl_num_relocations)
69 # define bump_num_relocations() ((void) 0)
73 /* Inner part of the lookup functions. We return a value > 0 if we
74 found the symbol, the value 0 if nothing is found and < 0 if
75 something bad happened. */
77 __attribute_noinline__
78 do_lookup_x (const char *undef_name
, uint_fast32_t new_hash
,
79 unsigned long int *old_hash
, const ElfW(Sym
) *ref
,
80 struct sym_val
*result
, struct r_scope_elem
*scope
, size_t i
,
81 const struct r_found_version
*const version
, int flags
,
82 struct link_map
*skip
, int type_class
, struct link_map
*undef_map
)
84 size_t n
= scope
->r_nlist
;
85 /* Make sure we read the value before proceeding. Otherwise we
86 might use r_list pointing to the initial scope and r_nlist being
87 the value after a resize. That is the only path in dl-open.c not
88 protected by GSCOPE. A read barrier here might be to expensive. */
89 __asm
volatile ("" : "+r" (n
), "+m" (scope
->r_list
));
90 struct link_map
**list
= scope
->r_list
;
94 /* These variables are used in the nested function. */
97 const ElfW(Sym
) *versioned_sym
= NULL
;
99 const struct link_map
*map
= list
[i
]->l_real
;
101 /* Here come the extra test needed for `_dl_lookup_symbol_skip'. */
105 /* Don't search the executable when resolving a copy reloc. */
106 if ((type_class
& ELF_RTYPE_CLASS_COPY
) && map
->l_type
== lt_executable
)
109 /* Do not look into objects which are going to be removed. */
113 /* Print some debugging info if wanted. */
114 if (__builtin_expect (GLRO(dl_debug_mask
) & DL_DEBUG_SYMBOLS
, 0))
115 _dl_debug_printf ("symbol=%s; lookup in file=%s [%lu]\n",
117 map
->l_name
[0] ? map
->l_name
: rtld_progname
,
120 /* If the hash table is empty there is nothing to do here. */
121 if (map
->l_nbuckets
== 0)
124 /* The tables for this map. */
125 const ElfW(Sym
) *symtab
= (const void *) D_PTR (map
, l_info
[DT_SYMTAB
]);
126 const char *strtab
= (const void *) D_PTR (map
, l_info
[DT_STRTAB
]);
129 /* Nested routine to check whether the symbol matches. */
131 __attribute_noinline__
132 check_match (const ElfW(Sym
) *sym
)
134 unsigned int stt
= ELFW(ST_TYPE
) (sym
->st_info
);
135 assert (ELF_RTYPE_CLASS_PLT
== 1);
136 if (__builtin_expect ((sym
->st_value
== 0 /* No value. */
138 || (type_class
& (sym
->st_shndx
== SHN_UNDEF
)),
142 /* Ignore all but STT_NOTYPE, STT_OBJECT, STT_FUNC,
143 STT_COMMON, STT_TLS, and STT_GNU_IFUNC since these are no
144 code/data definitions. */
145 #define ALLOWED_STT \
146 ((1 << STT_NOTYPE) | (1 << STT_OBJECT) | (1 << STT_FUNC) \
147 | (1 << STT_COMMON) | (1 << STT_TLS) | (1 << STT_GNU_IFUNC))
148 if (__builtin_expect (((1 << stt
) & ALLOWED_STT
) == 0, 0))
151 if (sym
!= ref
&& strcmp (strtab
+ sym
->st_name
, undef_name
))
152 /* Not the symbol we are looking for. */
155 const ElfW(Half
) *verstab
= map
->l_versyms
;
158 if (__builtin_expect (verstab
== NULL
, 0))
160 /* We need a versioned symbol but haven't found any. If
161 this is the object which is referenced in the verneed
162 entry it is a bug in the library since a symbol must
163 not simply disappear.
165 It would also be a bug in the object since it means that
166 the list of required versions is incomplete and so the
167 tests in dl-version.c haven't found a problem.*/
168 assert (version
->filename
== NULL
169 || ! _dl_name_match_p (version
->filename
, map
));
171 /* Otherwise we accept the symbol. */
175 /* We can match the version information or use the
176 default one if it is not hidden. */
177 ElfW(Half
) ndx
= verstab
[symidx
] & 0x7fff;
178 if ((map
->l_versions
[ndx
].hash
!= version
->hash
179 || strcmp (map
->l_versions
[ndx
].name
, version
->name
))
180 && (version
->hidden
|| map
->l_versions
[ndx
].hash
181 || (verstab
[symidx
] & 0x8000)))
182 /* It's not the version we want. */
188 /* No specific version is selected. There are two ways we
191 - a binary which does not include versioning information
194 - dlsym() instead of dlvsym() is used to get a symbol which
195 might exist in more than one form
197 If the library does not provide symbol version information
198 there is no problem at at: we simply use the symbol if it
201 These two lookups need to be handled differently if the
202 library defines versions. In the case of the old
203 unversioned application the oldest (default) version
204 should be used. In case of a dlsym() call the latest and
205 public interface should be returned. */
208 if ((verstab
[symidx
] & 0x7fff)
209 >= ((flags
& DL_LOOKUP_RETURN_NEWEST
) ? 2 : 3))
211 /* Don't accept hidden symbols. */
212 if ((verstab
[symidx
] & 0x8000) == 0
213 && num_versions
++ == 0)
214 /* No version so far. */
222 /* There cannot be another entry for this symbol so stop here. */
226 const ElfW(Sym
) *sym
;
227 const ElfW(Addr
) *bitmask
= map
->l_gnu_bitmask
;
228 if (__builtin_expect (bitmask
!= NULL
, 1))
230 ElfW(Addr
) bitmask_word
231 = bitmask
[(new_hash
/ __ELF_NATIVE_CLASS
)
232 & map
->l_gnu_bitmask_idxbits
];
234 unsigned int hashbit1
= new_hash
& (__ELF_NATIVE_CLASS
- 1);
235 unsigned int hashbit2
= ((new_hash
>> map
->l_gnu_shift
)
236 & (__ELF_NATIVE_CLASS
- 1));
238 if (__builtin_expect ((bitmask_word
>> hashbit1
)
239 & (bitmask_word
>> hashbit2
) & 1, 0))
241 Elf32_Word bucket
= map
->l_gnu_buckets
[new_hash
245 const Elf32_Word
*hasharr
= &map
->l_gnu_chain_zero
[bucket
];
248 if (((*hasharr
^ new_hash
) >> 1) == 0)
250 symidx
= hasharr
- map
->l_gnu_chain_zero
;
251 sym
= check_match (&symtab
[symidx
]);
255 while ((*hasharr
++ & 1u) == 0);
258 /* No symbol found. */
263 if (*old_hash
== 0xffffffff)
264 *old_hash
= _dl_elf_hash (undef_name
);
266 /* Use the old SysV-style hash table. Search the appropriate
267 hash bucket in this object's symbol table for a definition
268 for the same symbol name. */
269 for (symidx
= map
->l_buckets
[*old_hash
% map
->l_nbuckets
];
271 symidx
= map
->l_chain
[symidx
])
273 sym
= check_match (&symtab
[symidx
]);
279 /* If we have seen exactly one versioned symbol while we are
280 looking for an unversioned symbol and the version is not the
281 default version we still accept this symbol since there are
282 no possible ambiguities. */
283 sym
= num_versions
== 1 ? versioned_sym
: NULL
;
288 switch (__builtin_expect (ELFW(ST_BIND
) (sym
->st_info
), STB_GLOBAL
))
291 /* Weak definition. Use this value if we don't find another. */
292 if (__builtin_expect (GLRO(dl_dynamic_weak
), 0))
297 result
->m
= (struct link_map
*) map
;
304 /* Global definition. Just what we need. */
306 result
->m
= (struct link_map
*) map
;
309 case STB_GNU_UNIQUE
:;
310 /* We have to determine whether we already found a
311 symbol with this name before. If not then we have to
312 add it to the search table. If we already found a
313 definition we have to use it. */
314 void enter (struct unique_sym
*table
, size_t size
,
315 unsigned int hash
, const char *name
,
316 const ElfW(Sym
) *sym
, struct link_map
*map
)
318 size_t idx
= hash
% size
;
319 size_t hash2
= 1 + hash
% (size
- 2);
322 if (table
[idx
].name
== NULL
)
324 table
[idx
].hashval
= hash
;
325 table
[idx
].name
= name
;
326 if ((type_class
& ELF_RTYPE_CLASS_COPY
) != 0)
328 table
[idx
].sym
= ref
;
329 table
[idx
].map
= undef_map
;
333 table
[idx
].sym
= sym
;
334 table
[idx
].map
= map
;
336 if (map
->l_type
== lt_loaded
)
337 /* Make sure we don't unload this object by
338 setting the appropriate flag. */
339 map
->l_flags_1
|= DF_1_NODELETE
;
351 struct unique_sym_table
*tab
352 = &GL(dl_ns
)[map
->l_ns
]._ns_unique_sym_table
;
354 __rtld_lock_lock_recursive (tab
->lock
);
356 struct unique_sym
*entries
= tab
->entries
;
357 size_t size
= tab
->size
;
360 size_t idx
= new_hash
% size
;
361 size_t hash2
= 1 + new_hash
% (size
- 2);
364 if (entries
[idx
].hashval
== new_hash
365 && strcmp (entries
[idx
].name
, undef_name
) == 0)
367 result
->s
= entries
[idx
].sym
;
368 result
->m
= (struct link_map
*) entries
[idx
].map
;
369 __rtld_lock_unlock_recursive (tab
->lock
);
373 if (entries
[idx
].name
== NULL
)
381 if (size
* 3 <= tab
->n_elements
* 4)
383 /* Expand the table. */
384 #ifdef RTLD_CHECK_FOREIGN_CALL
385 /* This must not happen during runtime relocations. */
386 assert (!RTLD_CHECK_FOREIGN_CALL
);
388 size_t newsize
= _dl_higher_prime_number (size
+ 1);
389 struct unique_sym
*newentries
390 = calloc (sizeof (struct unique_sym
), newsize
);
391 if (newentries
== NULL
)
394 __rtld_lock_unlock_recursive (tab
->lock
);
395 _dl_fatal_printf ("out of memory\n");
398 for (idx
= 0; idx
< size
; ++idx
)
399 if (entries
[idx
].name
!= NULL
)
400 enter (newentries
, newsize
, entries
[idx
].hashval
,
401 entries
[idx
].name
, entries
[idx
].sym
,
407 entries
= tab
->entries
= newentries
;
413 #ifdef RTLD_CHECK_FOREIGN_CALL
414 /* This must not happen during runtime relocations. */
415 assert (!RTLD_CHECK_FOREIGN_CALL
);
419 /* If tab->entries is NULL, but tab->size is not, it means
420 this is the second, conflict finding, lookup for
421 LD_TRACE_PRELINKING in _dl_debug_bindings. Don't
422 allocate anything and don't enter anything into the
424 if (__builtin_expect (tab
->size
, 0))
426 assert (GLRO(dl_debug_mask
) & DL_DEBUG_PRELINK
);
427 __rtld_lock_unlock_recursive (tab
->lock
);
432 #define INITIAL_NUNIQUE_SYM_TABLE 31
433 size
= INITIAL_NUNIQUE_SYM_TABLE
;
434 entries
= calloc (sizeof (struct unique_sym
), size
);
438 tab
->entries
= entries
;
443 enter (entries
, size
, new_hash
, strtab
+ sym
->st_name
, sym
,
444 (struct link_map
*) map
);
447 __rtld_lock_unlock_recursive (tab
->lock
);
452 /* Local symbols are ignored. */
457 /* If this current map is the one mentioned in the verneed entry
458 and we have not found a weak entry, it is a bug. */
459 if (symidx
== STN_UNDEF
&& version
!= NULL
&& version
->filename
!= NULL
460 && __builtin_expect (_dl_name_match_p (version
->filename
, map
), 0))
465 /* We have not found anything until now. */
471 dl_new_hash (const char *s
)
473 uint_fast32_t h
= 5381;
474 for (unsigned char c
= *s
; c
!= '\0'; c
= *++s
)
476 return h
& 0xffffffff;
480 /* Add extra dependency on MAP to UNDEF_MAP. */
483 add_dependency (struct link_map
*undef_map
, struct link_map
*map
, int flags
)
485 struct link_map
*runp
;
489 /* Avoid self-references and references to objects which cannot be
491 if (undef_map
== map
)
494 /* Avoid references to objects which cannot be unloaded anyway. */
495 assert (map
->l_type
== lt_loaded
);
496 if ((map
->l_flags_1
& DF_1_NODELETE
) != 0)
499 struct link_map_reldeps
*l_reldeps
500 = atomic_forced_read (undef_map
->l_reldeps
);
502 /* Make sure l_reldeps is read before l_initfini. */
503 atomic_read_barrier ();
505 /* Determine whether UNDEF_MAP already has a reference to MAP. First
506 look in the normal dependencies. */
507 struct link_map
**l_initfini
= atomic_forced_read (undef_map
->l_initfini
);
508 if (l_initfini
!= NULL
)
510 for (i
= 0; l_initfini
[i
] != NULL
; ++i
)
511 if (l_initfini
[i
] == map
)
515 /* No normal dependency. See whether we already had to add it
516 to the special list of dynamic dependencies. */
517 unsigned int l_reldepsact
= 0;
518 if (l_reldeps
!= NULL
)
520 struct link_map
**list
= &l_reldeps
->list
[0];
521 l_reldepsact
= l_reldeps
->act
;
522 for (i
= 0; i
< l_reldepsact
; ++i
)
527 /* Save serial number of the target MAP. */
528 unsigned long long serial
= map
->l_serial
;
530 /* Make sure nobody can unload the object while we are at it. */
531 if (__builtin_expect (flags
& DL_LOOKUP_GSCOPE_LOCK
, 0))
533 /* We can't just call __rtld_lock_lock_recursive (GL(dl_load_lock))
534 here, that can result in ABBA deadlock. */
535 THREAD_GSCOPE_RESET_FLAG ();
536 __rtld_lock_lock_recursive (GL(dl_load_lock
));
537 /* While MAP value won't change, after THREAD_GSCOPE_RESET_FLAG ()
538 it can e.g. point to unallocated memory. So avoid the optimizer
539 treating the above read from MAP->l_serial as ensurance it
540 can safely dereference it. */
541 map
= atomic_forced_read (map
);
543 /* From this point on it is unsafe to dereference MAP, until it
544 has been found in one of the lists. */
546 /* Redo the l_initfini check in case undef_map's l_initfini
547 changed in the mean time. */
548 if (undef_map
->l_initfini
!= l_initfini
549 && undef_map
->l_initfini
!= NULL
)
551 l_initfini
= undef_map
->l_initfini
;
552 for (i
= 0; l_initfini
[i
] != NULL
; ++i
)
553 if (l_initfini
[i
] == map
)
557 /* Redo the l_reldeps check if undef_map's l_reldeps changed in
559 if (undef_map
->l_reldeps
!= NULL
)
561 if (undef_map
->l_reldeps
!= l_reldeps
)
563 struct link_map
**list
= &undef_map
->l_reldeps
->list
[0];
564 l_reldepsact
= undef_map
->l_reldeps
->act
;
565 for (i
= 0; i
< l_reldepsact
; ++i
)
569 else if (undef_map
->l_reldeps
->act
> l_reldepsact
)
571 struct link_map
**list
572 = &undef_map
->l_reldeps
->list
[0];
574 l_reldepsact
= undef_map
->l_reldeps
->act
;
575 for (; i
< l_reldepsact
; ++i
)
582 __rtld_lock_lock_recursive (GL(dl_load_lock
));
584 /* The object is not yet in the dependency list. Before we add
585 it make sure just one more time the object we are about to
586 reference is still available. There is a brief period in
587 which the object could have been removed since we found the
589 runp
= GL(dl_ns
)[undef_map
->l_ns
]._ns_loaded
;
590 while (runp
!= NULL
&& runp
!= map
)
595 /* The object is still available. */
597 /* MAP could have been dlclosed, freed and then some other dlopened
598 library could have the same link_map pointer. */
599 if (map
->l_serial
!= serial
)
602 /* Redo the NODELETE check, as when dl_load_lock wasn't held
603 yet this could have changed. */
604 if ((map
->l_flags_1
& DF_1_NODELETE
) != 0)
607 /* If the object with the undefined reference cannot be removed ever
608 just make sure the same is true for the object which contains the
610 if (undef_map
->l_type
!= lt_loaded
611 || (undef_map
->l_flags_1
& DF_1_NODELETE
) != 0)
613 map
->l_flags_1
|= DF_1_NODELETE
;
617 /* Add the reference now. */
618 if (__builtin_expect (l_reldepsact
>= undef_map
->l_reldepsmax
, 0))
620 /* Allocate more memory for the dependency list. Since this
621 can never happen during the startup phase we can use
623 struct link_map_reldeps
*newp
;
625 = undef_map
->l_reldepsmax
? undef_map
->l_reldepsmax
* 2 : 10;
627 #ifdef RTLD_PREPARE_FOREIGN_CALL
628 RTLD_PREPARE_FOREIGN_CALL
;
631 newp
= malloc (sizeof (*newp
) + max
* sizeof (struct link_map
*));
634 /* If we didn't manage to allocate memory for the list this is
635 no fatal problem. We simply make sure the referenced object
636 cannot be unloaded. This is semantically the correct
638 map
->l_flags_1
|= DF_1_NODELETE
;
644 memcpy (&newp
->list
[0], &undef_map
->l_reldeps
->list
[0],
645 l_reldepsact
* sizeof (struct link_map
*));
646 newp
->list
[l_reldepsact
] = map
;
647 newp
->act
= l_reldepsact
+ 1;
648 atomic_write_barrier ();
649 void *old
= undef_map
->l_reldeps
;
650 undef_map
->l_reldeps
= newp
;
651 undef_map
->l_reldepsmax
= max
;
653 _dl_scope_free (old
);
658 undef_map
->l_reldeps
->list
[l_reldepsact
] = map
;
659 atomic_write_barrier ();
660 undef_map
->l_reldeps
->act
= l_reldepsact
+ 1;
663 /* Display information if we are debugging. */
664 if (__builtin_expect (GLRO(dl_debug_mask
) & DL_DEBUG_FILES
, 0))
666 \nfile=%s [%lu]; needed by %s [%lu] (relocation dependency)\n\n",
667 map
->l_name
[0] ? map
->l_name
: rtld_progname
,
670 ? undef_map
->l_name
: rtld_progname
,
674 /* Whoa, that was bad luck. We have to search again. */
678 /* Release the lock. */
679 __rtld_lock_unlock_recursive (GL(dl_load_lock
));
681 if (__builtin_expect (flags
& DL_LOOKUP_GSCOPE_LOCK
, 0))
682 THREAD_GSCOPE_SET_FLAG ();
687 if (map
->l_serial
!= serial
)
694 _dl_debug_bindings (const char *undef_name
, struct link_map
*undef_map
,
695 const ElfW(Sym
) **ref
, struct sym_val
*value
,
696 const struct r_found_version
*version
, int type_class
,
700 /* Search loaded objects' symbol tables for a definition of the symbol
701 UNDEF_NAME, perhaps with a requested version for the symbol.
703 We must never have calls to the audit functions inside this function
704 or in any function which gets called. If this would happen the audit
705 code might create a thread which can throw off all the scope locking. */
708 _dl_lookup_symbol_x (const char *undef_name
, struct link_map
*undef_map
,
709 const ElfW(Sym
) **ref
,
710 struct r_scope_elem
*symbol_scope
[],
711 const struct r_found_version
*version
,
712 int type_class
, int flags
, struct link_map
*skip_map
)
714 const uint_fast32_t new_hash
= dl_new_hash (undef_name
);
715 unsigned long int old_hash
= 0xffffffff;
716 struct sym_val current_value
= { NULL
, NULL
};
717 struct r_scope_elem
**scope
= symbol_scope
;
719 bump_num_relocations ();
721 /* No other flag than DL_LOOKUP_ADD_DEPENDENCY or DL_LOOKUP_GSCOPE_LOCK
722 is allowed if we look up a versioned symbol. */
723 assert (version
== NULL
724 || (flags
& ~(DL_LOOKUP_ADD_DEPENDENCY
| DL_LOOKUP_GSCOPE_LOCK
))
728 if (__builtin_expect (skip_map
!= NULL
, 0))
729 /* Search the relevant loaded objects for a definition. */
730 while ((*scope
)->r_list
[i
] != skip_map
)
733 /* Search the relevant loaded objects for a definition. */
734 for (size_t start
= i
; *scope
!= NULL
; start
= 0, ++scope
)
736 int res
= do_lookup_x (undef_name
, new_hash
, &old_hash
, *ref
,
737 ¤t_value
, *scope
, start
, version
, flags
,
738 skip_map
, type_class
, undef_map
);
742 if (__builtin_expect (res
, 0) < 0 && skip_map
== NULL
)
744 /* Oh, oh. The file named in the relocation entry does not
745 contain the needed symbol. This code is never reached
746 for unversioned lookups. */
747 assert (version
!= NULL
);
748 const char *reference_name
= undef_map
? undef_map
->l_name
: NULL
;
750 /* XXX We cannot translate the message. */
751 _dl_signal_cerror (0, (reference_name
[0]
753 : (rtld_progname
?: "<main program>")),
754 N_("relocation error"),
755 make_string ("symbol ", undef_name
, ", version ",
757 " not defined in file ",
759 " with link time reference",
761 ? " (no version symbols)" : ""));
767 if (__builtin_expect (current_value
.s
== NULL
, 0))
769 if ((*ref
== NULL
|| ELFW(ST_BIND
) ((*ref
)->st_info
) != STB_WEAK
)
772 /* We could find no value for a strong reference. */
773 const char *reference_name
= undef_map
? undef_map
->l_name
: "";
774 const char *versionstr
= version
? ", version " : "";
775 const char *versionname
= (version
&& version
->name
776 ? version
->name
: "");
778 /* XXX We cannot translate the message. */
779 _dl_signal_cerror (0, (reference_name
[0]
781 : (rtld_progname
?: "<main program>")),
782 N_("symbol lookup error"),
783 make_string (undefined_msg
, undef_name
,
784 versionstr
, versionname
));
790 int protected = (*ref
791 && ELFW(ST_VISIBILITY
) ((*ref
)->st_other
) == STV_PROTECTED
);
792 if (__builtin_expect (protected != 0, 0))
794 /* It is very tricky. We need to figure out what value to
795 return for the protected symbol. */
796 if (type_class
== ELF_RTYPE_CLASS_PLT
)
798 if (current_value
.s
!= NULL
&& current_value
.m
!= undef_map
)
800 current_value
.s
= *ref
;
801 current_value
.m
= undef_map
;
806 struct sym_val protected_value
= { NULL
, NULL
};
808 for (scope
= symbol_scope
; *scope
!= NULL
; i
= 0, ++scope
)
809 if (do_lookup_x (undef_name
, new_hash
, &old_hash
, *ref
,
810 &protected_value
, *scope
, i
, version
, flags
,
811 skip_map
, ELF_RTYPE_CLASS_PLT
, NULL
) != 0)
814 if (protected_value
.s
!= NULL
&& protected_value
.m
!= undef_map
)
816 current_value
.s
= *ref
;
817 current_value
.m
= undef_map
;
822 /* We have to check whether this would bind UNDEF_MAP to an object
823 in the global scope which was dynamically loaded. In this case
824 we have to prevent the latter from being unloaded unless the
825 UNDEF_MAP object is also unloaded. */
826 if (__builtin_expect (current_value
.m
->l_type
== lt_loaded
, 0)
827 /* Don't do this for explicit lookups as opposed to implicit
829 && (flags
& DL_LOOKUP_ADD_DEPENDENCY
) != 0
830 /* Add UNDEF_MAP to the dependencies. */
831 && add_dependency (undef_map
, current_value
.m
, flags
) < 0)
832 /* Something went wrong. Perhaps the object we tried to reference
833 was just removed. Try finding another definition. */
834 return _dl_lookup_symbol_x (undef_name
, undef_map
, ref
,
835 (flags
& DL_LOOKUP_GSCOPE_LOCK
)
836 ? undef_map
->l_scope
: symbol_scope
,
837 version
, type_class
, flags
, skip_map
);
839 /* The object is used. */
840 if (__builtin_expect (current_value
.m
->l_used
== 0, 0))
841 current_value
.m
->l_used
= 1;
843 if (__builtin_expect (GLRO(dl_debug_mask
)
844 & (DL_DEBUG_BINDINGS
|DL_DEBUG_PRELINK
), 0))
845 _dl_debug_bindings (undef_name
, undef_map
, ref
,
846 ¤t_value
, version
, type_class
, protected);
848 *ref
= current_value
.s
;
849 return LOOKUP_VALUE (current_value
.m
);
853 /* Cache the location of MAP's hash table. */
857 _dl_setup_hash (struct link_map
*map
)
862 if (__builtin_expect (map
->l_info
[DT_ADDRTAGIDX (DT_GNU_HASH
) + DT_NUM
863 + DT_THISPROCNUM
+ DT_VERSIONTAGNUM
864 + DT_EXTRANUM
+ DT_VALNUM
] != NULL
, 1))
867 = (void *) D_PTR (map
, l_info
[DT_ADDRTAGIDX (DT_GNU_HASH
) + DT_NUM
868 + DT_THISPROCNUM
+ DT_VERSIONTAGNUM
869 + DT_EXTRANUM
+ DT_VALNUM
]);
870 map
->l_nbuckets
= *hash32
++;
871 Elf32_Word symbias
= *hash32
++;
872 Elf32_Word bitmask_nwords
= *hash32
++;
873 /* Must be a power of two. */
874 assert ((bitmask_nwords
& (bitmask_nwords
- 1)) == 0);
875 map
->l_gnu_bitmask_idxbits
= bitmask_nwords
- 1;
876 map
->l_gnu_shift
= *hash32
++;
878 map
->l_gnu_bitmask
= (ElfW(Addr
) *) hash32
;
879 hash32
+= __ELF_NATIVE_CLASS
/ 32 * bitmask_nwords
;
881 map
->l_gnu_buckets
= hash32
;
882 hash32
+= map
->l_nbuckets
;
883 map
->l_gnu_chain_zero
= hash32
- symbias
;
887 if (!map
->l_info
[DT_HASH
])
889 hash
= (void *) D_PTR (map
, l_info
[DT_HASH
]);
891 map
->l_nbuckets
= *hash
++;
893 map
->l_buckets
= hash
;
894 hash
+= map
->l_nbuckets
;
901 _dl_debug_bindings (const char *undef_name
, struct link_map
*undef_map
,
902 const ElfW(Sym
) **ref
, struct sym_val
*value
,
903 const struct r_found_version
*version
, int type_class
,
906 const char *reference_name
= undef_map
->l_name
;
908 if (GLRO(dl_debug_mask
) & DL_DEBUG_BINDINGS
)
910 _dl_debug_printf ("binding file %s [%lu] to %s [%lu]: %s symbol `%s'",
913 : (rtld_progname
?: "<main program>")),
915 value
->m
->l_name
[0] ? value
->m
->l_name
: rtld_progname
,
917 protected ? "protected" : "normal", undef_name
);
919 _dl_debug_printf_c (" [%s]\n", version
->name
);
921 _dl_debug_printf_c ("\n");
924 if (GLRO(dl_debug_mask
) & DL_DEBUG_PRELINK
)
927 struct sym_val val
= { NULL
, NULL
};
929 if ((GLRO(dl_trace_prelink_map
) == NULL
930 || GLRO(dl_trace_prelink_map
) == GL(dl_ns
)[LM_ID_BASE
]._ns_loaded
)
931 && undef_map
!= GL(dl_ns
)[LM_ID_BASE
]._ns_loaded
)
933 const uint_fast32_t new_hash
= dl_new_hash (undef_name
);
934 unsigned long int old_hash
= 0xffffffff;
935 struct unique_sym
*saved_entries
936 = GL(dl_ns
)[LM_ID_BASE
]._ns_unique_sym_table
.entries
;
938 GL(dl_ns
)[LM_ID_BASE
]._ns_unique_sym_table
.entries
= NULL
;
939 do_lookup_x (undef_name
, new_hash
, &old_hash
, *ref
, &val
,
940 undef_map
->l_local_scope
[0], 0, version
, 0, NULL
,
941 type_class
, undef_map
);
942 if (val
.s
!= value
->s
|| val
.m
!= value
->m
)
944 else if (__builtin_expect (undef_map
->l_symbolic_in_local_scope
, 0)
946 && __builtin_expect (ELFW(ST_BIND
) (val
.s
->st_info
),
947 STB_GLOBAL
) == STB_GNU_UNIQUE
)
949 /* If it is STB_GNU_UNIQUE and undef_map's l_local_scope
950 contains any DT_SYMBOLIC libraries, unfortunately there
951 can be conflicts even if the above is equal. As symbol
952 resolution goes from the last library to the first and
953 if a STB_GNU_UNIQUE symbol is found in some late DT_SYMBOLIC
954 library, it would be the one that is looked up. */
955 struct sym_val val2
= { NULL
, NULL
};
957 struct r_scope_elem
*scope
= undef_map
->l_local_scope
[0];
959 for (n
= 0; n
< scope
->r_nlist
; n
++)
960 if (scope
->r_list
[n
] == val
.m
)
963 for (n
++; n
< scope
->r_nlist
; n
++)
964 if (scope
->r_list
[n
]->l_info
[DT_SYMBOLIC
] != NULL
965 && do_lookup_x (undef_name
, new_hash
, &old_hash
, *ref
,
967 &scope
->r_list
[n
]->l_symbolic_searchlist
,
968 0, version
, 0, NULL
, type_class
,
976 GL(dl_ns
)[LM_ID_BASE
]._ns_unique_sym_table
.entries
= saved_entries
;
981 if (__builtin_expect (ELFW(ST_TYPE
) (value
->s
->st_info
)
984 else if (__builtin_expect (ELFW(ST_TYPE
) (value
->s
->st_info
)
985 == STT_GNU_IFUNC
, 0))
990 || GLRO(dl_trace_prelink_map
) == undef_map
991 || GLRO(dl_trace_prelink_map
) == NULL
994 _dl_printf ("%s 0x%0*Zx 0x%0*Zx -> 0x%0*Zx 0x%0*Zx ",
995 conflict
? "conflict" : "lookup",
996 (int) sizeof (ElfW(Addr
)) * 2,
997 (size_t) undef_map
->l_map_start
,
998 (int) sizeof (ElfW(Addr
)) * 2,
999 (size_t) (((ElfW(Addr
)) *ref
) - undef_map
->l_map_start
),
1000 (int) sizeof (ElfW(Addr
)) * 2,
1001 (size_t) (value
->s
? value
->m
->l_map_start
: 0),
1002 (int) sizeof (ElfW(Addr
)) * 2,
1003 (size_t) (value
->s
? value
->s
->st_value
: 0));
1006 _dl_printf ("x 0x%0*Zx 0x%0*Zx ",
1007 (int) sizeof (ElfW(Addr
)) * 2,
1008 (size_t) (val
.s
? val
.m
->l_map_start
: 0),
1009 (int) sizeof (ElfW(Addr
)) * 2,
1010 (size_t) (val
.s
? val
.s
->st_value
: 0));
1012 _dl_printf ("/%x %s\n", type_class
, undef_name
);