blob: 91c9b557d1f2766b1066b064705038e38431325b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
--- elf/do-lookup.h.base 2003-05-15 09:29:25.000000000 -0700
+++ elf/do-lookup.h 2003-05-15 09:24:24.000000000 -0700
@@ -52,7 +52,8 @@ FCT (const char *undef_name, unsigned lo
const ElfW(Sym) *sym;
#if ! VERSIONED
int num_versions = 0;
- const ElfW(Sym) *versioned_sym = NULL;
+ const ElfW(Sym) *default_version = NULL;
+ const ElfW(Sym) *first_version = NULL;
#endif
map = list[i];
@@ -155,16 +156,29 @@ FCT (const char *undef_name, unsigned lo
public interface should be returned. */
if (verstab != NULL)
{
- if ((verstab[symidx] & 0x7fff)
- >= ((flags & DL_LOOKUP_RETURN_NEWEST) ? 2 : 3))
+ ElfW(Half) ndx = verstab[symidx] & 0x7fff;
+ if (ndx >= ((flags & DL_LOOKUP_RETURN_NEWEST) ? 2 : 3))
{
/* Don't accept hidden symbols. */
if ((verstab[symidx] & 0x8000) == 0 && num_versions++ == 0)
/* No version so far. */
- versioned_sym = sym;
+ default_version = sym;
continue;
}
+ if ((flags & DL_LOOKUP_RETURN_NEWEST) == 0 && ndx != 0)
+ {
+ /* ndx == 1 is the base version. We will use it for
+ old unversioned application. */
+ if (ndx != 1)
+ {
+ /* We remember the first version and keep looking
+ for the base version. */
+ if (ndx == 2)
+ first_version = sym;
+ continue;
+ }
+ }
}
#endif
@@ -179,7 +193,8 @@ FCT (const char *undef_name, unsigned lo
#if VERSIONED
sym = NULL;
#else
- sym = num_versions == 1 ? versioned_sym : NULL;
+ sym = first_version ?: (num_versions == 1
+ ? default_version : NULL);
#endif
if (sym != NULL)
|