* 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.
This commit is contained in:
Ulrich Drepper 2005-01-12 03:12:43 +00:00
parent 8bf139c95b
commit 537e7234f7
14 changed files with 636 additions and 293 deletions

View File

@ -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.

View File

@ -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

View File

@ -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);

View File

@ -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;
}

View File

@ -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

View File

@ -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 *);

View File

@ -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

View File

@ -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

View File

@ -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);
value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
#else
value = RESOLVE (&sym, version, r_type);
# ifndef RTLD_BOOTSTRAP
if (sym != NULL)
# endif
value += sym->st_value;
value += sym->st_value;
#endif
value += reloc->r_addend;
@ -736,4 +477,4 @@ elf_machine_lazy_rel (struct link_map *map,
_dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
}
#endif /* RESOLVE */
#endif /* RESOLVE_MAP */

431
sysdeps/sh/dl-trampoline.S Normal file
View File

@ -0,0 +1,431 @@
/* PLT trampolines. SH version.
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. */
#include <sysdep.h>
.text
.globl _dl_runtime_resolve
.type _dl_runtime_resolve, @function
cfi_startproc
.align 5
_dl_runtime_resolve:
mov.l r2,@-r15
cfi_adjust_cfa_offset (4)
mov.l r3,@-r15
cfi_adjust_cfa_offset (4)
mov.l r4,@-r15
cfi_adjust_cfa_offset (4)
mov.l r5,@-r15
cfi_adjust_cfa_offset (4)
mov.l r6,@-r15
cfi_adjust_cfa_offset (4)
mov.l r7,@-r15
cfi_adjust_cfa_offset (4)
mov.l r12,@-r15
cfi_adjust_cfa_offset (4)
sts.l macl,@-r15
cfi_adjust_cfa_offset (4)
sts.l mach,@-r15
cfi_adjust_cfa_offset (4)
movt r3 ! Save T flag.
mov.l r3,@-r15
cfi_adjust_cfa_offset (4)
#ifdef HAVE_FPU
sts.l fpscr,@-r15
cfi_adjust_cfa_offset (4)
mov #8,r3
swap.w r3,r3
lds r3,fpscr
fmov.s fr11,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr10,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr9,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr8,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr7,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr6,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr5,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr4,@-r15
cfi_adjust_cfa_offset (4)
#endif
sts.l pr,@-r15
cfi_adjust_cfa_offset (4)
tst r0,r0
bt 1f
mov r0,r2
1:
mov r0,r4 ! PLT type
mov r2,r5 ! link map address
#ifdef SHARED
mov.l 2f,r2
mova 2f,r0
add r0,r2 ! Get GOT address in r2
mov.l 3f,r0
add r2,r0
#else
mov.l 3f,r0
#endif
jsr @r0 ! Call resolver.
mov r1,r6 ! reloc offset
lds.l @r15+,pr ! Get register content back.
cfi_adjust_cfa_offset (-4)
#ifdef HAVE_FPU
fmov.s @r15+,fr4
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr5
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr6
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr7
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr8
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr9
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr10
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr11
cfi_adjust_cfa_offset (-4)
lds.l @r15+,fpscr
cfi_adjust_cfa_offset (-4)
#endif
mov.l @r15+,r3
cfi_adjust_cfa_offset (-4)
shal r3 ! Lode T flag.
lds.l @r15+,mach
cfi_adjust_cfa_offset (-4)
lds.l @r15+,macl
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r12
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r7
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r6
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r5
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r4
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r3
cfi_adjust_cfa_offset (-4)
jmp @r0 ! Jump to function address.
mov.l @r15+,r2
cfi_adjust_cfa_offset (-4)
.align 2
#ifdef SHARED
2: .long _GLOBAL_OFFSET_TABLE_
3: .long _dl_fixup@GOTOFF
#else
3: .long _dl_fixup
#endif
cfi_endproc
.size _dl_runtime_resolve, .-_dl_runtime_resolve
.globl _dl_runtime_profile
.type _dl_runtime_profile,@function
cfi_startproc
.align 5
_dl_runtime_profile:
mov.l r12,@-r15
cfi_adjust_cfa_offset (4)
#ifdef HAVE_FPU
sts.l fpscr,@-r15
cfi_adjust_cfa_offset (4)
mov #8,r12
swap.w r12,r12
lds r12,fpscr
fmov.s fr11,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr10,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr9,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr8,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr7,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr6,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr5,@-r15
cfi_adjust_cfa_offset (4)
fmov.s fr4,@-r15
cfi_adjust_cfa_offset (4)
#else
add #-36,r15
cfi_adjust_cfa_offset (36)
#endif
mov.l r7,@-r15
cfi_adjust_cfa_offset (4)
mov.l r6,@-r15
cfi_adjust_cfa_offset (4)
mov.l r5,@-r15
cfi_adjust_cfa_offset (4)
mov.l r4,@-r15
cfi_adjust_cfa_offset (4)
mov.l r3,@-r15
cfi_adjust_cfa_offset (4)
mov.l r2,@-r15
cfi_adjust_cfa_offset (4)
sts.l macl,@-r15
cfi_adjust_cfa_offset (4)
sts.l mach,@-r15
cfi_adjust_cfa_offset (4)
movt r3 ! Save T flag.
mov.l r3,@-r15
cfi_adjust_cfa_offset (4)
sts.l pr,@-r15
cfi_adjust_cfa_offset (4)
tst r0,r0
bt 1f
mov r0,r2
1:
mov r0,r4 ! PLT type
mov r2,r5 ! link map address
sts pr,r7 ! return address
add #-24,r15
cfi_adjust_cfa_offset (24)
mov #40,r0
add r15,r0
mov.l r0,@r15 ! Address of the register structure
mov #-1,r0
mov.l r0,@(8,r15)
mov #8,r0
add r15,r0
mov.l r0,@(4,r15)
mov.l r5,@(12,r15)
mov.l r1,@(16,r15)
#ifdef SHARED
mov.l 2f,r12
mova 2f,r0
add r0,r12 ! Get GOT address in r12
mov.l 3f,r0
add r12,r0
#else
mov.l 3f,r0
#endif
jsr @r0 ! Call resolver.
mov r1,r6 ! reloc offset
mov.l @(8,r15),r1
cmp/pz r1
bt 4f
add #24,r15
cfi_adjust_cfa_offset (-24)
lds.l @r15+,pr ! Get register content back.
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r3
cfi_adjust_cfa_offset (-4)
shal r3 ! Lode T flag.
lds.l @r15+,mach
cfi_adjust_cfa_offset (-4)
lds.l @r15+,macl
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r2
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r3
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r4
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r5
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r6
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r7
cfi_adjust_cfa_offset (-4)
#ifdef HAVE_FPU
fmov.s @r15+,fr4
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr5
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr6
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr7
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr8
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr9
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr10
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr11
cfi_adjust_cfa_offset (-4)
lds.l @r15+,fpscr
cfi_adjust_cfa_offset (-4)
#else
add #36,r15
cfi_adjust_cfa_offset (-36)
#endif
jmp @r0 ! Jump to function address.
mov.l @r15+,r12
cfi_adjust_cfa_offset (-4)
.align 2
#ifdef SHARED
2: .long _GLOBAL_OFFSET_TABLE_
3: .long _dl_profile_fixup@GOTOFF
#else
3: .long _dl_profile_fixup
#endif
cfi_adjust_cfa_offset (104)
4:
mov #104,r3
add r15,r3 ! Original stack
mov.l r8,@(20,r15)
cfi_rel_offset (r8, 20)
mov r15,r8
sub r1,r15
shlr2 r15
shll2 r15
mov r15,r4
shlr2 r1
tst r1,r1
5:
bt/s 6f
dt r1
mov.l @r3+,r2
mov.l r2,@r4
bra 5b
add #4,r4
6:
mov.l @r8,r12
mov.l @r12+,r2
mov.l @r12+,r3
mov.l @r12+,r4
mov.l @r12+,r5
mov.l @r12+,r6
mov.l @r12+,r7
#ifdef HAVE_FPU
fmov.s @r12+,fr4
fmov.s @r12+,fr5
fmov.s @r12+,fr6
fmov.s @r12+,fr7
fmov.s @r12+,fr8
fmov.s @r12+,fr9
fmov.s @r12+,fr10
fmov.s @r12+,fr11
lds.l @r12+,fpscr
#else
add #36,r2
#endif
jsr @r0 ! Call function.
nop
mov r8,r15
mov.l @(12,r15),r4 ! link map address
mov.l @(16,r15),r5 ! reloc offset
mov.l @r15,r6 ! input registers
#ifdef HAVE_FPU
mov #16,r8
add r15,r8
fmov.s fr1,@-r8
fmov.s fr0,@-r8
#else
mov #8,r8
add r15,r8
#endif
mov.l r1,@-r8
mov.l r0,@-r8
mov.l @(20,r15),r8
cfi_restore (r8)
#ifdef SHARED
mov.l 7f,r12
mova 7f,r0
add r0,r12 ! Get GOT address in r12
mov.l 8f,r0
add r12,r0
#else
mov.l 8f,r0
#endif
jsr @r0
mov r15,r7 ! output registers
mov.l @r15+,r0
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r1
cfi_adjust_cfa_offset (-4)
#ifdef HAVE_FPU
fmov.s @r15+,fr0
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr1
cfi_adjust_cfa_offset (-4)
add #8,r15
cfi_adjust_cfa_offset (-8)
#else
add #16,r15
cfi_adjust_cfa_offset (-16)
#endif
lds.l @r15+,pr ! Get register content back.
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r3
cfi_adjust_cfa_offset (-4)
shal r3 ! Lode T flag.
lds.l @r15+,mach
cfi_adjust_cfa_offset (-4)
lds.l @r15+,macl
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r2
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r3
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r4
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r5
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r6
cfi_adjust_cfa_offset (-4)
mov.l @r15+,r7
cfi_adjust_cfa_offset (-4)
#ifdef HAVE_FPU
fmov.s @r15+,fr4
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr5
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr6
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr7
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr8
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr9
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr10
cfi_adjust_cfa_offset (-4)
fmov.s @r15+,fr11
cfi_adjust_cfa_offset (-4)
lds.l @r15+,fpscr
cfi_adjust_cfa_offset (-4)
#else
add #36,r15
cfi_adjust_cfa_offset (-36)
#endif
rts ! Jump to function address.
mov.l @r15+,r12
cfi_adjust_cfa_offset (-4)
cfi_endproc
.align 2
#ifdef SHARED
7: .long _GLOBAL_OFFSET_TABLE_
8: .long _dl_call_pltexit@GOTOFF
#else
8: .long _dl_call_pltexit
#endif
.size _dl_runtime_profile, .-_dl_runtime_profile

