This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
alpha plt trampoline update
- From: Richard Henderson <rth at twiddle dot net>
- To: libc-alpha at sources dot redhat dot com
- Date: Sun, 23 Jan 2005 00:04:29 -0800
- Subject: alpha plt trampoline update
Tested and committed.
I notice there's no test for the _dl_call_pltexit path?
r~
* 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.
Index: sysdeps/alpha/dl-trampoline.S
===================================================================
RCS file: sysdeps/alpha/dl-trampoline.S
diff -N sysdeps/alpha/dl-trampoline.S
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- sysdeps/alpha/dl-trampoline.S 23 Jan 2005 07:58:30 -0000
***************
*** 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
Index: sysdeps/alpha/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/alpha/dl-machine.h,v
retrieving revision 1.78
diff -c -p -d -r1.78 dl-machine.h
*** sysdeps/alpha/dl-machine.h 15 Oct 2004 07:06:11 -0000 1.78
--- sysdeps/alpha/dl-machine.h 23 Jan 2005 07:58:31 -0000
*************** elf_machine_runtime_setup (struct link_m
*** 108,126 ****
plt = D_PTR (l, l_info[DT_PLTGOT]);
/* This function will be called to perform the relocation. */
! if (!profile)
! *(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_resolve;
! else
{
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_profile;
! if (_dl_name_match_p (GLRO(dl_profile), l))
{
/* This is the object we are looking for. Say that we really
want profiling and the timers are started. */
GL(dl_profile_map) = l;
}
}
/* Identify this shared object */
*(Elf64_Addr *)(plt + 24) = (Elf64_Addr) l;
--- 108,127 ----
plt = D_PTR (l, l_info[DT_PLTGOT]);
/* This function will be called to perform the relocation. */
! if (__builtin_expect (profile, 0))
{
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_profile;
! 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
want profiling and the timers are started. */
GL(dl_profile_map) = l;
}
}
+ else
+ *(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_resolve;
/* Identify this shared object */
*(Elf64_Addr *)(plt + 24) = (Elf64_Addr) l;
*************** elf_machine_runtime_setup (struct link_m
*** 156,298 ****
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.
The C function `_dl_start' is the real entry point;
its return value is the user program's entry point. */
--- 157,162 ----
*************** elf_machine_plt_value (struct link_map *
*** 501,509 ****
return value + reloc->r_addend;
}
#endif /* !dl_machine_h */
! #ifdef RESOLVE
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
MAP is the object containing the reloc. */
--- 365,377 ----
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 */
! #ifdef RESOLVE_MAP
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
MAP is the object containing the reloc. */
*************** elf_machine_lazy_rel (struct link_map *m
*** 680,683 ****
_dl_reloc_bad_type (map, r_type, 1);
}
! #endif /* RESOLVE */
--- 548,551 ----
_dl_reloc_bad_type (map, r_type, 1);
}
! #endif /* RESOLVE_MAP */
Index: sysdeps/alpha/bits/link.h
===================================================================
RCS file: sysdeps/alpha/bits/link.h
diff -N sysdeps/alpha/bits/link.h
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- sysdeps/alpha/bits/link.h 23 Jan 2005 07:58:31 -0000
***************
*** 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
Index: sysdeps/generic/ldsodefs.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/generic/ldsodefs.h,v
retrieving revision 1.112
diff -c -p -d -r1.112 ldsodefs.h
*** sysdeps/generic/ldsodefs.h 16 Jan 2005 02:07:29 -0000 1.112
--- sysdeps/generic/ldsodefs.h 23 Jan 2005 07:58:31 -0000
*************** struct La_sh_regs;
*** 187,193 ****
struct La_sh_retval;
struct La_m68k_regs;
struct La_m68k_retval;
!
struct audit_ifaces
{
--- 187,194 ----
struct La_sh_retval;
struct La_m68k_regs;
struct La_m68k_retval;
! struct La_alpha_regs;
! struct La_alpha_retval;
struct audit_ifaces
{
*************** struct audit_ifaces
*** 228,233 ****
--- 229,238 ----
uintptr_t *, struct La_m68k_regs *,
unsigned int *, const char *name,
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
{
*************** struct audit_ifaces
*** 253,258 ****
--- 258,267 ----
unsigned int (*m68k_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *,
uintptr_t *, const struct La_m68k_regs *,
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 *);
Index: elf/tst-auditmod1.c
===================================================================
RCS file: /cvs/glibc/libc/elf/tst-auditmod1.c,v
retrieving revision 1.7
diff -c -p -d -r1.7 tst-auditmod1.c
*** elf/tst-auditmod1.c 16 Jan 2005 06:24:59 -0000 1.7
--- elf/tst-auditmod1.c 23 Jan 2005 07:58:31 -0000
*************** la_symbind64 (Elf64_Sym *sym, unsigned i
*** 138,143 ****
--- 138,149 ----
# define La_regs La_m68k_regs
# define La_retval La_m68k_retval
# 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
# error "architecture specific code needed"
#endif