* sysdeps/alpha/dl-trampoline.S: New file. * sysdeps/alpha/dl-machine.h: Move PLT trampolines there. Use RESOLVE_MAP instead of RESOLVE to protect relocation code. (elf_machine_runtime_setup): Test for dl_profile non-null. (ARCH_LA_PLTENTER, ARCH_LA_PLTEXIT): New. * sysdeps/alpha/bits/link.h: New file. * sysdeps/generic/ldsodefs.h (La_alpha_regs, La_alpha_retval): New. (struct audit_ifaces): Add alpha entries. * elf/tst-auditmod1.c: Add alpha entries.

2005-01-22  Richard Henderson  <rth@redhat.com>

	* sysdeps/alpha/dl-trampoline.S: New file.
	* sysdeps/alpha/dl-machine.h: Move PLT trampolines there.
	Use RESOLVE_MAP instead of RESOLVE to protect relocation code.
	(elf_machine_runtime_setup): Test for dl_profile non-null.
	(ARCH_LA_PLTENTER, ARCH_LA_PLTEXIT): New.
	* sysdeps/alpha/bits/link.h: New file.
	* sysdeps/generic/ldsodefs.h (La_alpha_regs, La_alpha_retval): New.
	(struct audit_ifaces): Add alpha entries.
	* elf/tst-auditmod1.c: Add alpha entries.
This commit is contained in:
Richard Henderson 2005-01-23 08:02:45 +00:00
parent 4bf1073d85
commit 57c6c64a3b
6 changed files with 469 additions and 144 deletions

View File

@ -1,3 +1,15 @@
2005-01-22 Richard Henderson <rth@redhat.com>
* sysdeps/alpha/dl-trampoline.S: New file.
* sysdeps/alpha/dl-machine.h: Move PLT trampolines there.
Use RESOLVE_MAP instead of RESOLVE to protect relocation code.
(elf_machine_runtime_setup): Test for dl_profile non-null.
(ARCH_LA_PLTENTER, ARCH_LA_PLTEXIT): New.
* sysdeps/alpha/bits/link.h: New file.
* sysdeps/generic/ldsodefs.h (La_alpha_regs, La_alpha_retval): New.
(struct audit_ifaces): Add alpha entries.
* elf/tst-auditmod1.c: Add alpha entries.
2005-01-22 Ulrich Drepper <drepper@redhat.com> 2005-01-22 Ulrich Drepper <drepper@redhat.com>
* sysdeps/ia64/dl-machine.h: Remove PLT trampolines here. * sysdeps/ia64/dl-machine.h: Remove PLT trampolines here.

View File

@ -138,6 +138,12 @@ la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
# define La_regs La_m68k_regs # define La_regs La_m68k_regs
# define La_retval La_m68k_retval # define La_retval La_m68k_retval
# define int_retval lrv_d0 # define int_retval lrv_d0
#elif defined __alpha__
# define pltenter la_alpha_gnu_pltenter
# define pltexit la_alpha_gnu_pltexit
# define La_regs La_alpha_regs
# define La_retval La_alpha_retval
# define int_retval lrv_r0
#else #else
# error "architecture specific code needed" # error "architecture specific code needed"
#endif #endif

69
sysdeps/alpha/bits/link.h Normal file
View File

@ -0,0 +1,69 @@
/* 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 Alpha. */
typedef struct La_alpha_regs
{
uint64_t lr_r26;
uint64_t lr_sp;
uint64_t lr_r16;
uint64_t lr_r17;
uint64_t lr_r18;
uint64_t lr_r19;
uint64_t lr_r20;
uint64_t lr_r21;
double lr_f16;
double lr_f17;
double lr_f18;
double lr_f19;
double lr_f20;
double lr_f21;
} La_alpha_regs;
/* Return values for calls from PLT on Alpha. */
typedef struct La_alpha_retval
{
uint64_t lrv_r0;
uint64_t lrv_r1;
double lrv_f0;
double lrv_f1;
} La_alpha_retval;
__BEGIN_DECLS
extern Elf64_Addr la_alpha_gnu_pltenter (Elf64_Sym *__sym, unsigned int __ndx,
uintptr_t *__refcook,
uintptr_t *__defcook,
La_alpha_regs *__regs,
unsigned int *__flags,
const char *__symname,
long int *__framesizep);
extern unsigned int la_alpha_gnu_pltexit (Elf64_Sym *__sym, unsigned int __ndx,
uintptr_t *__refcook,
uintptr_t *__defcook,
const La_alpha_regs *__inregs,
La_alpha_retval *__outregs,
const char *symname);
__END_DECLS

