mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
Update.
2001-09-29 Jes Sorensen <jes@trained-monkey.org> * sysdeps/unix/sysv/linux/ia64/bits/sigcontext.h (struct sigcontext): Add sc_loadrs and sc_rbs_bas to match current kernel. 2001-09-27 Jakub Jelinek <jakub@redhat.com> * sysdeps/sparc/sparc64/fpu/libm-test-ulps: Update. * sysdeps/ieee754/ldbl-128/s_erfl.c (__erfcl): Fix erfc(-inf). 2001-09-27 Jakub Jelinek <jakub@redhat.com> * elf/dl-open.c (dl_open_worker): If l_opencount of freshly loaded object has been bumped because of relocation dependency, avoid duplicates in l_scope. (show_scope): Fix typos. * elf/Makefile: Add rules to build and run reldep6. * elf/reldep6.c: New file. * elf/reldep6mod0.c: New file. * elf/reldep6mod1.c: New file. * elf/reldep6mod2.c: New file. * elf/reldep6mod3.c: New file. * elf/reldep6mod4.c: New file. 2001-09-26 Jakub Jelinek <jakub@redhat.com> * sysdeps/sparc/sparc64/dl-machine.h (elf_machine_fixup_plt): Call sparc64_fixup_plt. (sparc64_fixup_plt): Moved from elf_machine_fixup_plt. Optimize near jumps and 0xfffff800XXXXXXXX target addresses, no thread safety for non-lazy binding. Fix .plt[32768+] handling. (elf_machine_plt_value): Don't add addend. (elf_machine_rela): Call sparc64_fixup_plt instead of elf_machine_fixup_plt. (elf_machine_runtime_setup, TRAMPOLINE_TEMPLATE): Optimize for dynamic linker at 0xfffff800XXXXXXXX. * sysdeps/sparc/sparc32/fpu/libm-test-ulps: Update.
This commit is contained in:
parent
ddb96b7db1
commit
c47e78b10f
40
ChangeLog
40
ChangeLog
@ -1,3 +1,43 @@
|
|||||||
|
2001-09-29 Jes Sorensen <jes@trained-monkey.org>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/bits/sigcontext.h (struct sigcontext):
|
||||||
|
Add sc_loadrs and sc_rbs_bas to match current kernel.
|
||||||
|
|
||||||
|
2001-09-27 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/sparc/sparc64/fpu/libm-test-ulps: Update.
|
||||||
|
|
||||||
|
* sysdeps/ieee754/ldbl-128/s_erfl.c (__erfcl): Fix erfc(-inf).
|
||||||
|
|
||||||
|
2001-09-27 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* elf/dl-open.c (dl_open_worker): If l_opencount of freshly loaded
|
||||||
|
object has been bumped because of relocation dependency, avoid
|
||||||
|
duplicates in l_scope.
|
||||||
|
(show_scope): Fix typos.
|
||||||
|
* elf/Makefile: Add rules to build and run reldep6.
|
||||||
|
* elf/reldep6.c: New file.
|
||||||
|
* elf/reldep6mod0.c: New file.
|
||||||
|
* elf/reldep6mod1.c: New file.
|
||||||
|
* elf/reldep6mod2.c: New file.
|
||||||
|
* elf/reldep6mod3.c: New file.
|
||||||
|
* elf/reldep6mod4.c: New file.
|
||||||
|
|
||||||
|
2001-09-26 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_fixup_plt): Call
|
||||||
|
sparc64_fixup_plt.
|
||||||
|
(sparc64_fixup_plt): Moved from elf_machine_fixup_plt. Optimize
|
||||||
|
near jumps and 0xfffff800XXXXXXXX target addresses, no thread safety
|
||||||
|
for non-lazy binding. Fix .plt[32768+] handling.
|
||||||
|
(elf_machine_plt_value): Don't add addend.
|
||||||
|
(elf_machine_rela): Call sparc64_fixup_plt instead of
|
||||||
|
elf_machine_fixup_plt.
|
||||||
|
(elf_machine_runtime_setup, TRAMPOLINE_TEMPLATE): Optimize for
|
||||||
|
dynamic linker at 0xfffff800XXXXXXXX.
|
||||||
|
|
||||||
|
* sysdeps/sparc/sparc32/fpu/libm-test-ulps: Update.
|
||||||
|
|
||||||
2001-09-28 Ulrich Drepper <drepper@redhat.com>
|
2001-09-28 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* elf/elf.h: Define SHF_GROUP and SHF_TLS.
|
* elf/elf.h: Define SHF_GROUP and SHF_TLS.
|
||||||
|
12
elf/Makefile
12
elf/Makefile
@ -107,7 +107,7 @@ tests = loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
|
|||||||
reldep reldep2 reldep3 reldep4 $(tests-nodelete-$(have-z-nodelete)) \
|
reldep reldep2 reldep3 reldep4 $(tests-nodelete-$(have-z-nodelete)) \
|
||||||
$(tests-nodlopen-$(have-z-nodlopen)) neededtest neededtest2 \
|
$(tests-nodlopen-$(have-z-nodlopen)) neededtest neededtest2 \
|
||||||
neededtest3 neededtest4 unload2 lateglobal initfirst global \
|
neededtest3 neededtest4 unload2 lateglobal initfirst global \
|
||||||
restest2 next dblload dblunload reldep5
|
restest2 next dblload dblunload reldep5 reldep6
|
||||||
test-srcs = tst-pathopt
|
test-srcs = tst-pathopt
|
||||||
tests-vis-yes = vismain
|
tests-vis-yes = vismain
|
||||||
tests-nodelete-yes = nodelete
|
tests-nodelete-yes = nodelete
|
||||||
@ -123,7 +123,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
|||||||
neededobj1 neededobj2 neededobj3 neededobj4 \
|
neededobj1 neededobj2 neededobj3 neededobj4 \
|
||||||
neededobj5 neededobj6 firstobj globalmod1 \
|
neededobj5 neededobj6 firstobj globalmod1 \
|
||||||
unload2mod unload2dep ltglobmod1 ltglobmod2 pathoptobj \
|
unload2mod unload2dep ltglobmod1 ltglobmod2 pathoptobj \
|
||||||
dblloadmod1 dblloadmod2 dblloadmod3 reldepmod5 reldepmod6
|
dblloadmod1 dblloadmod2 dblloadmod3 reldepmod5 reldepmod6 \
|
||||||
|
reldep6mod0 reldep6mod1 reldep6mod2 reldep6mod3 reldep6mod4
|
||||||
modules-vis-yes = vismod1 vismod2 vismod3
|
modules-vis-yes = vismod1 vismod2 vismod3
|
||||||
modules-nodelete-yes = nodelmod1 nodelmod2 nodelmod3 nodelmod4
|
modules-nodelete-yes = nodelmod1 nodelmod2 nodelmod3 nodelmod4
|
||||||
modules-nodlopen-yes = nodlopenmod
|
modules-nodlopen-yes = nodlopenmod
|
||||||
@ -288,6 +289,10 @@ $(objpfx)dblloadmod1.so: $(objpfx)dblloadmod3.so
|
|||||||
$(objpfx)dblloadmod2.so: $(objpfx)dblloadmod3.so
|
$(objpfx)dblloadmod2.so: $(objpfx)dblloadmod3.so
|
||||||
$(objpfx)reldepmod5.so: $(objpfx)reldepmod2.so
|
$(objpfx)reldepmod5.so: $(objpfx)reldepmod2.so
|
||||||
$(objpfx)reldepmod6.so: $(objpfx)reldepmod2.so
|
$(objpfx)reldepmod6.so: $(objpfx)reldepmod2.so
|
||||||
|
$(objpfx)reldep6mod1.so: $(objpfx)reldep6mod0.so
|
||||||
|
$(objpfx)reldep6mod2.so: $(objpfx)reldep6mod1.so
|
||||||
|
$(objpfx)reldep6mod3.so: $(objpfx)reldep6mod2.so
|
||||||
|
$(objpfx)reldep6mod4.so: $(objpfx)reldep6mod1.so
|
||||||
|
|
||||||
# filtmod1.so has a special rule
|
# filtmod1.so has a special rule
|
||||||
$(filter-out $(objpfx)filtmod1.so, $(test-modules)): $(objpfx)%.so: $(objpfx)%.os
|
$(filter-out $(objpfx)filtmod1.so, $(test-modules)): $(objpfx)%.so: $(objpfx)%.os
|
||||||
@ -429,3 +434,6 @@ $(objpfx)dblunload.out: $(objpfx)dblloadmod1.so $(objpfx)dblloadmod2.so
|
|||||||
|
|
||||||
$(objpfx)reldep5: $(libdl)
|
$(objpfx)reldep5: $(libdl)
|
||||||
$(objpfx)reldep5.out: $(objpfx)reldepmod5.so $(objpfx)reldepmod5.so
|
$(objpfx)reldep5.out: $(objpfx)reldepmod5.so $(objpfx)reldepmod5.so
|
||||||
|
|
||||||
|
$(objpfx)reldep6: $(libdl)
|
||||||
|
$(objpfx)reldep6.out: $(objpfx)reldep6mod3.so $(objpfx)reldep6mod4.so
|
||||||
|
@ -312,10 +312,20 @@ dl_open_worker (void *a)
|
|||||||
|
|
||||||
while (*runp != NULL)
|
while (*runp != NULL)
|
||||||
{
|
{
|
||||||
|
/* This can happen if imap was just loaded, but during
|
||||||
|
relocation had l_opencount bumped because of relocation
|
||||||
|
dependency. Avoid duplicates in l_scope. */
|
||||||
|
if (__builtin_expect (*runp == &new->l_searchlist, 0))
|
||||||
|
break;
|
||||||
|
|
||||||
++cnt;
|
++cnt;
|
||||||
++runp;
|
++runp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (*runp != NULL)
|
||||||
|
/* Avoid duplicates. */
|
||||||
|
continue;
|
||||||
|
|
||||||
if (__builtin_expect (cnt + 1 >= imap->l_scope_max, 0))
|
if (__builtin_expect (cnt + 1 >= imap->l_scope_max, 0))
|
||||||
{
|
{
|
||||||
/* The 'r_scope' array is too small. Allocate a new one
|
/* The 'r_scope' array is too small. Allocate a new one
|
||||||
@ -478,11 +488,11 @@ show_scope (struct link_map *new)
|
|||||||
|
|
||||||
for (cnt = 0; cnt < new->l_scope[scope_cnt]->r_nlist; ++cnt)
|
for (cnt = 0; cnt < new->l_scope[scope_cnt]->r_nlist; ++cnt)
|
||||||
if (*new->l_scope[scope_cnt]->r_list[cnt]->l_name)
|
if (*new->l_scope[scope_cnt]->r_list[cnt]->l_name)
|
||||||
_dl_printf (" %s", new->l_scope[scope_cnt]->r_list[cnt]->l_name)
|
_dl_printf (" %s", new->l_scope[scope_cnt]->r_list[cnt]->l_name);
|
||||||
else
|
else
|
||||||
_dl_printf (" <main>", NULL);
|
_dl_printf (" <main>");
|
||||||
|
|
||||||
_dl_printf ("\n", NULL);
|
_dl_printf ("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
97
elf/reldep6.c
Normal file
97
elf/reldep6.c
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#include <dlfcn.h>
|
||||||
|
#include <mcheck.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef int (*fn)(void);
|
||||||
|
#define CHUNKS 1024
|
||||||
|
#define REPEAT 64
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
void *h1;
|
||||||
|
void *h2;
|
||||||
|
fn **foopp;
|
||||||
|
fn bar, baz;
|
||||||
|
int i, j;
|
||||||
|
int n;
|
||||||
|
void *allocs[REPEAT][CHUNKS];
|
||||||
|
|
||||||
|
mtrace ();
|
||||||
|
|
||||||
|
/* Open the two objects. */
|
||||||
|
h1 = dlopen ("reldep6mod3.so", RTLD_LAZY);
|
||||||
|
if (h1 == NULL)
|
||||||
|
{
|
||||||
|
printf ("cannot open reldep6mod3.so: %s\n", dlerror ());
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
foopp = dlsym (h1, "foopp");
|
||||||
|
if (foopp == NULL)
|
||||||
|
{
|
||||||
|
printf ("cannot get address of \"foopp\": %s\n", dlerror ());
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
n = (**foopp) ();
|
||||||
|
if (n != 20)
|
||||||
|
{
|
||||||
|
printf ("(**foopp)() return %d, not return 20\n", n);
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 = dlopen ("reldep6mod4.so", RTLD_LAZY);
|
||||||
|
if (h2 == NULL)
|
||||||
|
{
|
||||||
|
printf ("cannot open reldep6mod4.so: %s\n", dlerror ());
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dlclose (h1) != 0)
|
||||||
|
{
|
||||||
|
printf ("closing h1 failed: %s\n", dlerror ());
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clobber memory. */
|
||||||
|
for (i = 0; i < REPEAT; ++i)
|
||||||
|
for (j = 0; j < CHUNKS; ++j)
|
||||||
|
allocs[i][j] = calloc (1, j + 1);
|
||||||
|
|
||||||
|
bar = dlsym (h2, "bar");
|
||||||
|
if (bar == NULL)
|
||||||
|
{
|
||||||
|
printf ("cannot get address of \"bar\": %s\n", dlerror ());
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
if (bar () != 40)
|
||||||
|
{
|
||||||
|
printf ("bar() did not return 40\n");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
baz = dlsym (h2, "baz");
|
||||||
|
if (baz == NULL)
|
||||||
|
{
|
||||||
|
printf ("cannot get address of \"baz\": %s\n", dlerror ());
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
if (baz () != 31)
|
||||||
|
{
|
||||||
|
printf ("baz() did not return 31\n");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < REPEAT; ++i)
|
||||||
|
for (j = 0; j < CHUNKS; ++j)
|
||||||
|
free (allocs[i][j]);
|
||||||
|
|
||||||
|
if (dlclose (h2) != 0)
|
||||||
|
{
|
||||||
|
printf ("closing h2 failed: %s\n", dlerror ());
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
8
elf/reldep6mod0.c
Normal file
8
elf/reldep6mod0.c
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
int bar (void);
|
||||||
|
extern void free (void *);
|
||||||
|
|
||||||
|
int bar (void)
|
||||||
|
{
|
||||||
|
free (0);
|
||||||
|
return 40;
|
||||||
|
}
|
14
elf/reldep6mod1.c
Normal file
14
elf/reldep6mod1.c
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
int foo (void);
|
||||||
|
int baz (void);
|
||||||
|
extern int weak (void);
|
||||||
|
asm (".weak weak");
|
||||||
|
|
||||||
|
int foo (void)
|
||||||
|
{
|
||||||
|
return 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
int baz (void)
|
||||||
|
{
|
||||||
|
return weak () + 1;
|
||||||
|
}
|
3
elf/reldep6mod2.c
Normal file
3
elf/reldep6mod2.c
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
extern int foo (void);
|
||||||
|
|
||||||
|
void *foop = (void *) foo;
|
3
elf/reldep6mod3.c
Normal file
3
elf/reldep6mod3.c
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
extern void *foop;
|
||||||
|
|
||||||
|
void **foopp = &foop;
|
12
elf/reldep6mod4.c
Normal file
12
elf/reldep6mod4.c
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
int foo (void);
|
||||||
|
int weak (void);
|
||||||
|
|
||||||
|
int foo (void)
|
||||||
|
{
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
int weak (void)
|
||||||
|
{
|
||||||
|
return 30;
|
||||||
|
}
|
@ -1,3 +1,8 @@
|
|||||||
|
2001-09-30 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* charmaps/SAMI-WS2: Add Euro sign.
|
||||||
|
Patch by Petter Reinholdtsen <pere@hungry.com>.
|
||||||
|
|
||||||
2001-08-17 Ulrich Drepper <drepper@redhat.com>
|
2001-08-17 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* Makefile: Add rules to build and run tst-xlocale2.
|
* Makefile: Add rules to build and run tst-xlocale2.
|
||||||
|
@ -139,6 +139,7 @@ CHARMAP
|
|||||||
<U007D> /x7d RIGHT CURLY BRACKET
|
<U007D> /x7d RIGHT CURLY BRACKET
|
||||||
<U007E> /x7e TILDE
|
<U007E> /x7e TILDE
|
||||||
<U007F> /x7f DELETE (DEL)
|
<U007F> /x7f DELETE (DEL)
|
||||||
|
<U20AC> /x80 EURO SIGN
|
||||||
<U010C> /x82 LATIN CAPITAL LETTER C WITH CARON
|
<U010C> /x82 LATIN CAPITAL LETTER C WITH CARON
|
||||||
<U0192> /x83 LATIN SMALL LETTER F WITH HOOK
|
<U0192> /x83 LATIN SMALL LETTER F WITH HOOK
|
||||||
<U010D> /x84 LATIN SMALL LETTER C WITH CARON
|
<U010D> /x84 LATIN SMALL LETTER C WITH CARON
|
||||||
|
@ -218,8 +218,7 @@ the environment and for the texts to be handled. There exist a variety
|
|||||||
of different character sets which can be used for this external
|
of different character sets which can be used for this external
|
||||||
encoding. Information which will not be exhaustively presented
|
encoding. Information which will not be exhaustively presented
|
||||||
here--instead, a description of the major groups will suffice. All of
|
here--instead, a description of the major groups will suffice. All of
|
||||||
the ASCII-based character sets [_bkoz_: do you mean Roman character
|
the ASCII-based character sets fulfill one requirement: they are
|
||||||
sets? If not, what do you mean here?] fulfill one requirement: they are
|
|
||||||
"filesystem safe". This means that the character @code{'/'} is used in
|
"filesystem safe". This means that the character @code{'/'} is used in
|
||||||
the encoding @emph{only} to represent itself. Things are a bit
|
the encoding @emph{only} to represent itself. Things are a bit
|
||||||
different for character sets like EBCDIC (Extended Binary Coded Decimal
|
different for character sets like EBCDIC (Extended Binary Coded Decimal
|
||||||
@ -229,11 +228,12 @@ system calls have to be converted first anyhow.
|
|||||||
|
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@item
|
@item
|
||||||
The simplest character sets are single-byte character sets. There can be
|
The simplest character sets are single-byte character sets. There can
|
||||||
only up to 256 characters (for @w{8 bit} character sets) which is not
|
be only up to 256 characters (for @w{8 bit} character sets) which is not
|
||||||
sufficient to cover all languages but might be sufficient to handle a
|
sufficient to cover all languages but might be sufficient to handle a
|
||||||
specific text. Another reason to choose this is because of constraints
|
specific text. Handling of @w{8 bit} character sets is simple. This is
|
||||||
from interaction with other programs (which might not be 8-bit clean).
|
not true for the other kinds presented later and therefore the
|
||||||
|
application one uses might require the use of @w{8 bit} character sets.
|
||||||
|
|
||||||
@cindex ISO 2022
|
@cindex ISO 2022
|
||||||
@item
|
@item
|
||||||
|
@ -816,7 +816,7 @@ weak_alias (__erf, erfl)
|
|||||||
if (ix >= 0x7fff0000)
|
if (ix >= 0x7fff0000)
|
||||||
{ /* erfc(nan)=nan */
|
{ /* erfc(nan)=nan */
|
||||||
/* erfc(+-inf)=0,2 */
|
/* erfc(+-inf)=0,2 */
|
||||||
return (long double) (((sign & 0xffff) >> 15) << 1) + one / x;
|
return (long double) (((u_int32_t) sign >> 31) << 1) + one / x;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ix < 0x3ffd0000) /* |x| <1/4 */
|
if (ix < 0x3ffd0000) /* |x| <1/4 */
|
||||||
|
@ -451,6 +451,16 @@ ifloat: 1
|
|||||||
Test "j0 (2.0) == 0.22389077914123566805":
|
Test "j0 (2.0) == 0.22389077914123566805":
|
||||||
float: 2
|
float: 2
|
||||||
ifloat: 2
|
ifloat: 2
|
||||||
|
Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1"
|
||||||
|
double: 1
|
||||||
|
idouble: 1
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
|
Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1"
|
||||||
|
double: 1
|
||||||
|
idouble: 1
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
Test "j0 (8.0) == 0.17165080713755390609":
|
Test "j0 (8.0) == 0.17165080713755390609":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
|
@ -84,41 +84,51 @@ elf_machine_load_address (void)
|
|||||||
|
|
||||||
/* We have 4 cases to handle. And we code different code sequences
|
/* We have 4 cases to handle. And we code different code sequences
|
||||||
for each one. I love V9 code models... */
|
for each one. I love V9 code models... */
|
||||||
static inline Elf64_Addr
|
static inline void
|
||||||
elf_machine_fixup_plt (struct link_map *map, lookup_t t,
|
sparc64_fixup_plt (struct link_map *map, const Elf64_Rela *reloc,
|
||||||
const Elf64_Rela *reloc,
|
Elf64_Addr *reloc_addr, Elf64_Addr value,
|
||||||
Elf64_Addr *reloc_addr, Elf64_Addr value)
|
Elf64_Addr high, int t)
|
||||||
{
|
{
|
||||||
unsigned int *insns = (unsigned int *) reloc_addr;
|
unsigned int *insns = (unsigned int *) reloc_addr;
|
||||||
Elf64_Addr plt_vaddr = (Elf64_Addr) reloc_addr;
|
Elf64_Addr plt_vaddr = (Elf64_Addr) reloc_addr;
|
||||||
|
Elf64_Sxword disp = value - plt_vaddr;
|
||||||
|
|
||||||
/* Now move plt_vaddr up to the call instruction. */
|
/* Now move plt_vaddr up to the call instruction. */
|
||||||
plt_vaddr += (2 * 4);
|
plt_vaddr += ((t + 1) * 4);
|
||||||
|
|
||||||
/* PLT entries .PLT32768 and above look always the same. */
|
/* PLT entries .PLT32768 and above look always the same. */
|
||||||
if (__builtin_expect (reloc->r_addend, 0) != 0)
|
if (__builtin_expect (high, 0) != 0)
|
||||||
{
|
{
|
||||||
*reloc_addr = value - map->l_addr;
|
*reloc_addr = value - map->l_addr;
|
||||||
}
|
}
|
||||||
|
/* Near destination. */
|
||||||
|
else if (disp >= -0x800000 && disp < 0x800000)
|
||||||
|
{
|
||||||
|
/* As this is just one instruction, it is thread safe and so
|
||||||
|
we can avoid the unnecessary sethi FOO, %g1.
|
||||||
|
b,a target */
|
||||||
|
insns[0] = 0x30800000 | ((disp >> 2) & 0x3fffff);
|
||||||
|
__asm __volatile ("flush %0" : : "r" (insns));
|
||||||
|
}
|
||||||
/* 32-bit Sparc style, the target is in the lower 32-bits of
|
/* 32-bit Sparc style, the target is in the lower 32-bits of
|
||||||
address space. */
|
address space. */
|
||||||
else if ((value >> 32) == 0)
|
else if (insns += t, (value >> 32) == 0)
|
||||||
{
|
{
|
||||||
/* sethi %hi(target), %g1
|
/* sethi %hi(target), %g1
|
||||||
jmpl %g1 + %lo(target), %g0 */
|
jmpl %g1 + %lo(target), %g0 */
|
||||||
|
|
||||||
insns[2] = 0x81c06000 | (value & 0x3ff);
|
insns[1] = 0x81c06000 | (value & 0x3ff);
|
||||||
__asm __volatile ("flush %0 + 8" : : "r" (insns));
|
|
||||||
|
|
||||||
insns[1] = 0x03000000 | ((unsigned int)(value >> 10));
|
|
||||||
__asm __volatile ("flush %0 + 4" : : "r" (insns));
|
__asm __volatile ("flush %0 + 4" : : "r" (insns));
|
||||||
|
|
||||||
|
insns[0] = 0x03000000 | ((unsigned int)(value >> 10));
|
||||||
|
__asm __volatile ("flush %0" : : "r" (insns));
|
||||||
}
|
}
|
||||||
/* We can also get somewhat simple sequences if the distance between
|
/* We can also get somewhat simple sequences if the distance between
|
||||||
the target and the PLT entry is within +/- 2GB. */
|
the target and the PLT entry is within +/- 2GB. */
|
||||||
else if ((plt_vaddr > value
|
else if ((plt_vaddr > value
|
||||||
&& ((plt_vaddr - value) >> 32) == 0)
|
&& ((plt_vaddr - value) >> 31) == 0)
|
||||||
|| (value > plt_vaddr
|
|| (value > plt_vaddr
|
||||||
&& ((value - plt_vaddr) >> 32) == 0))
|
&& ((value - plt_vaddr) >> 31) == 0))
|
||||||
{
|
{
|
||||||
unsigned int displacement;
|
unsigned int displacement;
|
||||||
|
|
||||||
@ -131,14 +141,14 @@ elf_machine_fixup_plt (struct link_map *map, lookup_t t,
|
|||||||
call displacement
|
call displacement
|
||||||
mov %g1, %o7 */
|
mov %g1, %o7 */
|
||||||
|
|
||||||
insns[3] = 0x9e100001;
|
insns[2] = 0x9e100001;
|
||||||
__asm __volatile ("flush %0 + 12" : : "r" (insns));
|
|
||||||
|
|
||||||
insns[2] = 0x40000000 | (displacement >> 2);
|
|
||||||
__asm __volatile ("flush %0 + 8" : : "r" (insns));
|
__asm __volatile ("flush %0 + 8" : : "r" (insns));
|
||||||
|
|
||||||
insns[1] = 0x8210000f;
|
insns[1] = 0x40000000 | (displacement >> 2);
|
||||||
__asm __volatile ("flush %0 + 4" : : "r" (insns));
|
__asm __volatile ("flush %0 + 4" : : "r" (insns));
|
||||||
|
|
||||||
|
insns[t] = 0x8210000f;
|
||||||
|
__asm __volatile ("flush %0" : : "r" (insns));
|
||||||
}
|
}
|
||||||
/* Worst case, ho hum... */
|
/* Worst case, ho hum... */
|
||||||
else
|
else
|
||||||
@ -149,33 +159,62 @@ elf_machine_fixup_plt (struct link_map *map, lookup_t t,
|
|||||||
/* ??? Some tricks can be stolen from the sparc64 egcs backend
|
/* ??? Some tricks can be stolen from the sparc64 egcs backend
|
||||||
constant formation code I wrote. -DaveM */
|
constant formation code I wrote. -DaveM */
|
||||||
|
|
||||||
/* sethi %hh(value), %g1
|
if (__builtin_expect (high32 & 0x3ff, 0))
|
||||||
sethi %lm(value), %g5
|
{
|
||||||
or %g1, %hm(value), %g1
|
/* sethi %hh(value), %g1
|
||||||
or %g5, %lo(value), %g5
|
sethi %lm(value), %g5
|
||||||
sllx %g1, 32, %g1
|
or %g1, %hm(value), %g1
|
||||||
jmpl %g1 + %g5, %g0
|
or %g5, %lo(value), %g5
|
||||||
nop */
|
sllx %g1, 32, %g1
|
||||||
|
jmpl %g1 + %g5, %g0
|
||||||
|
nop */
|
||||||
|
|
||||||
insns[6] = 0x81c04005;
|
insns[5] = 0x81c04005;
|
||||||
__asm __volatile ("flush %0 + 24" : : "r" (insns));
|
__asm __volatile ("flush %0 + 20" : : "r" (insns));
|
||||||
|
|
||||||
insns[5] = 0x83287020;
|
insns[4] = 0x83287020;
|
||||||
__asm __volatile ("flush %0 + 20" : : "r" (insns));
|
__asm __volatile ("flush %0 + 16" : : "r" (insns));
|
||||||
|
|
||||||
insns[4] = 0x8a116000 | (low32 & 0x3ff);
|
insns[3] = 0x8a116000 | (low32 & 0x3ff);
|
||||||
__asm __volatile ("flush %0 + 16" : : "r" (insns));
|
__asm __volatile ("flush %0 + 12" : : "r" (insns));
|
||||||
|
|
||||||
insns[3] = 0x82106000 | (high32 & 0x3ff);
|
insns[2] = 0x82106000 | (high32 & 0x3ff);
|
||||||
__asm __volatile ("flush %0 + 12" : : "r" (insns));
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* sethi %hh(value), %g1
|
||||||
|
sethi %lm(value), %g5
|
||||||
|
sllx %g1, 32, %g1
|
||||||
|
or %g5, %lo(value), %g5
|
||||||
|
jmpl %g1 + %g5, %g0
|
||||||
|
nop */
|
||||||
|
|
||||||
|
insns[4] = 0x81c04005;
|
||||||
|
__asm __volatile ("flush %0 + 16" : : "r" (insns));
|
||||||
|
|
||||||
|
insns[3] = 0x8a116000 | (low32 & 0x3ff);
|
||||||
|
__asm __volatile ("flush %0 + 12" : : "r" (insns));
|
||||||
|
|
||||||
|
insns[2] = 0x83287020;
|
||||||
|
}
|
||||||
|
|
||||||
insns[2] = 0x0b000000 | (low32 >> 10);
|
|
||||||
__asm __volatile ("flush %0 + 8" : : "r" (insns));
|
__asm __volatile ("flush %0 + 8" : : "r" (insns));
|
||||||
|
|
||||||
insns[1] = 0x03000000 | (high32 >> 10);
|
insns[1] = 0x0b000000 | (low32 >> 10);
|
||||||
__asm __volatile ("flush %0 + 4" : : "r" (insns));
|
__asm __volatile ("flush %0 + 4" : : "r" (insns));
|
||||||
}
|
|
||||||
|
|
||||||
|
insns[0] = 0x03000000 | (high32 >> 10);
|
||||||
|
__asm __volatile ("flush %0" : : "r" (insns));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline Elf64_Addr
|
||||||
|
elf_machine_fixup_plt (struct link_map *map, lookup_t t,
|
||||||
|
const Elf64_Rela *reloc,
|
||||||
|
Elf64_Addr *reloc_addr, Elf64_Addr value)
|
||||||
|
{
|
||||||
|
sparc64_fixup_plt (map, reloc, reloc_addr, value + reloc->r_addend,
|
||||||
|
reloc->r_addend, 1);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,7 +223,10 @@ static inline Elf64_Addr
|
|||||||
elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
|
elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
|
||||||
Elf64_Addr value)
|
Elf64_Addr value)
|
||||||
{
|
{
|
||||||
return value + reloc->r_addend;
|
/* Don't add addend here, but in elf_machine_fixup_plt instead.
|
||||||
|
value + reloc->r_addend is the value which should actually be
|
||||||
|
stored into .plt data slot. */
|
||||||
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef RESOLVE
|
#ifdef RESOLVE
|
||||||
@ -329,7 +371,8 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case R_SPARC_JMP_SLOT:
|
case R_SPARC_JMP_SLOT:
|
||||||
elf_machine_fixup_plt(map, 0, reloc, reloc_addr, value);
|
sparc64_fixup_plt (map, reloc, reloc_addr, value,
|
||||||
|
reloc->r_addend, 0);
|
||||||
break;
|
break;
|
||||||
#ifndef RTLD_BOOTSTRAP
|
#ifndef RTLD_BOOTSTRAP
|
||||||
case R_SPARC_UA16:
|
case R_SPARC_UA16:
|
||||||
@ -425,6 +468,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
extern void _dl_runtime_profile_1 (void);
|
extern void _dl_runtime_profile_1 (void);
|
||||||
Elf64_Addr res0_addr, res1_addr;
|
Elf64_Addr res0_addr, res1_addr;
|
||||||
unsigned int *plt = (void *) D_PTR (l, l_info[DT_PLTGOT]);
|
unsigned int *plt = (void *) D_PTR (l, l_info[DT_PLTGOT]);
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
if (! profile)
|
if (! profile)
|
||||||
{
|
{
|
||||||
@ -473,13 +517,21 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
plt[8 + 0] = 0x9de3bf40;
|
plt[8 + 0] = 0x9de3bf40;
|
||||||
|
if (__builtin_expect (((res1_addr + 4) >> 32) & 0x3ff, 0))
|
||||||
|
i = 1;
|
||||||
|
else
|
||||||
|
res1_addr += 4;
|
||||||
plt[8 + 1] = 0x21000000 | (res1_addr >> (64 - 22));
|
plt[8 + 1] = 0x21000000 | (res1_addr >> (64 - 22));
|
||||||
plt[8 + 2] = 0x23000000 | ((res1_addr >> 10) & 0x003fffff);
|
plt[8 + 2] = 0x23000000 | ((res1_addr >> 10) & 0x003fffff);
|
||||||
plt[8 + 3] = 0xa0142000 | ((res1_addr >> 32) & 0x3ff);
|
if (__builtin_expect (i, 0))
|
||||||
|
plt[8 + 3] = 0xa0142000 | ((res1_addr >> 32) & 0x3ff);
|
||||||
|
else
|
||||||
|
plt[8 + 3] = 0xa12c3020;
|
||||||
plt[8 + 4] = 0xa2146000 | (res1_addr & 0x3ff);
|
plt[8 + 4] = 0xa2146000 | (res1_addr & 0x3ff);
|
||||||
plt[8 + 5] = 0xa12c3020;
|
if (__builtin_expect (i, 0))
|
||||||
plt[8 + 6] = 0xadc40011;
|
plt[8 + 5] = 0xa12c3020;
|
||||||
plt[8 + 7] = 0x9330700c;
|
plt[8 + 5 + i] = 0xadc40011;
|
||||||
|
plt[8 + 6 + i] = 0x9330700c;
|
||||||
|
|
||||||
/* Now put the magic cookie at the beginning of .PLT2
|
/* Now put the magic cookie at the beginning of .PLT2
|
||||||
Entry .PLT3 is unused by this implementation. */
|
Entry .PLT3 is unused by this implementation. */
|
||||||
@ -526,10 +578,11 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
"\n" \
|
"\n" \
|
||||||
" .globl " #tramp_name "_1\n" \
|
" .globl " #tramp_name "_1\n" \
|
||||||
" .type " #tramp_name "_1, @function\n" \
|
" .type " #tramp_name "_1, @function\n" \
|
||||||
" .align 32\n" \
|
" ! tramp_name_1 + 4 needs to be .align 32\n" \
|
||||||
"\t" #tramp_name "_1:\n" \
|
"\t" #tramp_name "_1:\n" \
|
||||||
|
" sub %l6, 4, %l6\n" \
|
||||||
" ! srlx %g1, 12, %o1 - Done in .PLT1\n" \
|
" ! srlx %g1, 12, %o1 - Done in .PLT1\n" \
|
||||||
" ldx [%l6 + 8], %o0\n" \
|
" ldx [%l6 + 12], %o0\n" \
|
||||||
" add %o1, %o1, %o3\n" \
|
" add %o1, %o1, %o3\n" \
|
||||||
" sub %o1, 96, %o1 ! No thanks to Sun for not obeying their own ABI\n" \
|
" sub %o1, 96, %o1 ! No thanks to Sun for not obeying their own ABI\n" \
|
||||||
" mov %i7, %o2\n" \
|
" mov %i7, %o2\n" \
|
||||||
|
@ -562,6 +562,16 @@ ifloat: 1
|
|||||||
Test "j0 (2.0) == 0.22389077914123566805":
|
Test "j0 (2.0) == 0.22389077914123566805":
|
||||||
float: 2
|
float: 2
|
||||||
ifloat: 2
|
ifloat: 2
|
||||||
|
Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1"
|
||||||
|
double: 1
|
||||||
|
idouble: 1
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
|
Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1"
|
||||||
|
double: 1
|
||||||
|
idouble: 1
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
Test "j0 (8.0) == 0.17165080713755390609":
|
Test "j0 (8.0) == 0.17165080713755390609":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
|
@ -48,7 +48,9 @@ struct sigcontext
|
|||||||
unsigned long int sc_br[8]; /* branch registers */
|
unsigned long int sc_br[8]; /* branch registers */
|
||||||
unsigned long int sc_gr[32]; /* general registers (static partition) */
|
unsigned long int sc_gr[32]; /* general registers (static partition) */
|
||||||
struct ia64_fpreg sc_fr[128]; /* floating-point registers */
|
struct ia64_fpreg sc_fr[128]; /* floating-point registers */
|
||||||
unsigned long int sc_rsvd[16];/* reserved for future use */
|
unsigned long int sc_rbs_base;/* NULL or new base of sighandler's rbs */
|
||||||
|
unsigned long int sc_loadrs; /* see description above */
|
||||||
|
unsigned long int sc_rsvd[14];/* reserved for future use */
|
||||||
|
|
||||||
/* sc_mask is actually an sigset_t but we don't want to
|
/* sc_mask is actually an sigset_t but we don't want to
|
||||||
* include the kernel headers here. */
|
* include the kernel headers here. */
|
||||||
|
Loading…
Reference in New Issue
Block a user