Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix resizing able for unique symbols when adding symbol for copy relo…
…cation
  • Loading branch information
Piotr Bury authored and Ulrich Drepper committed May 13, 2011
1 parent f574184 commit 320a5dc
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 31 deletions.
13 changes: 13 additions & 0 deletions ChangeLog
@@ -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]
Expand Down
6 changes: 3 additions & 3 deletions NEWS
Expand Up @@ -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.
Expand Down
5 changes: 4 additions & 1 deletion elf/Makefile
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)) \
Expand Down
47 changes: 20 additions & 27 deletions elf/dl-lookup.c
Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down
27 changes: 27 additions & 0 deletions elf/tst-unique4.cc
@@ -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 changes: 7 additions & 0 deletions elf/tst-unique4.h
@@ -0,0 +1,7 @@
// BZ 12511
template<int N>
struct S
{
static int i;
static const int j;
};
17 changes: 17 additions & 0 deletions elf/tst-unique4lib.cc
@@ -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;

0 comments on commit 320a5dc

Please sign in to comment.