View File

@ -108,19 +108,20 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
plt = D_PTR (l, l_info[DT_PLTGOT]); plt = D_PTR (l, l_info[DT_PLTGOT]);
/* This function will be called to perform the relocation. */ /* This function will be called to perform the relocation. */
if (!profile) if (__builtin_expect (profile, 0))
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_resolve;
else
{ {
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_profile; *(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_profile;
if (_dl_name_match_p (GLRO(dl_profile), l)) if (GLRO(dl_profile) != NULL
&& _dl_name_match_p (GLRO(dl_profile), l))
{ {
/* This is the object we are looking for. Say that we really /* This is the object we are looking for. Say that we really
want profiling and the timers are started. */ want profiling and the timers are started. */
GL(dl_profile_map) = l; GL(dl_profile_map) = l;
} }
} }
else
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_resolve;
/* Identify this shared object */ /* Identify this shared object */
*(Elf64_Addr *)(plt + 24) = (Elf64_Addr) l; *(Elf64_Addr *)(plt + 24) = (Elf64_Addr) l;
@ -156,143 +157,6 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
return lazy; return lazy;
} }
/* This code is used in dl-runtime.c to call the `fixup' function
and then redirect to the address it returns. */
#define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name, IMB) \
extern void tramp_name (void); \
asm ( "\
.globl " #tramp_name " \n\
.ent " #tramp_name " \n\
" #tramp_name ": \n\
lda $sp, -44*8($sp) \n\
.frame $sp, 44*8, $26 \n\
/* Preserve all integer registers that C normally \n\
doesn't. */ \n\
stq $26, 0*8($sp) \n\
stq $0, 1*8($sp) \n\
stq $1, 2*8($sp) \n\
stq $2, 3*8($sp) \n\
stq $3, 4*8($sp) \n\
stq $4, 5*8($sp) \n\
stq $5, 6*8($sp) \n\
stq $6, 7*8($sp) \n\
stq $7, 8*8($sp) \n\
stq $8, 9*8($sp) \n\
stq $16, 10*8($sp) \n\
stq $17, 11*8($sp) \n\
stq $18, 12*8($sp) \n\
stq $19, 13*8($sp) \n\
stq $20, 14*8($sp) \n\
stq $21, 15*8($sp) \n\
stq $22, 16*8($sp) \n\
stq $23, 17*8($sp) \n\
stq $24, 18*8($sp) \n\
stq $25, 19*8($sp) \n\
stq $29, 20*8($sp) \n\
stt $f0, 21*8($sp) \n\
stt $f1, 22*8($sp) \n\
stt $f10, 23*8($sp) \n\
stt $f11, 24*8($sp) \n\
stt $f12, 25*8($sp) \n\
stt $f13, 26*8($sp) \n\
stt $f14, 27*8($sp) \n\
stt $f15, 28*8($sp) \n\
stt $f16, 29*8($sp) \n\
stt $f17, 30*8($sp) \n\
stt $f18, 31*8($sp) \n\
stt $f19, 32*8($sp) \n\
stt $f20, 33*8($sp) \n\
stt $f21, 34*8($sp) \n\
stt $f22, 35*8($sp) \n\
stt $f23, 36*8($sp) \n\
stt $f24, 37*8($sp) \n\
stt $f25, 38*8($sp) \n\
stt $f26, 39*8($sp) \n\
stt $f27, 40*8($sp) \n\
stt $f28, 41*8($sp) \n\
stt $f29, 42*8($sp) \n\
stt $f30, 43*8($sp) \n\
.mask 0x27ff01ff, -44*8 \n\
.fmask 0xfffffc03, -(44-21)*8 \n\
/* Set up our $gp */ \n\
br $gp, .+4 \n\
ldgp $gp, 0($gp) \n\
.prologue 0 \n\
/* Set up the arguments for fixup: */ \n\
/* $16 = link_map out of plt0 */ \n\
/* $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24 */\n\
/* $18 = return address */ \n\
subq $28, $27, $17 \n\
ldq $16, 8($27) \n\
subq $17, 20, $17 \n\
mov $26, $18 \n\
addq $17, $17, $17 \n\
/* Do the fixup */ \n\
bsr $26, " #fixup_name " !samegp \n\
/* Move the destination address into position. */ \n\
mov $0, $27 \n\
/* Restore program registers. */ \n\
ldq $26, 0*8($sp) \n\
ldq $0, 1*8($sp) \n\
ldq $1, 2*8($sp) \n\
ldq $2, 3*8($sp) \n\
ldq $3, 4*8($sp) \n\
ldq $4, 5*8($sp) \n\
ldq $5, 6*8($sp) \n\
ldq $6, 7*8($sp) \n\
ldq $7, 8*8($sp) \n\
ldq $8, 9*8($sp) \n\
ldq $16, 10*8($sp) \n\
ldq $17, 11*8($sp) \n\
ldq $18, 12*8($sp) \n\
ldq $19, 13*8($sp) \n\
ldq $20, 14*8($sp) \n\
ldq $21, 15*8($sp) \n\
ldq $22, 16*8($sp) \n\
ldq $23, 17*8($sp) \n\
ldq $24, 18*8($sp) \n\
ldq $25, 19*8($sp) \n\
ldq $29, 20*8($sp) \n\
ldt $f0, 21*8($sp) \n\
ldt $f1, 22*8($sp) \n\
ldt $f10, 23*8($sp) \n\
ldt $f11, 24*8($sp) \n\
ldt $f12, 25*8($sp) \n\
ldt $f13, 26*8($sp) \n\
ldt $f14, 27*8($sp) \n\
ldt $f15, 28*8($sp) \n\
ldt $f16, 29*8($sp) \n\
ldt $f17, 30*8($sp) \n\
ldt $f18, 31*8($sp) \n\
ldt $f19, 32*8($sp) \n\
ldt $f20, 33*8($sp) \n\
ldt $f21, 34*8($sp) \n\
ldt $f22, 35*8($sp) \n\
ldt $f23, 36*8($sp) \n\
ldt $f24, 37*8($sp) \n\
ldt $f25, 38*8($sp) \n\
ldt $f26, 39*8($sp) \n\
ldt $f27, 40*8($sp) \n\
ldt $f28, 41*8($sp) \n\
ldt $f29, 42*8($sp) \n\
ldt $f30, 43*8($sp) \n\
/* Flush the Icache after having modified the .plt code. */\n\
" #IMB " \n\
/* Clean up and turn control to the destination */ \n\
lda $sp, 44*8($sp) \n\
jmp $31, ($27) \n\
.end " #tramp_name)
#ifndef PROF
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup, imb); \
TRAMPOLINE_TEMPLATE (_dl_runtime_profile, profile_fixup, /* nop */);
#else
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup, imb); \
strong_alias (_dl_runtime_resolve, _dl_runtime_profile);
#endif
/* Initial entry point code for the dynamic linker. /* Initial entry point code for the dynamic linker.
The C function `_dl_start' is the real entry point; The C function `_dl_start' is the real entry point;
its return value is the user program's entry point. */ its return value is the user program's entry point. */
@ -501,9 +365,13 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
return value + reloc->r_addend; return value + reloc->r_addend;
} }
/* Names of the architecture-specific auditing callback functions. */
#define ARCH_LA_PLTENTER alpha_gnu_pltenter
#define ARCH_LA_PLTEXIT alpha_gnu_pltexit
#endif /* !dl_machine_h */ #endif /* !dl_machine_h */
#ifdef RESOLVE #ifdef RESOLVE_MAP
/* Perform the relocation specified by RELOC and SYM (which is fully resolved). /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
MAP is the object containing the reloc. */ MAP is the object containing the reloc. */
@ -680,4 +548,4 @@ elf_machine_lazy_rel (struct link_map *map,
_dl_reloc_bad_type (map, r_type, 1); _dl_reloc_bad_type (map, r_type, 1);
} }
#endif /* RESOLVE */ #endif /* RESOLVE_MAP */

