Fix resizing able for unique symbols when adding symbol for copy relocation

This commit is contained in:
Piotr Bury 2011-05-12 21:59:09 -04:00 committed by Ulrich Drepper
parent f574184a0e
commit 320a5dc07b
7 changed files with 91 additions and 31 deletions

View File

@ -1,3 +1,16 @@
2011-05-12 Ulrich Drepper <drepper@gmail.com>
[BZ #12511]
* elf/dl-lookup.c (enter): Don't test for copy relocation here and
don't set DF_1_NODELETE here.
(do_lookup_x): When entering new entry test for copy relocation
and if necessary set DF_1_NODELETE flag.
* elf/tst-unique4.cc: New file.
* elf/tst-unique4.h: New file.
* elf/tst-unique4lib.cc: New file.
* elf/Makefile: Add rules to build and run tst-unique4.
Patch by Piotr Bury <pbury@goahead.com>.
2011-05-11 Ulrich Drepper <drepper@gmail.com>
[BZ #12052]

6
NEWS
View File

@ -11,9 +11,9 @@ Version 2.14
386, 11257, 11258, 11487, 11532, 11578, 11653, 11668, 11724, 11945, 11947,
12052, 12158, 12178, 12200, 12346, 12393, 12420, 12445, 12449, 12454,
12460, 12469, 12489, 12509, 12510, 12518, 12527, 12541, 12545, 12551,
12583, 12587, 12597, 12611, 12625, 12631, 12650, 12653, 12655, 12660,
12681, 12685, 12711, 12713, 12714, 12717, 12723, 12734, 12738
12460, 12469, 12489, 12509, 12510, 12511, 12518, 12527, 12541, 12545,
12551, 12583, 12587, 12597, 12611, 12625, 12631, 12650, 12653, 12655,
12660, 12681, 12685, 12711, 12713, 12714, 12717, 12723, 12734, 12738
* The RPC implementation in libc is obsoleted. Old programs keep working
but new programs cannot be linked with the routines in libc anymore.

View File

@ -201,7 +201,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
unload3 unload4 unload5 unload6 unload7 tst-global1 order2 \
tst-audit1 tst-audit2 \
tst-stackguard1 tst-addr1 tst-thrlock \
tst-unique1 tst-unique2 tst-unique3 \
tst-unique1 tst-unique2 tst-unique3 tst-unique4 \
tst-initorder
# reldep9
test-srcs = tst-pathopt
@ -259,6 +259,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
tst-unique1mod1 tst-unique1mod2 \
tst-unique2mod1 tst-unique2mod2 \
tst-unique3lib tst-unique3lib2 \
tst-unique4lib \
tst-initordera1 tst-initorderb1 \
tst-initordera2 tst-initorderb2 \
tst-initordera3 tst-initordera4
@ -1185,6 +1186,8 @@ $(objpfx)tst-unique2.out: $(objpfx)tst-unique2mod2.so
$(objpfx)tst-unique3: $(libdl) $(objpfx)tst-unique3lib.so
$(objpfx)tst-unique3.out: $(objpfx)tst-unique3lib2.so
$(objpfx)tst-unique4: $(objpfx)tst-unique4lib.so
$(objpfx)tst-initorder.out: $(objpfx)tst-initorder
$(elf-objpfx)${rtld-installed-name} \
--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \

View File

@ -312,39 +312,21 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
definition we have to use it. */
void enter (struct unique_sym *table, size_t size,
unsigned int hash, const char *name,
const ElfW(Sym) *sym, struct link_map *map)
const ElfW(Sym) *sym, const struct link_map *map)
{
size_t idx = hash % size;
size_t hash2 = 1 + hash % (size - 2);
while (1)
while (table[idx].name != NULL)
{
if (table[idx].name == NULL)
{
table[idx].hashval = hash;
table[idx].name = name;
if ((type_class & ELF_RTYPE_CLASS_COPY) != 0)
{
table[idx].sym = ref;
table[idx].map = undef_map;
}
else
{
table[idx].sym = sym;
table[idx].map = map;
if (map->l_type == lt_loaded)
/* Make sure we don't unload this object by
setting the appropriate flag. */
map->l_flags_1 |= DF_1_NODELETE;
}
return;
}
idx += hash2;
if (idx >= size)
idx -= size;
}
table[idx].hashval = hash;
table[idx].name = name;
table[idx].sym = sym;
table[idx].map = map;
}
struct unique_sym_table *tab
@ -450,8 +432,19 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
tab->free = free;
}
enter (entries, size, new_hash, strtab + sym->st_name, sym,
(struct link_map *) map);
if ((type_class & ELF_RTYPE_CLASS_COPY) != 0)
enter (entries, size, new_hash, strtab + sym->st_name, ref,
undef_map);
else
{
enter (entries, size, new_hash, strtab + sym->st_name, sym,
map);
if (map->l_type == lt_loaded)
/* Make sure we don't unload this object by
setting the appropriate flag. */
((struct link_map *) map)->l_flags_1 |= DF_1_NODELETE;
}
++tab->n_elements;
__rtld_lock_unlock_recursive (tab->lock);

27
elf/tst-unique4.cc Normal file
View File

@ -0,0 +1,27 @@
// BZ 12511
#include "tst-unique4.h"
#include <cstdio>
static int a[24] =
{
S<1>::i, S<2>::i, S<3>::i, S<4>::i, S<5>::i, S<6>::i, S<7>::i, S<8>::i,
S<9>::i, S<10>::i, S<11>::i, S<12>::i, S<13>::i, S<14>::i, S<15>::i,
S<16>::i, S<17>::i, S<18>::i, S<19>::i, S<20>::i, S<21>::i, S<22>::i,
S<23>::i, S<24>::i
};
int
main (void)
{
int result = 0;
for (int i = 0; i < 24; ++i)
{
printf("%d ", a[i]);
result |= a[i] != i + 1;
}
printf("\n%d\n", S<1>::j);
result |= S<1>::j != -1;
return result;
}

7
elf/tst-unique4.h Normal file
View File

@ -0,0 +1,7 @@
// BZ 12511
template<int N>
struct S
{
static int i;
static const int j;
};

17
elf/tst-unique4lib.cc Normal file
View File

@ -0,0 +1,17 @@
// BZ 12511
#include "tst-unique4.h"
template<int N>
int S<N>::i = N;
template<int N>
const int S<N>::j __attribute__ ((used)) = -1;
static int a[24] =
{
S<1>::i, S<2>::i, S<3>::i, S<4>::i, S<5>::i, S<6>::i, S<7>::i, S<8>::i,
S<9>::i, S<10>::i, S<11>::i, S<12>::i, S<13>::i, S<14>::i, S<15>::i,
S<16>::i, S<17>::i, S<18>::i, S<19>::i, S<20>::i, S<21>::i, S<22>::i,
S<23>::i, S<24>::i
};
static int b = S<1>::j;