aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2005-01-12 03:12:43 +0000
committerUlrich Drepper <drepper@redhat.com>2005-01-12 03:12:43 +0000
commit537e7234f77be5ceab819b701fb173fb859e0605 (patch)
treee41492fb8920cbf169ede6ec5dd8dfcd5f3835a1
parent8bf139c95b0d14b942307006120a6c7d084c7aa9 (diff)
downloadglibc-537e7234f77be5ceab819b701fb173fb859e0605.tar.xz
glibc-537e7234f77be5ceab819b701fb173fb859e0605.zip
* grp/putgrent.c (putgrent): Don't write 0 as group
ID if groupname starts with + or -. * pwd/putpwent.c (putpwent): Don't write 0 as user or group ID if user name starts with + or -. 2005-01-09 Kaz Kojima <kkojima@rr.iij4u.or.jp> * sysdeps/generic/ldsodefs.h (struct audit_ifaces): Add sh variants. * sysdeps/elf/tst-auditmod1.c: Add sh support. * sysdeps/sh/bits/link.h: New. * sysdeps/sh/dl-machine.h: Remove trampoline code here. Define ARCH_LA_PLTENTER and ARCH_LA_PLTEXIT. Remove obsolete comments. (RTLD_START): Define __fpscr_values. * sysdeps/sh/dl-trampoline.S: New file. * sysdeps/sh/sh4/dl-trampoline.S: New file. * sysdeps/sh/sh4/Versions [ld]: Add __fpscr_values. * sysdeps/sh/sh4/dl-machine.h: Remove. 2005-01-10 Jakub Jelinek <jakub@redhat.com> * time/tst-strptime.c (day_tests): Add 2 new tests. (test_tm, main): Issue an error instead of segfaulting if strptime returns NULL. 2005-01-10 H.J. Lu <hongjiu.lu@intel.com> * sysdeps/alpha/libc-tls.c (__tls_get_addr): Updated for dtv_t union. * sysdeps/ia64/libc-tls.c (__tls_get_addr): Likewise.
-rw-r--r--ChangeLog31
-rw-r--r--elf/tst-auditmod1.c23
-rw-r--r--grp/putgrent.c11
-rw-r--r--pwd/putpwent.c26
-rw-r--r--sysdeps/alpha/libc-tls.c2
-rw-r--r--sysdeps/generic/ldsodefs.h9
-rw-r--r--sysdeps/ia64/libc-tls.c2
-rw-r--r--sysdeps/sh/bits/link.h70
-rw-r--r--sysdeps/sh/dl-machine.h293
-rw-r--r--sysdeps/sh/dl-trampoline.S431
-rw-r--r--sysdeps/sh/sh4/Versions5
-rw-r--r--sysdeps/sh/sh4/dl-machine.h2
-rw-r--r--sysdeps/sh/sh4/dl-trampoline.S2
-rw-r--r--time/tst-strptime.c22
14 files changed, 636 insertions, 293 deletions
diff --git a/ChangeLog b/ChangeLog
index 9ffe21aaaa..1f98fbf6ef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+2005-01-11 Thorsten Kukuk <kukuk@suse.de>
+
+ * grp/putgrent.c (putgrent): Don't write 0 as group
+ ID if groupname starts with + or -.
+ * pwd/putpwent.c (putpwent): Don't write 0 as user or
+ group ID if user name starts with + or -.
+
+2005-01-09 Kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+ * sysdeps/generic/ldsodefs.h (struct audit_ifaces): Add sh variants.
+ * sysdeps/elf/tst-auditmod1.c: Add sh support.
+ * sysdeps/sh/bits/link.h: New.
+ * sysdeps/sh/dl-machine.h: Remove trampoline code here. Define
+ ARCH_LA_PLTENTER and ARCH_LA_PLTEXIT. Remove obsolete comments.
+ (RTLD_START): Define __fpscr_values.
+ * sysdeps/sh/dl-trampoline.S: New file.
+ * sysdeps/sh/sh4/dl-trampoline.S: New file.
+ * sysdeps/sh/sh4/Versions [ld]: Add __fpscr_values.
+ * sysdeps/sh/sh4/dl-machine.h: Remove.
+
+2005-01-10 Jakub Jelinek <jakub@redhat.com>
+
+ * time/tst-strptime.c (day_tests): Add 2 new tests.
+ (test_tm, main): Issue an error instead of segfaulting if
+ strptime returns NULL.
+
+2005-01-10 H.J. Lu <hongjiu.lu@intel.com>
+
+ * sysdeps/alpha/libc-tls.c (__tls_get_addr): Updated for dtv_t union.
+ * sysdeps/ia64/libc-tls.c (__tls_get_addr): Likewise.
+
2005-01-11 Ulrich Drepper <drepper@redhat.com>
* malloc/malloc.h: Remove no-glibc support.
diff --git a/elf/tst-auditmod1.c b/elf/tst-auditmod1.c
index 054c27dba2..ae7677647f 100644
--- a/elf/tst-auditmod1.c
+++ b/elf/tst-auditmod1.c
@@ -194,6 +194,29 @@ la_ppc64_gnu_pltexit (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
return 0;
}
+#elif defined __sh__
+uintptr_t
+la_sh_gnu_pltenter (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
+ uintptr_t *defcook, La_sh_regs *regs,
+ unsigned int *flags, const char *symname,
+ long int *framesizep)
+{
+ printf ("sh_pltenter: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
+ symname, (long int) sym->st_value, ndx, *flags);
+
+ return sym->st_value;
+}
+
+unsigned int
+la_sh_gnu_pltexit (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
+ uintptr_t *defcook, const La_sh_regs *inregs,
+ La_sh_retval *outregs, const char *symname)
+{
+ printf ("sh_pltexit: symname=%s, st_value=%#lx, ndx=%u, retval=%tu\n",
+ symname, (long int) sym->st_value, ndx, outregs->lrv_r0);
+
+ return 0;
+}
#else
# error "architecture specific code needed"
#endif
diff --git a/grp/putgrent.c b/grp/putgrent.c
index cb9b6b1f79..382d6a4daa 100644
--- a/grp/putgrent.c
+++ b/grp/putgrent.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 96, 98, 99, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,96,98,99,2000,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -44,8 +44,13 @@ putgrent (gr, stream)
flockfile (stream);
- retval = fprintf (stream, "%s:%s:%u:",
- gr->gr_name, _S (gr->gr_passwd), gr->gr_gid);
+ if (gr->gr_name[0] == '+' || gr->gr_name[0] == '-')
+ retval = fprintf (stream, "%s:%s::",
+ gr->gr_name, _S (gr->gr_passwd));
+ else
+ retval = fprintf (stream, "%s:%s:%lu:",
+ gr->gr_name, _S (gr->gr_passwd),
+ (unsigned long int) gr->gr_gid);
if (__builtin_expect (retval, 0) < 0)
{
funlockfile (stream);
diff --git a/pwd/putpwent.c b/pwd/putpwent.c
index 8b7767bd4a..a1041ec1c2 100644
--- a/pwd/putpwent.c
+++ b/pwd/putpwent.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1996,1997,1998,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -20,7 +20,7 @@
#include <stdio.h>
#include <pwd.h>
-#define _S(x) x ? x : ""
+#define _S(x) x ?: ""
/* Write an entry to the given stream.
This must know the format of the password file. */
@@ -35,11 +35,21 @@ putpwent (p, stream)
return -1;
}
- if (fprintf (stream, "%s:%s:%lu:%lu:%s:%s:%s\n",
- p->pw_name, _S (p->pw_passwd),
- (unsigned long int) p->pw_uid, (unsigned long int) p->pw_gid,
- _S (p->pw_gecos), _S (p->pw_dir), _S (p->pw_shell)) < 0)
- return -1;
-
+ if (p->pw_name[0] == '+' || p->pw_name[0] == '-')
+ {
+ if (fprintf (stream, "%s:%s:::%s:%s:%s\n",
+ p->pw_name, _S (p->pw_passwd),
+ _S (p->pw_gecos), _S (p->pw_dir), _S (p->pw_shell)) < 0)
+ return -1;
+ }
+ else
+ {
+ if (fprintf (stream, "%s:%s:%lu:%lu:%s:%s:%s\n",
+ p->pw_name, _S (p->pw_passwd),
+ (unsigned long int) p->pw_uid,
+ (unsigned long int) p->pw_gid,
+ _S (p->pw_gecos), _S (p->pw_dir), _S (p->pw_shell)) < 0)
+ return -1;
+ }
return 0;
}
diff --git a/sysdeps/alpha/libc-tls.c b/sysdeps/alpha/libc-tls.c
index 434d5d9313..a3b68e928f 100644
--- a/sysdeps/alpha/libc-tls.c
+++ b/sysdeps/alpha/libc-tls.c
@@ -31,7 +31,7 @@ void *
__tls_get_addr (tls_index *ti)
{
dtv_t *dtv = THREAD_DTV ();
- return (char *) dtv[1].pointer + ti->ti_offset;
+ return (char *) dtv[1].pointer.val + ti->ti_offset;
}
#endif
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 7364f321de..e4024419e3 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -183,6 +183,8 @@ struct La_ppc32_regs;
struct La_ppc32_retval;
struct La_ppc64_regs;
struct La_ppc64_retval;
+struct La_sh_regs;
+struct La_sh_retval;
struct audit_ifaces
@@ -216,6 +218,10 @@ struct audit_ifaces
uintptr_t *, struct La_ppc64_regs *,
unsigned int *, const char *name,
long int *framesizep);
+ uintptr_t (*sh_gnu_pltenter) (Elf32_Sym *, unsigned int, uintptr_t *,
+ uintptr_t *, const struct La_sh_regs *,
+ unsigned int *, const char *name,
+ long int *framesizep);
};
union
{
@@ -235,6 +241,9 @@ struct audit_ifaces
uintptr_t *,
const struct La_ppc64_regs *,
struct La_ppc64_retval *, const char *);
+ unsigned int (*sh_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *,
+ uintptr_t *, const struct La_sh_regs *,
+ struct La_sh_retval *, const char *);
};
unsigned int (*objclose) (uintptr_t *);
diff --git a/sysdeps/ia64/libc-tls.c b/sysdeps/ia64/libc-tls.c
index f1df4cd12e..3a6b8e5532 100644
--- a/sysdeps/ia64/libc-tls.c
+++ b/sysdeps/ia64/libc-tls.c
@@ -30,7 +30,7 @@ void *
__tls_get_addr (size_t m, size_t offset)
{
dtv_t *dtv = THREAD_DTV ();
- return (char *) dtv[1].pointer + offset;
+ return (char *) dtv[1].pointer.val + offset;
}
#endif
diff --git a/sysdeps/sh/bits/link.h b/sysdeps/sh/bits/link.h
index e69de29bb2..2826677336 100644
--- a/sysdeps/sh/bits/link.h
+++ b/sysdeps/sh/bits/link.h
@@ -0,0 +1,70 @@
+/* Copyright (C) 2005 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _LINK_H
+# error "Never include <bits/link.h> directly; use <link.h> instead."
+#endif
+
+
+/* Registers for entry into PLT on SH. */
+typedef struct La_sh_regs
+{
+ uint32_t lr_r2;
+ uint32_t lr_r3;
+ uint32_t lr_r4;
+ uint32_t lr_r5;
+ uint32_t lr_r6;
+ uint32_t lr_r7;
+ uint32_t lr_fpscr;
+ float lr_fr4;
+ float lr_fr5;
+ float lr_fr6;
+ float lr_fr7;
+ float lr_fr8;
+ float lr_fr9;
+ float lr_fr10;
+ float lr_fr11;
+} La_sh_regs;
+
+/* Return values for calls from PLT on SH. */
+typedef struct La_sh_retval
+{
+ uint32_t lrv_r0;
+ uint32_t lrv_r1;
+ float lrv_fr0;
+ float lrv_fr1;
+} La_sh_retval;
+
+
+__BEGIN_DECLS
+
+extern Elf32_Addr la_sh_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx,
+ uintptr_t *__refcook,
+ uintptr_t *__defcook,
+ La_sh_regs *__regs,
+ unsigned int *__flags,
+ const char *__symname,
+ long int *__framesizep);
+extern unsigned int la_sh_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx,
+ uintptr_t *__refcook,
+ uintptr_t *__defcook,
+ const La_sh_regs *__inregs,
+ La_sh_retval *__outregs,
+ const char *symname);
+
+__END_DECLS
diff --git a/sysdeps/sh/dl-machine.h b/sysdeps/sh/dl-machine.h
index 271666a2a3..2b21f1b08e 100644
--- a/sysdeps/sh/dl-machine.h
+++ b/sysdeps/sh/dl-machine.h
@@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. SH version.
- Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -21,8 +21,6 @@
#ifndef dl_machine_h
#define dl_machine_h
-/* Only dummy. This doesn't work. */
-
#define ELF_MACHINE_NAME "SH"
#include <sys/param.h>
@@ -106,7 +104,9 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
{
got[2] = (Elf32_Addr) &_dl_runtime_profile;
/* Say that we really want profiling and the timers are started. */
- GL(dl_profile_map) = l;
+ if (GLRO(dl_profile) != NULL
+ && _dl_name_match_p (GLRO(dl_profile), l))
+ GL(dl_profile_map) = l;
}
else
/* This function will get called to fix up the GOT entry indicated by
@@ -116,273 +116,8 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
return lazy;
}
-/* This code is used in dl-runtime.c to call the `fixup' function
- and then redirect to the address it returns. */
-
#define ELF_MACHINE_RUNTIME_FIXUP_ARGS int plt_type
-#ifdef SHARED
-#define FUN_ADDR "\
- mov.l 1f,r2\n\
- mova 1f,r0\n\
- bra 2f\n\
- add r0,r2 ! Get GOT address in r2\n\
-0: .align 2\n\
-1: .long _GLOBAL_OFFSET_TABLE_\n\
-2: mov.l 3f,r0\n\
- add r2,r0"
-#define GOTJMP(x) #x "@GOTOFF"
-#else
-#define FUN_ADDR "\
- mov.l 3f,r0"
-#define GOTJMP(x) #x
-#endif
-
-#ifdef HAVE_FPU
-#define FGR_SAVE "\
- sts.l fpscr, @-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov #8,r3\n\
- swap.w r3, r3\n\
- lds r3, fpscr\n\
- fmov.s fr11, @-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- fmov.s fr10, @-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- fmov.s fr9, @-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- fmov.s fr8, @-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- fmov.s fr7, @-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- fmov.s fr6, @-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- fmov.s fr5, @-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- fmov.s fr4, @-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4)
-#define FGR_LOAD "\
- fmov.s @r15+, fr4\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- fmov.s @r15+, fr5\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- fmov.s @r15+, fr6\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- fmov.s @r15+, fr7\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- fmov.s @r15+, fr8\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- fmov.s @r15+, fr9\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- fmov.s @r15+, fr10\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- fmov.s @r15+, fr11\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- lds.l @r15+, fpscr\n\
- " CFI_ADJUST_CFA_OFFSET (-4)
-#else
-#define FGR_SAVE ""
-#define FGR_LOAD ""
-#endif
-
-#ifndef PROF
-# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
- .text\n\
- .globl _dl_runtime_resolve\n\
- .type _dl_runtime_resolve, @function\n\
- " CFI_STARTPROC "\n\
- .align 5\n\
-_dl_runtime_resolve:\n\
- mov.l r2,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r3,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r4,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r5,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r6,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r7,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r12,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- movt r3 ! Save T flag.\n\
- mov.l r3,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- " FGR_SAVE "\n\
- sts.l pr,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- tst r0,r0\n\
- bt 1f\n\
- mov r0,r2\n\
-1:\n\
- mov r0,r4 ! PLT type\n\
- mov r2,r5 ! link map address\n\
- " FUN_ADDR "\n\
- jsr @r0 ! Call resolver.\n\
- mov r1,r6 ! reloc offset\n\
- lds.l @r15+,pr ! Get register content back.\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- " FGR_LOAD "\n\
- mov.l @r15+,r3\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- shal r3 ! Lode T flag.\n\
- mov.l @r15+,r12\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r7\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r6\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r5\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r4\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r3\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- jmp @r0 ! Jump to function address.\n\
- mov.l @r15+,r2\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- .align 2\n\
-3:\n\
- .long " GOTJMP (fixup) "\n\
- " CFI_ENDPROC "\n\
- .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
-\n\
- .globl _dl_runtime_profile\n\
- .type _dl_runtime_profile, @function\n\
- " CFI_STARTPROC "\n\
- .align 5\n\
-_dl_runtime_profile:\n\
- mov.l r2,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r3,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r4,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r5,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r6,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r7,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r12,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- movt r3 ! Save T flag.\n\
- mov.l r3,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- " FGR_SAVE "\n\
- sts.l pr,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- tst r0,r0\n\
- bt 1f\n\
- mov r0,r2\n\
-1:\n\
- mov r0,r4 ! PLT type\n\
- mov r2,r5 ! link map address\n\
- sts pr,r7 ! return address\n\
- " FUN_ADDR "\n\
- jsr @r0 ! Call resolver.\n\
- mov r1,r6 ! reloc offset\n\
- lds.l @r15+,pr ! Get register content back.\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- " FGR_LOAD "\n\
- mov.l @r15+,r3\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- shal r3 ! Lode T flag.\n\
- mov.l @r15+,r12\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r7\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r6\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r5\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r4\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r3\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- jmp @r0 ! Jump to function address.\n\
- mov.l @r15+,r2\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- .align 2\n\
-3:\n\
- .long " GOTJMP (profile_fixup) "\n\
- " CFI_ENDPROC "\n\
- .size _dl_runtime_profile, .-_dl_runtime_profile\n\
- .previous\n\
-");
-#else
-# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
- .text\n\
- .globl _dl_runtime_resolve\n\
- .globl _dl_runtime_profile\n\
- .type _dl_runtime_resolve, @function\n\
- .type _dl_runtime_profile, @function\n\
- .align 5\n\
-_dl_runtime_resolve:\n\
-_dl_runtime_profile:\n\
- mov.l r2,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r3,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r4,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r5,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r6,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r7,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- mov.l r12,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- movt r3 ! Save T flag.\n\
- mov.l r3,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- " FGR_SAVE "\n\
- sts.l pr,@-r15\n\
- " CFI_ADJUST_CFA_OFFSET (4) "\n\
- tst r0,r0\n\
- bt 1f\n\
- mov r0,r2\n\
-1:\n\
- mov r0,r4 ! PLT type\n\
- mov r2,r5 ! link map address\n\
- sts pr,r7 ! return address\n\
- " FUN_ADDR "\n\
- jsr @r0 ! Call resolver.\n\
- mov r1,r6 ! reloc offset\n\
- lds.l @r15+,pr ! Get register content back.\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- " FGR_LOAD "\n\
- mov.l @r15+,r3\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- shal r3 ! Lode T flag.\n\
- mov.l @r15+,r12\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r7\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r6\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r5\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r4\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- mov.l @r15+,r3\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- jmp @r0 ! Jump to function address.\n\
- mov.l @r15+,r2\n\
- " CFI_ADJUST_CFA_OFFSET (-4) "\n\
- .align 2\n\
-3:\n\
- .long " GOTJMP (fixup) "\n\
- " CFI_ENDPROC "\n\
- .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
- .size _dl_runtime_profile, .-_dl_runtime_profile\n\
- .previous\n\
-");
-#endif
-
/* Mask identifying addresses reserved for the user program,
where the dynamic linker should not map anything. */
#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL
@@ -459,6 +194,12 @@ _dl_start_user:\n\
.long _rtld_local@GOT\n\
.L_dl_fini:\n\
.long _dl_fini@GOT\n\
+ .type __fpscr_values,@object\n\
+ .global __fpscr_values\n\
+__fpscr_values:\n\
+ .long 0\n\
+ .long 0x80000\n\
+ .weak __fpscr_values\n\
.previous\n\
");
@@ -510,9 +251,12 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
return value + reloc->r_addend;
}
+#define ARCH_LA_PLTENTER sh_gnu_pltenter
+#define ARCH_LA_PLTEXIT sh_gnu_pltexit
+
#endif /* !dl_machine_h */
-#ifdef RESOLVE
+#ifdef RESOLVE_MAP
/* SH never uses Elf32_Rel relocations. */
#define ELF_MACHINE_NO_REL 1
@@ -579,17 +323,14 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
else
{
const Elf32_Sym *const refsym = sym;
-#if defined USE_TLS && !defined RTLD_BOOTSTRAP
+#ifndef RTLD_BOOTSTRAP
struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);