View File

@ -0,0 +1,361 @@
/* PLT trampolines. Alpha 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>
.set noat
.globl _dl_runtime_resolve
.ent _dl_runtime_resolve
#undef FRAMESIZE
#define FRAMESIZE 44*8
_dl_runtime_resolve:
lda $30, -FRAMESIZE($30)
.frame $30, FRAMESIZE, $26
/* Preserve all registers that C normally doesn't. */
stq $26, 0*8($30)
stq $0, 1*8($30)
stq $1, 2*8($30)
stq $2, 3*8($30)
stq $3, 4*8($30)
stq $4, 5*8($30)
stq $5, 6*8($30)
stq $6, 7*8($30)
stq $7, 8*8($30)
stq $8, 9*8($30)
stq $16, 10*8($30)
stq $17, 11*8($30)
stq $18, 12*8($30)
stq $19, 13*8($30)
stq $20, 14*8($30)
stq $21, 15*8($30)
stq $22, 16*8($30)
stq $23, 17*8($30)
stq $24, 18*8($30)
stq $25, 19*8($30)
stq $29, 20*8($30)
stt $f0, 21*8($30)
stt $f1, 22*8($30)
stt $f10, 23*8($30)
stt $f11, 24*8($30)
stt $f12, 25*8($30)
stt $f13, 26*8($30)
stt $f14, 27*8($30)
stt $f15, 28*8($30)
stt $f16, 29*8($30)
stt $f17, 30*8($30)
stt $f18, 31*8($30)
stt $f19, 32*8($30)
stt $f20, 33*8($30)
stt $f21, 34*8($30)
stt $f22, 35*8($30)
stt $f23, 36*8($30)
stt $f24, 37*8($30)
stt $f25, 38*8($30)
stt $f26, 39*8($30)
stt $f27, 40*8($30)
stt $f28, 41*8($30)
stt $f29, 42*8($30)
stt $f30, 43*8($30)
.mask 0x27ff01ff, -FRAMESIZE
.fmask 0xfffffc03, -FRAMESIZE+21*8
/* Set up our GP. */
br $29, .+4
ldgp $29, 0($29)
.prologue 0
/* Set up the arguments for _dl_fixup:
$16 = link_map out of plt0
$17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24
$18 = return address
*/
subq $28, $27, $17
ldq $16, 8($27)
subq $17, 20, $17
mov $26, $18
addq $17, $17, $17
bsr $26, _dl_fixup !samegp
/* Move the destination address into position. */
mov $0, $27
/* Restore program registers. */
ldq $26, 0*8($30)
ldq $0, 1*8($30)
ldq $1, 2*8($30)
ldq $2, 3*8($30)
ldq $3, 4*8($30)
ldq $4, 5*8($30)
ldq $5, 6*8($30)
ldq $6, 7*8($30)
ldq $7, 8*8($30)
ldq $8, 9*8($30)
ldq $16, 10*8($30)
ldq $17, 11*8($30)
ldq $18, 12*8($30)
ldq $19, 13*8($30)
ldq $20, 14*8($30)
ldq $21, 15*8($30)
ldq $22, 16*8($30)
ldq $23, 17*8($30)
ldq $24, 18*8($30)
ldq $25, 19*8($30)
ldq $29, 20*8($30)
ldt $f0, 21*8($30)
ldt $f1, 22*8($30)
ldt $f10, 23*8($30)
ldt $f11, 24*8($30)
ldt $f12, 25*8($30)
ldt $f13, 26*8($30)
ldt $f14, 27*8($30)
ldt $f15, 28*8($30)
ldt $f16, 29*8($30)
ldt $f17, 30*8($30)
ldt $f18, 31*8($30)
ldt $f19, 32*8($30)
ldt $f20, 33*8($30)
ldt $f21, 34*8($30)
ldt $f22, 35*8($30)
ldt $f23, 36*8($30)
ldt $f24, 37*8($30)
ldt $f25, 38*8($30)
ldt $f26, 39*8($30)
ldt $f27, 40*8($30)
ldt $f28, 41*8($30)
ldt $f29, 42*8($30)
ldt $f30, 43*8($30)
/* Flush the Icache after having modified the .plt code. */
imb
/* Clean up and turn control to the destination */
lda $30, FRAMESIZE($30)
jmp $31, ($27)
.end _dl_runtime_resolve
.globl _dl_runtime_profile
.usepv _dl_runtime_profile, no
.type _dl_runtime_profile, @function
/* We save the registers in a different order than desired by
.mask/.fmask, so we have to use explicit cfi directives. */
cfi_startproc
.macro savei regno, offset
stq $\regno, \offset($30)
cfi_rel_offset(\regno, \offset)
.endm
.macro savef regno, offset
stt $f\regno, \offset($30)
cfi_rel_offset(\regno+32, \offset)
.endm
#undef FRAMESIZE
#define FRAMESIZE 50*8
_dl_runtime_profile:
lda $30, -FRAMESIZE($30)
cfi_adjust_cfa_offset (FRAMESIZE)
/* Preserve all argument registers. This also constructs the
La_alpha_regs structure. */
savei 26, 0*8
savei 16, 2*8
savei 17, 3*8
savei 18, 4*8
savei 19, 5*8
savei 20, 6*8
savei 21, 7*8
lda $16, FRAMESIZE($30)
savef 16, 8*8
savef 17, 9*8
savef 18, 10*8
savef 19, 11*8
savef 20, 12*8
savef 21, 13*8
stq $16, 1*8($30)
/* Preserve all registers that C normally doesn't. */
savei 0, 14*8
savei 1, 15*8
savei 2, 16*8
savei 3, 17*8
savei 4, 18*8
savei 5, 19*8
savei 6, 20*8
savei 7, 21*8
savei 8, 22*8
savei 22, 23*8
savei 23, 24*8
savei 24, 25*8
savei 25, 26*8
savei 29, 27*8
savef 0, 28*8
savef 1, 29*8
savef 10, 30*8
savef 11, 31*8
savef 12, 32*8
savef 13, 33*8
savef 14, 34*8
savef 15, 35*8
savef 22, 36*8
savef 23, 37*8
savef 24, 38*8
savef 25, 39*8
savef 26, 40*8
savef 27, 41*8
savef 28, 42*8
savef 29, 43*8
savef 30, 44*8
/* Set up our GP. */
br $29, .+4
ldgp $29, 0($29)
/* Set up the arguments for _dl_profile_fixup:
$16 = link_map out of plt0
$17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24
$18 = return address
$19 = La_alpha_regs address
$20 = framesize address
*/
subq $28, $27, $17
ldq $16, 8($27)
subq $17, 20, $17
mov $26, $18
addq $17, $17, $17
lda $19, 0($30)
lda $20, 45*8($30)
stq $16, 48*8($30)
stq $17, 49*8($30)
bsr $26, _dl_profile_fixup !samegp
/* Discover if we're wrapping this call. */
ldq $18, 45*8($30)
bge $18, 1f
/* Move the destination address into position. */
mov $0, $27
/* Restore program registers. */
ldq $26, 0*8($30)
ldq $16, 2*8($30)
ldq $17, 3*8($30)
ldq $18, 4*8($30)
ldq $19, 5*8($30)
ldq $20, 6*8($30)
ldq $21, 7*8($30)
ldt $f16, 8*8($30)
ldt $f17, 9*8($30)
ldt $f18, 10*8($30)
ldt $f19, 11*8($30)
ldt $f20, 12*8($30)
ldt $f21, 13*8($30)
ldq $0, 14*8($30)
ldq $1, 15*8($30)
ldq $2, 16*8($30)
ldq $3, 17*8($30)
ldq $4, 18*8($30)
ldq $5, 19*8($30)
ldq $6, 20*8($30)
ldq $7, 21*8($30)
ldq $8, 22*8($30)
ldq $22, 23*8($30)
ldq $23, 24*8($30)
ldq $24, 25*8($30)
ldq $25, 26*8($30)
ldq $29, 27*8($30)
ldt $f0, 28*8($30)
ldt $f1, 29*8($30)
ldt $f10, 30*8($30)
ldt $f11, 31*8($30)
ldt $f12, 32*8($30)
ldt $f13, 33*8($30)
ldt $f14, 34*8($30)
ldt $f15, 35*8($30)
ldt $f22, 36*8($30)
ldt $f23, 37*8($30)
ldt $f24, 38*8($30)
ldt $f25, 39*8($30)
ldt $f26, 40*8($30)
ldt $f27, 41*8($30)
ldt $f28, 42*8($30)
ldt $f29, 43*8($30)
ldt $f30, 44*8($30)
/* Clean up and turn control to the destination. */
lda $30, FRAMESIZE($30)
jmp $31, ($27)
1:
/* Create a frame pointer and allocate a new argument frame. */
savei 15, 45*8
mov $30, $15
cfi_def_cfa_register (15)
addq $18, 15, $18
bic $18, 15, $18
subq $30, $18, $30
/* Save the call destination around memcpy. */
stq $0, 46*8($30)
/* Copy the stack arguments into place. */
lda $16, 0($30)
lda $17, FRAMESIZE($15)
jsr $26, memcpy
ldgp $29, 0($26)
/* Reload the argument registers. */
ldq $27, 46*8($30)
ldq $16, 2*8($15)
ldq $17, 3*8($15)
ldq $18, 4*8($15)
ldq $19, 5*8($15)
ldq $20, 6*8($15)
ldq $21, 7*8($15)
ldt $f16, 8*8($15)
ldt $f17, 9*8($15)
ldt $f18, 10*8($15)
ldt $f19, 11*8($15)
ldt $f20, 12*8($15)
ldt $f21, 13*8($15)
jsr $26, ($27), 0
ldgp $29, 0($26)
/* Set up for call to _dl_call_pltexit. */
ldq $16, 48($15)
ldq $17, 49($15)
stq $0, 46*8($15)
lda $18, 0($15)
stq $1, 47*8($15)
lda $19, 46*8($15)
stt $f0, 48*8($15)
stt $f1, 49*8($15)
bsr $26, _dl_call_pltexit !samegp
mov $15, $30
cfi_def_cfa_register (30)
ldq $26, 0($30)
ldq $15, 45*8($30)
lda $30, FRAMESIZE($30)
ret
cfi_endproc
.size _dl_runtime_profile, .-_dl_runtime_profile

