glibc/sysdeps/powerpc/ldsodefs.h
Ulrich Weigand 61cd8fe401 PowerPC64 ELFv2 ABI 5/6: LD_AUDIT interface changes
The ELFv2 ABI changes the calling convention by passing and returning
structures in registers in more cases than the old ABI:
http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01145.html
http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01147.html

For the most part, this does not affect glibc, since glibc assembler
files do not use structure parameters / return values.  However, one
place is affected: the LD_AUDIT interface provides a structure to
the audit routine that contains all registers holding function
argument and return values for the intercepted PLT call.

Since the new ABI now sometimes uses registers to return values
that were never used for this purpose in the old ABI, this structure
has to be extended.  To force audit routines to be modified for the
new ABI if necessary, the patch defines v2 variants of the la_ppc64
types and routines.

In addition, the patch contains two unrelated changes to the
PLT trampoline routines: it fixes a bug where FPR return values
were stored in the wrong place, and it removes the unnecessary
save/restore of CR.
2013-12-04 07:41:39 -06:00

69 lines
2.4 KiB
C

/* Run-time dynamic linker data structures for loaded ELF shared objects.
Copyright (C) 1995-2013 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, see
<http://www.gnu.org/licenses/>. */
#ifndef _POWERPC_LDSODEFS_H
#define _POWERPC_LDSODEFS_H 1
#include <elf.h>
struct La_ppc32_regs;
struct La_ppc32_retval;
struct La_ppc64_regs;
struct La_ppc64_retval;
struct La_ppc64v2_regs;
struct La_ppc64v2_retval;
#define ARCH_PLTENTER_MEMBERS \
Elf32_Addr (*ppc32_gnu_pltenter) (Elf32_Sym *, unsigned int, uintptr_t *, \
uintptr_t *, struct La_ppc32_regs *, \
unsigned int *, const char *name, \
long int *framesizep); \
Elf64_Addr (*ppc64_gnu_pltenter) (Elf64_Sym *, unsigned int, uintptr_t *, \
uintptr_t *, struct La_ppc64_regs *, \
unsigned int *, const char *name, \
long int *framesizep); \
Elf64_Addr (*ppc64v2_gnu_pltenter) (Elf64_Sym *, unsigned int, \
uintptr_t *, uintptr_t *, \
struct La_ppc64v2_regs *, \
unsigned int *, const char *name, \
long int *framesizep)
#define ARCH_PLTEXIT_MEMBERS \
unsigned int (*ppc32_gnu_pltexit) (Elf32_Sym *, unsigned int, \
uintptr_t *, \
uintptr_t *, \
const struct La_ppc32_regs *, \
struct La_ppc32_retval *, \
const char *); \
unsigned int (*ppc64_gnu_pltexit) (Elf64_Sym *, unsigned int, \
uintptr_t *, \
uintptr_t *, \
const struct La_ppc64_regs *, \
struct La_ppc64_retval *, \
const char *); \
unsigned int (*ppc64v2_gnu_pltexit) (Elf64_Sym *, unsigned int, \
uintptr_t *, \
uintptr_t *, \
const struct La_ppc64v2_regs *,\
struct La_ppc64v2_retval *, \
const char *)
#include_next <ldsodefs.h>
#endif