5
sysdeps/sh/sh4/Versions Normal file
View File

@ -0,0 +1,5 @@
ld {
GLIBC_PRIVATE {
__fpscr_values;
}
}

View File

@ -1,2 +0,0 @@
#define HAVE_FPU
#include <sysdeps/sh/dl-machine.h>

View File

@ -0,0 +1,2 @@
#define HAVE_FPU
#include <sysdeps/sh/dl-trampoline.S>

View File

@ -42,6 +42,10 @@ static const struct
{ "C", "19990502123412", "%Y%m%d%H%M%S", 0, 121, 4, 2 },
{ "C", "2001 20 Mon", "%Y %U %a", 1, 140, 4, 21 },
{ "C", "2001 21 Mon", "%Y %W %a", 1, 140, 4, 21 },
{ "ja_JP.EUC-JP", "2000-01-01 08:12:21 AM", "%Y-%m-%d %I:%M:%S %p",
6, 0, 0, 1 },
{ "en_US.ISO-8859-1", "2000-01-01 08:12:21 PM", "%Y-%m-%d %I:%M:%S %p",
6, 0, 0, 1 },
{ "ja_JP.EUC-JP", "2001 20 \xb7\xee", "%Y %U %a", 1, 140, 4, 21 },
{ "ja_JP.EUC-JP", "2001 21 \xb7\xee", "%Y %W %a", 1, 140, 4, 21 },
};
@ -73,7 +77,14 @@ test_tm (void)
{
memset (&tm, '\0', sizeof (tm));
if (*strptime (tm_tests[i].input, tm_tests[i].format, &tm) != '\0')
char *ret = strptime (tm_tests[i].input, tm_tests[i].format, &tm);
if (ret == NULL)
{
printf ("strptime returned NULL for `%s'\n", tm_tests[i].input);
result = 1;
continue;
}
else if (*ret != '\0')
{
printf ("not all of `%s' read\n", tm_tests[i].input);
result = 1;
@ -127,7 +138,14 @@ main (int argc, char *argv[])
exit (EXIT_FAILURE);
}
if (*strptime (day_tests[i].input, day_tests[i].format, &tm) != '\0')
char *ret = strptime (day_tests[i].input, day_tests[i].format, &tm);
if (ret == NULL)
{
printf ("strptime returned NULL for `%s'\n", day_tests[i].input);
result = 1;
continue;
}
else if (*ret != '\0')
{
printf ("not all of `%s' read\n", day_tests[i].input);
result = 1;