View File

@ -187,7 +187,8 @@ struct La_sh_regs;
struct La_sh_retval; struct La_sh_retval;
struct La_m68k_regs; struct La_m68k_regs;
struct La_m68k_retval; struct La_m68k_retval;
struct La_alpha_regs;
struct La_alpha_retval;
struct audit_ifaces struct audit_ifaces
{ {
@ -228,6 +229,10 @@ struct audit_ifaces
uintptr_t *, struct La_m68k_regs *, uintptr_t *, struct La_m68k_regs *,
unsigned int *, const char *name, unsigned int *, const char *name,
long int *framesizep); long int *framesizep);
Elf64_Addr (*alpha_gnu_pltenter) (Elf64_Sym *, unsigned int, uintptr_t *,
uintptr_t *, struct La_alpha_regs *,
unsigned int *, const char *name,
long int *framesizep);
}; };
union union
{ {
@ -253,6 +258,10 @@ struct audit_ifaces
unsigned int (*m68k_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *, unsigned int (*m68k_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *,
uintptr_t *, const struct La_m68k_regs *, uintptr_t *, const struct La_m68k_regs *,
struct La_m68k_retval *, const char *); struct La_m68k_retval *, const char *);
unsigned int (*alpha_gnu_pltexit) (Elf64_Sym *, unsigned int, uintptr_t *,
uintptr_t *,
const struct La_alpha_regs *,
struct La_alpha_retval *, const char *);
}; };
unsigned int (*objclose) (uintptr_t *); unsigned int (*objclose) (uintptr_t *);