mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
Fix copy relocations handling of unique objects.
This commit is contained in:
parent
908ea63341
commit
028478fa40
12
ChangeLog
12
ChangeLog
@ -1,5 +1,17 @@
|
|||||||
2011-03-10 Ulrich Drepper <drepper@gmail.com>
|
2011-03-10 Ulrich Drepper <drepper@gmail.com>
|
||||||
|
|
||||||
|
[BZ #12510]
|
||||||
|
* elf/dl-lookup.c (do_lookup_x): For copy relocations of unique objects
|
||||||
|
copy from the symbol referenced in the relocation to initialize the
|
||||||
|
used variable.
|
||||||
|
Patch by Piotr Bury <pbury@goahead.com>.
|
||||||
|
* elf/Makefile: Add rules to build and tst-unique3.
|
||||||
|
* include/bits/dlfcn.h: Remove _dl_mcount_wrapper_check declaration.
|
||||||
|
* elf/tst-unique3.cc: New file.
|
||||||
|
* elf/tst-unique3.h: New file.
|
||||||
|
* elf/tst-unique3lib.cc: New file.
|
||||||
|
* elf/tst-unique3lib2.cc: New file.
|
||||||
|
|
||||||
* elf/Makefile: Don't run tst-execstack* tests of SELinux is enabled.
|
* elf/Makefile: Don't run tst-execstack* tests of SELinux is enabled.
|
||||||
|
|
||||||
2011-03-06 Ulrich Drepper <drepper@gmail.com>
|
2011-03-06 Ulrich Drepper <drepper@gmail.com>
|
||||||
|
4
NEWS
4
NEWS
@ -1,4 +1,4 @@
|
|||||||
GNU C Library NEWS -- history of user-visible changes. 2011-2-25
|
GNU C Library NEWS -- history of user-visible changes. 2011-3-10
|
||||||
Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
|
Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
|
||||||
See the end for copying conditions.
|
See the end for copying conditions.
|
||||||
|
|
||||||
@ -9,7 +9,7 @@ Version 2.14
|
|||||||
|
|
||||||
* The following bugs are resolved with this release:
|
* The following bugs are resolved with this release:
|
||||||
|
|
||||||
11724, 12445, 12454, 12460, 12469, 12489, 12509
|
11724, 12445, 12454, 12460, 12469, 12489, 12509, 12510
|
||||||
|
|
||||||
Version 2.13
|
Version 2.13
|
||||||
|
|
||||||
|
@ -258,7 +258,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
|||||||
order2mod1 order2mod2 order2mod3 order2mod4 \
|
order2mod1 order2mod2 order2mod3 order2mod4 \
|
||||||
tst-unique1mod1 tst-unique1mod2 \
|
tst-unique1mod1 tst-unique1mod2 \
|
||||||
tst-unique2mod1 tst-unique2mod2 \
|
tst-unique2mod1 tst-unique2mod2 \
|
||||||
tst-unique3lib \
|
tst-unique3lib tst-unique3lib2 \
|
||||||
tst-initordera1 tst-initorderb1 \
|
tst-initordera1 tst-initorderb1 \
|
||||||
tst-initordera2 tst-initorderb2 \
|
tst-initordera2 tst-initorderb2 \
|
||||||
tst-initordera3 tst-initordera4
|
tst-initordera3 tst-initordera4
|
||||||
@ -1182,7 +1182,8 @@ $(objpfx)tst-unique1.out: $(objpfx)tst-unique1mod1.so \
|
|||||||
$(objpfx)tst-unique2: $(libdl) $(objpfx)tst-unique2mod1.so
|
$(objpfx)tst-unique2: $(libdl) $(objpfx)tst-unique2mod1.so
|
||||||
$(objpfx)tst-unique2.out: $(objpfx)tst-unique2mod2.so
|
$(objpfx)tst-unique2.out: $(objpfx)tst-unique2mod2.so
|
||||||
|
|
||||||
$(objpfx)tst-unique3: $(objpfx)tst-unique3lib.so
|
$(objpfx)tst-unique3: $(libdl) $(objpfx)tst-unique3lib.so
|
||||||
|
$(objpfx)tst-unique3.out: $(objpfx)tst-unique3lib2.so
|
||||||
|
|
||||||
$(objpfx)tst-initorder.out: $(objpfx)tst-initorder
|
$(objpfx)tst-initorder.out: $(objpfx)tst-initorder
|
||||||
$(elf-objpfx)${rtld-installed-name} \
|
$(elf-objpfx)${rtld-installed-name} \
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/* Look up a symbol in the loaded objects.
|
/* Look up a symbol in the loaded objects.
|
||||||
Copyright (C) 1995-2005, 2006, 2007, 2009, 2010
|
Copyright (C) 1995-2007, 2009, 2010, 2011 Free Software Foundation, Inc.
|
||||||
Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -363,9 +362,20 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
|
|||||||
{
|
{
|
||||||
if (entries[idx].hashval == new_hash
|
if (entries[idx].hashval == new_hash
|
||||||
&& strcmp (entries[idx].name, undef_name) == 0)
|
&& strcmp (entries[idx].name, undef_name) == 0)
|
||||||
|
{
|
||||||
|
if ((type_class & ELF_RTYPE_CLASS_COPY) != 0)
|
||||||
|
{
|
||||||
|
/* We possibly have to initialize the central
|
||||||
|
copy from the copy addressed through the
|
||||||
|
relocation. */
|
||||||
|
result->s = sym;
|
||||||
|
result->m = (struct link_map *) map;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
result->s = entries[idx].sym;
|
result->s = entries[idx].sym;
|
||||||
result->m = (struct link_map *) entries[idx].map;
|
result->m = (struct link_map *) entries[idx].map;
|
||||||
|
}
|
||||||
__rtld_lock_unlock_recursive (tab->lock);
|
__rtld_lock_unlock_recursive (tab->lock);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
23
elf/tst-unique3.cc
Normal file
23
elf/tst-unique3.cc
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#include "tst-unique3.h"
|
||||||
|
#include <cstdio>
|
||||||
|
#include "../dlfcn/dlfcn.h"
|
||||||
|
|
||||||
|
int t = S<char>::i;
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
std::printf ("%d %d\n", S<char>::i, t);
|
||||||
|
int result = S<char>::i++ != 1 || t != 1;
|
||||||
|
result |= in_lib ();
|
||||||
|
void *d = dlopen ("$ORIGIN/tst-unique3lib2.so", RTLD_LAZY);
|
||||||
|
int (*fp) ();
|
||||||
|
if (d == NULL || (fp = (int(*)()) dlsym (d, "in_lib2")) == NULL)
|
||||||
|
{
|
||||||
|
std::printf ("failed to get symbol in_lib2\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
result |= fp ();
|
||||||
|
dlclose (d);
|
||||||
|
return result;
|
||||||
|
}
|
8
elf/tst-unique3.h
Normal file
8
elf/tst-unique3.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// BZ 12510
|
||||||
|
template<typename T>
|
||||||
|
struct S
|
||||||
|
{
|
||||||
|
static int i;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int in_lib (void);
|
11
elf/tst-unique3lib.cc
Normal file
11
elf/tst-unique3lib.cc
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include <cstdio>
|
||||||
|
#include "tst-unique3.h"
|
||||||
|
template<typename T> int S<T>::i = 1;
|
||||||
|
static int i = S<char>::i;
|
||||||
|
|
||||||
|
int
|
||||||
|
in_lib (void)
|
||||||
|
{
|
||||||
|
std::printf ("in_lib: %d %d\n", S<char>::i, i);
|
||||||
|
return S<char>::i++ != 2 || i != 1;
|
||||||
|
}
|
12
elf/tst-unique3lib2.cc
Normal file
12
elf/tst-unique3lib2.cc
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include <cstdio>
|
||||||
|
#include "tst-unique3.h"
|
||||||
|
|
||||||
|
template<typename T> int S<T>::i;
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
int
|
||||||
|
in_lib2 ()
|
||||||
|
{
|
||||||
|
std::printf ("in_lib2: %d\n", S<char>::i);
|
||||||
|
return S<char>::i != 3;
|
||||||
|
}
|
@ -1,4 +1,3 @@
|
|||||||
#include_next <bits/dlfcn.h>
|
#include_next <bits/dlfcn.h>
|
||||||
|
|
||||||
extern void _dl_mcount_wrapper_check (void *__selfpc);
|
|
||||||
libc_hidden_proto (_dl_mcount_wrapper_check)
|
libc_hidden_proto (_dl_mcount_wrapper_check)
|
||||||
|
Loading…
Reference in New Issue
Block a user