c5d972
commit 8c0664e2b861fd3789602cc0b0b1922b0e20cb3a
c5d972
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
c5d972
Date:   Thu Jul 22 18:02:42 2021 -0300
c5d972
c5d972
    elf: Add _dl_audit_pltexit
c5d972
    
c5d972
    It consolidates the code required to call la_pltexit audit
c5d972
    callback.
c5d972
    
c5d972
    Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
c5d972
    
c5d972
    Reviewed-by: Florian Weimer <fweimer@redhat.com>
c5d972
c5d972
Conflicts:
c5d972
	nptl/tst-atfork4mod.c
c5d972
	sysdeps/powerpc/fpu/s_fmaf.S
c5d972
	sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-ppc32.c
c5d972
	sysdeps/powerpc/powerpc64/power5+/fpu/s_floor.S
c5d972
		Without d6d89608ac8cf2b37c75debad1fff653f6939f90 we
c5d972
		don't have dl-machine-rel.h so git picks a match for
c5d972
		all four files above, instead we modify dl-machine.h
c5d972
		for the targets:
c5d972
			sysdeps/i386/dl-machine.h
c5d972
			sysdeps/arm/dl-machine.h
c5d972
			sysdeps/mips/dl-machine.h
c5d972
		The fourth is the generic file and without it we
c5d972
		add the PLTREL macro to each target:
c5d972
			sysdeps/aarch64/dl-machine.h
c5d972
			sysdeps/powerpc/powerpc32/dl-machine.h
c5d972
			sysdeps/powerpc/powerpc64/dl-machine.h
c5d972
			sysdeps/s390/s390-32/dl-machine.h
c5d972
			sysdeps/s390/s390-64/dl-machine.h
c5d972
			sysdeps/x86_64/dl-machine.h
c5d972
	sysdeps/s390/s390-32/dl-trampoline.h
c5d972
	sysdeps/s390/s390-64/dl-trampoline.h
c5d972
c5d972
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
c5d972
index 15250c67e8ac1658..152712b12fed6de2 100644
c5d972
--- a/elf/dl-audit.c
c5d972
+++ b/elf/dl-audit.c
c5d972
@@ -20,6 +20,8 @@
c5d972
 #include <link.h>
c5d972
 #include <ldsodefs.h>
c5d972
 #include <dl-machine.h>
c5d972
+#include <dl-runtime.h>
c5d972
+#include <dl-fixup-attribute.h>
c5d972
 
c5d972
 void
c5d972
 _dl_audit_activity_map (struct link_map *l, int action)
c5d972
@@ -320,3 +322,48 @@ _dl_audit_pltenter (struct link_map *l, struct reloc_result *reloc_result,
c5d972
 
c5d972
   *value = DL_FIXUP_ADDR_VALUE (sym.st_value);
c5d972
 }
c5d972
+
c5d972
+void
c5d972
+DL_ARCH_FIXUP_ATTRIBUTE
c5d972
+_dl_audit_pltexit (struct link_map *l, ElfW(Word) reloc_arg,
c5d972
+		   const void *inregs, void *outregs)
c5d972
+{
c5d972
+  const uintptr_t pltgot = (uintptr_t) D_PTR (l, l_info[DT_PLTGOT]);
c5d972
+
c5d972
+  /* This is the address in the array where we store the result of previous
c5d972
+     relocations.  */
c5d972
+  // XXX Maybe the bound information must be stored on the stack since
c5d972
+  // XXX with bind_not a new value could have been stored in the meantime.
c5d972
+  struct reloc_result *reloc_result =
c5d972
+    &l->l_reloc_result[reloc_index (pltgot, reloc_arg, sizeof (PLTREL))];
c5d972
+  ElfW(Sym) *defsym = ((ElfW(Sym) *) D_PTR (reloc_result->bound,
c5d972
+					    l_info[DT_SYMTAB])
c5d972
+		       + reloc_result->boundndx);
c5d972
+
c5d972
+  /* Set up the sym parameter.  */
c5d972
+  ElfW(Sym) sym = *defsym;
c5d972
+  sym.st_value = DL_FIXUP_VALUE_ADDR (reloc_result->addr);
c5d972
+
c5d972
+  /* Get the symbol name.  */
c5d972
+  const char *strtab = (const void *) D_PTR (reloc_result->bound,
c5d972
+					     l_info[DT_STRTAB]);
c5d972
+  const char *symname = strtab + sym.st_name;
c5d972
+
c5d972
+  struct audit_ifaces *afct = GLRO(dl_audit);
c5d972
+  for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
c5d972
+    {
c5d972
+      if (afct->ARCH_LA_PLTEXIT != NULL
c5d972
+	  && (reloc_result->enterexit
c5d972
+	      & (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0)
c5d972
+	{
c5d972
+	  struct auditstate *l_state = link_map_audit_state (l, cnt);
c5d972
+	  struct auditstate *bound_state
c5d972
+	    = link_map_audit_state (reloc_result->bound, cnt);
c5d972
+	  afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx,
c5d972
+				 &l_state->cookie, &bound_state->cookie,
c5d972
+				 inregs, outregs, symname);
c5d972
+	}
c5d972
+
c5d972
+      afct = afct->next;
c5d972
+    }
c5d972
+}
c5d972
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
c5d972
index b46f7d7376e65361..ec0b2164825fa538 100644
c5d972
--- a/elf/dl-runtime.c
c5d972
+++ b/elf/dl-runtime.c
c5d972
@@ -16,8 +16,6 @@
c5d972
    License along with the GNU C Library; if not, see
c5d972
    <http://www.gnu.org/licenses/>.  */
c5d972
 
c5d972
-#define IN_DL_RUNTIME 1		/* This can be tested in dl-machine.h.  */
c5d972
-
c5d972
 #include <alloca.h>
c5d972
 #include <stdlib.h>
c5d972
 #include <unistd.h>
c5d972
@@ -30,19 +28,6 @@
c5d972
 #include <dl-runtime.h>
c5d972
 
c5d972
 
c5d972
-#if (!ELF_MACHINE_NO_RELA && !defined ELF_MACHINE_PLT_REL) \
c5d972
-    || ELF_MACHINE_NO_REL
c5d972
-# define PLTREL  ElfW(Rela)
c5d972
-#else
c5d972
-# define PLTREL  ElfW(Rel)
c5d972
-#endif
c5d972
-
c5d972
-/* The fixup functions might have need special attributes.  If none
c5d972
-   are provided define the macro as empty.  */
c5d972
-#ifndef ARCH_FIXUP_ATTRIBUTE
c5d972
-# define ARCH_FIXUP_ATTRIBUTE
c5d972
-#endif
c5d972
-
c5d972
 /* This function is called through a special trampoline from the PLT the
c5d972
    first time each PLT entry is called.  We must perform the relocation
c5d972
    specified in the PLT of the given shared object, and return the resolved
c5d972
@@ -51,7 +36,7 @@
c5d972
    function.  */
c5d972
 
c5d972
 DL_FIXUP_VALUE_TYPE
c5d972
-attribute_hidden __attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE
c5d972
+attribute_hidden __attribute ((noinline)) DL_ARCH_FIXUP_ATTRIBUTE
c5d972
 _dl_fixup (
c5d972
 # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
c5d972
 	   ELF_MACHINE_RUNTIME_FIXUP_ARGS,
c5d972
@@ -147,7 +132,8 @@ _dl_fixup (
c5d972
 
c5d972
 #ifndef PROF
c5d972
 DL_FIXUP_VALUE_TYPE
c5d972
-__attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE
c5d972
+__attribute ((noinline))
c5d972
+DL_ARCH_FIXUP_ATTRIBUTE
c5d972
 _dl_profile_fixup (
c5d972
 #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
c5d972
 		   ELF_MACHINE_RUNTIME_FIXUP_ARGS,
c5d972
@@ -331,52 +317,3 @@ _dl_profile_fixup (
c5d972
 }
c5d972
 
c5d972
 #endif /* PROF */
c5d972
-
c5d972
-
c5d972
-#include <stdio.h>
c5d972
-void
c5d972
-ARCH_FIXUP_ATTRIBUTE
c5d972
-_dl_call_pltexit (struct link_map *l, ElfW(Word) reloc_arg,
c5d972
-		  const void *inregs, void *outregs)
c5d972
-{
c5d972
-#ifdef SHARED
c5d972
-  const uintptr_t pltgot = (uintptr_t) D_PTR (l, l_info[DT_PLTGOT]);
c5d972
-
c5d972
-  /* This is the address in the array where we store the result of previous
c5d972
-     relocations.  */
c5d972
-  // XXX Maybe the bound information must be stored on the stack since
c5d972
-  // XXX with bind_not a new value could have been stored in the meantime.
c5d972
-  struct reloc_result *reloc_result =
c5d972
-    &l->l_reloc_result[reloc_index (pltgot, reloc_arg, sizeof (PLTREL))];
c5d972
-  ElfW(Sym) *defsym = ((ElfW(Sym) *) D_PTR (reloc_result->bound,
c5d972
-					    l_info[DT_SYMTAB])
c5d972
-		       + reloc_result->boundndx);
c5d972
-
c5d972
-  /* Set up the sym parameter.  */
c5d972
-  ElfW(Sym) sym = *defsym;
c5d972
-  sym.st_value = DL_FIXUP_VALUE_ADDR (reloc_result->addr);
c5d972
-
c5d972
-  /* Get the symbol name.  */
c5d972
-  const char *strtab = (const void *) D_PTR (reloc_result->bound,
c5d972
-					     l_info[DT_STRTAB]);
c5d972
-  const char *symname = strtab + sym.st_name;
c5d972
-
c5d972
-  struct audit_ifaces *afct = GLRO(dl_audit);
c5d972
-  for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
c5d972
-    {
c5d972
-      if (afct->ARCH_LA_PLTEXIT != NULL
c5d972
-	  && (reloc_result->enterexit
c5d972
-	      & (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0)
c5d972
-	{
c5d972
-	  struct auditstate *l_state = link_map_audit_state (l, cnt);
c5d972
-	  struct auditstate *bound_state
c5d972
-	    = link_map_audit_state (reloc_result->bound, cnt);
c5d972
-	  afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx,
c5d972
-				 &l_state->cookie, &bound_state->cookie,
c5d972
-				 inregs, outregs, symname);
c5d972
-	}
c5d972
-
c5d972
-      afct = afct->next;
c5d972
-    }
c5d972
-#endif
c5d972
-}
c5d972
diff --git a/elf/dl-support.c b/elf/dl-support.c
c5d972
index 3e5531138eaa18f8..e9943e889ef447ad 100644
c5d972
--- a/elf/dl-support.c
c5d972
+++ b/elf/dl-support.c
c5d972
@@ -399,3 +399,11 @@ _dl_get_dl_main_map (void)
c5d972
   return &_dl_main_map;
c5d972
 }
c5d972
 #endif
c5d972
+
c5d972
+/* This is used by _dl_runtime_profile, not used on static code.  */
c5d972
+void
c5d972
+DL_ARCH_FIXUP_ATTRIBUTE
c5d972
+_dl_audit_pltexit (struct link_map *l, ElfW(Word) reloc_arg,
c5d972
+		   const void *inregs, void *outregs)
c5d972
+{
c5d972
+}
c5d972
diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
c5d972
index 5eab544afe2717f7..c13d896a57811c7d 100644
c5d972
--- a/sysdeps/aarch64/dl-machine.h
c5d972
+++ b/sysdeps/aarch64/dl-machine.h
c5d972
@@ -196,6 +196,7 @@ _dl_start_user:								\n\
c5d972
 /* AArch64 uses RELA not REL */
c5d972
 #define ELF_MACHINE_NO_REL 1
c5d972
 #define ELF_MACHINE_NO_RELA 0
c5d972
+#define PLTREL ElfW(Rela)
c5d972
 
c5d972
 #define DL_PLATFORM_INIT dl_platform_init ()
c5d972
 
c5d972
diff --git a/sysdeps/aarch64/dl-trampoline.S b/sysdeps/aarch64/dl-trampoline.S
c5d972
index a86d0722d4a0415b..18740398e63fdf97 100644
c5d972
--- a/sysdeps/aarch64/dl-trampoline.S
c5d972
+++ b/sysdeps/aarch64/dl-trampoline.S
c5d972
@@ -277,7 +277,7 @@ _dl_runtime_profile:
c5d972
 	ldp	x0, x1, [x29, #OFFSET_SAVED_CALL_X0]
c5d972
 	add	x2, x29, #OFFSET_RG
c5d972
 	add	x3, x29, #OFFSET_RV
c5d972
-	bl	_dl_call_pltexit
c5d972
+	bl	_dl_audit_pltexit
c5d972
 
c5d972
 	ldp	x0, x1, [x29, #OFFSET_RV + DL_OFFSET_RV_X0]
c5d972
 	ldp	d0, d1, [x29, #OFFSET_RV + DL_OFFSET_RV_D0 + 16*0]
c5d972
diff --git a/sysdeps/alpha/dl-trampoline.S b/sysdeps/alpha/dl-trampoline.S
c5d972
index b326b37acedb5eaa..3acf5dec8d9585da 100644
c5d972
--- a/sysdeps/alpha/dl-trampoline.S
c5d972
+++ b/sysdeps/alpha/dl-trampoline.S
c5d972
@@ -187,7 +187,7 @@ _dl_runtime_profile_new:
c5d972
 	jsr	$26, ($27), 0
c5d972
 	ldgp	$29, 0($26)
c5d972
 
c5d972
-	/* Set up for call to _dl_call_pltexit.  */
c5d972
+	/* Set up for call to _dl_audit_pltexit.  */
c5d972
 	ldq	$16, 16*8($15)
c5d972
 	ldq	$17, 17*8($15)
c5d972
 	stq	$0, 16*8($15)
c5d972
@@ -196,7 +196,7 @@ _dl_runtime_profile_new:
c5d972
 	lda	$19, 16*8($15)
c5d972
 	stt	$f0, 18*8($15)
c5d972
 	stt	$f1, 19*8($15)
c5d972
-	bsr	$26, _dl_call_pltexit	!samegp
c5d972
+	bsr	$26, _dl_audit_pltexit	!samegp
c5d972
 
c5d972
 	mov	$15, $30
c5d972
 	cfi_def_cfa_register (30)
c5d972
@@ -518,7 +518,7 @@ _dl_runtime_profile_old:
c5d972
 	jsr	$26, ($27), 0
c5d972
 	ldgp	$29, 0($26)
c5d972
 
c5d972
-	/* Set up for call to _dl_call_pltexit.  */
c5d972
+	/* Set up for call to _dl_audit_pltexit.  */
c5d972
 	ldq	$16, 48*8($15)
c5d972
 	ldq	$17, 49*8($15)
c5d972
 	stq	$0, 46*8($15)
c5d972
@@ -527,7 +527,7 @@ _dl_runtime_profile_old:
c5d972
 	lda	$19, 46*8($15)
c5d972
 	stt	$f0, 48*8($15)
c5d972
 	stt	$f1, 49*8($15)
c5d972
-	bsr	$26, _dl_call_pltexit	!samegp
c5d972
+	bsr	$26, _dl_audit_pltexit	!samegp
c5d972
 
c5d972
 	mov	$15, $30
c5d972
 	cfi_def_cfa_register (30)
c5d972
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
c5d972
index 1a4fd3f17b6df7da..9b5d0567df984c5d 100644
c5d972
--- a/sysdeps/arm/dl-machine.h
c5d972
+++ b/sysdeps/arm/dl-machine.h
c5d972
@@ -260,6 +260,8 @@ _dl_start_user:\n\
c5d972
    Prelinked libraries may use Elf32_Rela though.  */
c5d972
 #define ELF_MACHINE_PLT_REL 1
c5d972
 
c5d972
+#define PLTREL ElfW(Rel)
c5d972
+
c5d972
 /* We define an initialization functions.  This is called very early in
c5d972
    _dl_sysdep_start.  */
c5d972
 #define DL_PLATFORM_INIT dl_platform_init ()
c5d972
diff --git a/sysdeps/arm/dl-trampoline.S b/sysdeps/arm/dl-trampoline.S
c5d972
index c731b012869a9cbc..ced1b1cb1017d677 100644
c5d972
--- a/sysdeps/arm/dl-trampoline.S
c5d972
+++ b/sysdeps/arm/dl-trampoline.S
c5d972
@@ -194,7 +194,7 @@ _dl_runtime_profile:
c5d972
 	ldmia	ip, {r0,r1}
c5d972
 	add	r2, r7, #72
c5d972
 	add	r3, r7, #0
c5d972
-	bl	_dl_call_pltexit
c5d972
+	bl	_dl_audit_pltexit
c5d972
 
c5d972
 	@ Return to caller.
c5d972
 	ldmia	r7, {r0-r3}
c5d972
diff --git a/sysdeps/generic/dl-fixup-attribute.h b/sysdeps/generic/dl-fixup-attribute.h
c5d972
new file mode 100644
c5d972
index 0000000000000000..aa92169b709b3fea
c5d972
--- /dev/null
c5d972
+++ b/sysdeps/generic/dl-fixup-attribute.h
c5d972
@@ -0,0 +1,24 @@
c5d972
+/* ABI specifics for lazy resolution functions.
c5d972
+   Copyright (C) 2021 Free Software Foundation, Inc.
c5d972
+   This file is part of the GNU C Library.
c5d972
+
c5d972
+   The GNU C Library is free software; you can redistribute it and/or
c5d972
+   modify it under the terms of the GNU Lesser General Public
c5d972
+   License as published by the Free Software Foundation; either
c5d972
+   version 2.1 of the License, or (at your option) any later version.
c5d972
+
c5d972
+   The GNU C Library is distributed in the hope that it will be useful,
c5d972
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
c5d972
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
c5d972
+   Lesser General Public License for more details.
c5d972
+
c5d972
+   You should have received a copy of the GNU Lesser General Public
c5d972
+   License along with the GNU C Library; if not, see
c5d972
+   <https://www.gnu.org/licenses/>.  */
c5d972
+
c5d972
+#ifndef _DL_FIXUP_ATTRIBUTE_H
c5d972
+#define _DL_FIXUP_ATTRIBUTE_H
c5d972
+
c5d972
+#define DL_ARCH_FIXUP_ATTRIBUTE
c5d972
+
c5d972
+#endif
c5d972
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
c5d972
index 47a9dee5b1c0ca63..29b77b35175c1116 100644
c5d972
--- a/sysdeps/generic/ldsodefs.h
c5d972
+++ b/sysdeps/generic/ldsodefs.h
c5d972
@@ -35,6 +35,7 @@
c5d972
 #include <link.h>
c5d972
 #include <dl-lookupcfg.h>
c5d972
 #include <dl-sysdep.h>
c5d972
+#include <dl-fixup-attribute.h>
c5d972
 #include <libc-lock.h>
c5d972
 #include <hp-timing.h>
c5d972
 #include <tls.h>
c5d972
@@ -1311,6 +1312,11 @@ void _dl_audit_pltenter (struct link_map *l, struct reloc_result *reloc_result,
c5d972
 			 DL_FIXUP_VALUE_TYPE *value, void *regs,
c5d972
 			 long int *framesize)
c5d972
   attribute_hidden;
c5d972
+void DL_ARCH_FIXUP_ATTRIBUTE _dl_audit_pltexit (struct link_map *l,
c5d972
+						ElfW(Word) reloc_arg,
c5d972
+						const void *inregs,
c5d972
+						void *outregs)
c5d972
+  attribute_hidden;
c5d972
 #endif /* SHARED */
c5d972
 
c5d972
 __END_DECLS
c5d972
diff --git a/sysdeps/hppa/dl-runtime.c b/sysdeps/hppa/dl-runtime.c
c5d972
index 2d061b150f0602c1..4c323131f937094b 100644
c5d972
--- a/sysdeps/hppa/dl-runtime.c
c5d972
+++ b/sysdeps/hppa/dl-runtime.c
c5d972
@@ -26,7 +26,7 @@
c5d972
    _dl_fixup with the relocation offset.  */
c5d972
 
c5d972
 ElfW(Word)
c5d972
-attribute_hidden __attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE
c5d972
+attribute_hidden __attribute ((noinline)) DL_ARCH_FIXUP_ATTRIBUTE
c5d972
 _dl_fix_reloc_arg (struct fdesc *fptr, struct link_map *l)
c5d972
 {
c5d972
   Elf32_Addr l_addr, iplt, jmprel, end_jmprel, r_type;
c5d972
diff --git a/sysdeps/hppa/dl-trampoline.S b/sysdeps/hppa/dl-trampoline.S
c5d972
index 7ee4331cc2e7deff..3c83c8542f4fc63f 100644
c5d972
--- a/sysdeps/hppa/dl-trampoline.S
c5d972
+++ b/sysdeps/hppa/dl-trampoline.S
c5d972
@@ -275,7 +275,7 @@ L(cont):
c5d972
 	ldw	-4(%sp),%r1
c5d972
 	copy	%r1, %sp
c5d972
 
c5d972
-	/* Arguments to _dl_call_pltexit */
c5d972
+	/* Arguments to _dl_audit_pltexit */
c5d972
 	ldw	-116(%sp), %r26		/* (1) got[1] == struct link_map */
c5d972
 	ldw	-120(%sp), %r25		/* (2) reloc offsets */
c5d972
 	ldo	-56(%sp), %r24		/* (3) *La_hppa_regs */
c5d972
@@ -287,8 +287,8 @@ L(cont):
c5d972
 	ldo	-128(%sp), %r1
c5d972
 	fstd	%fr4,0(%r1)
c5d972
 
c5d972
-	/* Call _dl_call_pltexit */
c5d972
-	bl	_dl_call_pltexit,%rp
c5d972
+	/* Call _dl_audit_pltexit */
c5d972
+	bl	_dl_audit_pltexit,%rp
c5d972
 	nop
c5d972
 
c5d972
 	/* Restore *La_hppa_retval */
c5d972
diff --git a/sysdeps/i386/dl-fixup-attribute.h b/sysdeps/i386/dl-fixup-attribute.h
c5d972
new file mode 100644
c5d972
index 0000000000000000..c10e9936f4db7254
c5d972
--- /dev/null
c5d972
+++ b/sysdeps/i386/dl-fixup-attribute.h
c5d972
@@ -0,0 +1,30 @@
c5d972
+/* ABI specifics for lazy resolution functions.  i386 version.
c5d972
+   Copyright (C) 2021 Free Software Foundation, Inc.
c5d972
+   This file is part of the GNU C Library.
c5d972
+
c5d972
+   The GNU C Library is free software; you can redistribute it and/or
c5d972
+   modify it under the terms of the GNU Lesser General Public
c5d972
+   License as published by the Free Software Foundation; either
c5d972
+   version 2.1 of the License, or (at your option) any later version.
c5d972
+
c5d972
+   The GNU C Library is distributed in the hope that it will be useful,
c5d972
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
c5d972
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
c5d972
+   Lesser General Public License for more details.
c5d972
+
c5d972
+   You should have received a copy of the GNU Lesser General Public
c5d972
+   License along with the GNU C Library; if not, see
c5d972
+   <https://www.gnu.org/licenses/>.  */
c5d972
+
c5d972
+#ifndef _DL_FIXUP_ATTRIBUTE_H
c5d972
+#define _DL_FIXUP_ATTRIBUTE_H
c5d972
+
c5d972
+/* We cannot use this scheme for profiling because the _mcount call destroys
c5d972
+   the passed register information.  */
c5d972
+#ifndef PROF
c5d972
+# define DL_ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), stdcall, unused))
c5d972
+#else
c5d972
+# define DL_ARCH_FIXUP_ATTRIBUTE
c5d972
+#endif
c5d972
+
c5d972
+#endif
c5d972
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
c5d972
index 5ba95b9e4af49942..30c3464fc4ac19d8 100644
c5d972
--- a/sysdeps/i386/dl-machine.h
c5d972
+++ b/sysdeps/i386/dl-machine.h
c5d972
@@ -119,29 +119,6 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
c5d972
   return lazy;
c5d972
 }
c5d972
 
c5d972
-#ifdef IN_DL_RUNTIME
c5d972
-
c5d972
-# ifndef PROF
c5d972
-/* We add a declaration of this function here so that in dl-runtime.c
c5d972
-   the ELF_MACHINE_RUNTIME_TRAMPOLINE macro really can pass the parameters
c5d972
-   in registers.
c5d972
-
c5d972
-   We cannot use this scheme for profiling because the _mcount call
c5d972
-   destroys the passed register information.  */
c5d972
-#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), stdcall, unused))
c5d972
-
c5d972
-extern ElfW(Addr) _dl_fixup (struct link_map *l,
c5d972
-			     ElfW(Word) reloc_offset)
c5d972
-     ARCH_FIXUP_ATTRIBUTE;
c5d972
-extern ElfW(Addr) _dl_profile_fixup (struct link_map *l,
c5d972
-				     ElfW(Word) reloc_offset,
c5d972
-				     ElfW(Addr) retaddr, void *regs,
c5d972
-				     long int *framesizep)
c5d972
-     ARCH_FIXUP_ATTRIBUTE;
c5d972
-# endif
c5d972
-
c5d972
-#endif
c5d972
-
c5d972
 /* Mask identifying addresses reserved for the user program,
c5d972
    where the dynamic linker should not map anything.  */
c5d972
 #define ELF_MACHINE_USER_ADDRESS_MASK	0xf8000000UL
c5d972
@@ -240,6 +217,8 @@ _dl_start_user:\n\
c5d972
    Prelinked libraries may use Elf32_Rela though.  */
c5d972
 #define ELF_MACHINE_PLT_REL 1
c5d972
 
c5d972
+#define PLTREL ElfW(Rel)
c5d972
+
c5d972
 /* We define an initialization functions.  This is called very early in
c5d972
    _dl_sysdep_start.  */
c5d972
 #define DL_PLATFORM_INIT dl_platform_init ()
c5d972
diff --git a/sysdeps/i386/dl-trampoline.S b/sysdeps/i386/dl-trampoline.S
c5d972
index 6dc03192168ae2f3..a738b291a79bf8c2 100644
c5d972
--- a/sysdeps/i386/dl-trampoline.S
c5d972
+++ b/sysdeps/i386/dl-trampoline.S
c5d972
@@ -265,7 +265,7 @@ _dl_runtime_profile:
c5d972
 	movl (LRV_SIZE + 4 + LR_SIZE)(%esp), %eax
c5d972
 	# PLT1
c5d972
 	movl (LRV_SIZE + 4 + LR_SIZE + 4)(%esp), %edx
c5d972
-	call _dl_call_pltexit
c5d972
+	call _dl_audit_pltexit
c5d972
 	movl LRV_EAX_OFFSET(%esp), %eax
c5d972
 	movl LRV_EDX_OFFSET(%esp), %edx
c5d972
 	fldt LRV_ST1_OFFSET(%esp)
c5d972
diff --git a/sysdeps/ia64/dl-trampoline.S b/sysdeps/ia64/dl-trampoline.S
c5d972
index fc24c425bfe6907b..caeca3afcd7db6b6 100644
c5d972
--- a/sysdeps/ia64/dl-trampoline.S
c5d972
+++ b/sysdeps/ia64/dl-trampoline.S
c5d972
@@ -133,7 +133,7 @@ END(_dl_runtime_resolve)
c5d972
 
c5d972
 
c5d972
 /* The fourth argument to _dl_profile_fixup and the third one to
c5d972
-   _dl_call_pltexit are a pointer to La_ia64_regs:
c5d972
+   _dl_audit_pltexit are a pointer to La_ia64_regs:
c5d972
 
c5d972
    8byte r8
c5d972
    8byte r9
c5d972
@@ -159,7 +159,7 @@ END(_dl_runtime_resolve)
c5d972
    8byte sp
c5d972
 
c5d972
    The fifth argument to _dl_profile_fixup is a pointer to long int.
c5d972
-   The fourth argument to _dl_call_pltexit is a pointer to
c5d972
+   The fourth argument to _dl_audit_pltexit is a pointer to
c5d972
    La_ia64_retval:
c5d972
 
c5d972
    8byte r8
c5d972
@@ -261,7 +261,7 @@ ENTRY(_dl_runtime_profile)
c5d972
 	}
c5d972
 	{ .mii
c5d972
 	  mov r18 = ar.unat	/* save it in La_ia64_regs */
c5d972
-	  mov loc7 = out3	/* save it for _dl_call_pltexit */
c5d972
+	  mov loc7 = out3	/* save it for _dl_audit_pltexit */
c5d972
 	  mov loc5 = r11	/* preserve language specific register */
c5d972
 	}
c5d972
 	{ .mmi
c5d972
@@ -272,7 +272,7 @@ ENTRY(_dl_runtime_profile)
c5d972
 	}
c5d972
 	{ .mii
c5d972
 	  mov ar.unat = r17	/* restore it for function call */
c5d972
-	  mov loc8 = r16	/* save it for _dl_call_pltexit */
c5d972
+	  mov loc8 = r16	/* save it for _dl_audit_pltexit */
c5d972
 	  nop.i 0x0
c5d972
 	}
c5d972
 	{ .mmi
c5d972
@@ -291,7 +291,7 @@ ENTRY(_dl_runtime_profile)
c5d972
 	{ .mmi
c5d972
 	  stf.spill [r2] = f14, 32
c5d972
 	  stf.spill [r3] = f15, 24
c5d972
-	  mov loc9 = out1	/* save it for _dl_call_pltexit */
c5d972
+	  mov loc9 = out1	/* save it for _dl_audit_pltexit */
c5d972
 	  ;;
c5d972
 	}
c5d972
 	{ .mmb
c5d972
@@ -426,7 +426,7 @@ ENTRY(_dl_runtime_profile)
c5d972
 	  br.call.sptk.many b0 = b6
c5d972
 	}
c5d972
 	{ .mii
c5d972
-	  /* Prepare stack for _dl_call_pltexit. Loc10 has the original
c5d972
+	  /* Prepare stack for _dl_audit_pltexit. Loc10 has the original
c5d972
 	     stack pointer.  */
c5d972
 	  adds r12 = -PLTEXIT_FRAME_SIZE, loc10
c5d972
 	  adds r2 = -(PLTEXIT_FRAME_SIZE - 16), loc10
c5d972
@@ -461,14 +461,14 @@ ENTRY(_dl_runtime_profile)
c5d972
 	{ .mmi
c5d972
 	  stf.spill [r2] = f12, 32
c5d972
 	  stf.spill [r3] = f13, 32
c5d972
-	  /* We need to restore gp for _dl_call_pltexit. */
c5d972
+	  /* We need to restore gp for _dl_audit_pltexit. */
c5d972
 	  mov gp = loc11
c5d972
 	  ;;
c5d972
 	}
c5d972
 	{ .mmb
c5d972
 	  stf.spill [r2] = f14
c5d972
 	  stf.spill [r3] = f15
c5d972
-	  br.call.sptk.many b0 = _dl_call_pltexit
c5d972
+	  br.call.sptk.many b0 = _dl_audit_pltexit
c5d972
 	}
c5d972
 	{ .mmi
c5d972
 	  /* Load all the non-floating and floating return values. Skip
c5d972
diff --git a/sysdeps/m68k/dl-trampoline.S b/sysdeps/m68k/dl-trampoline.S
c5d972
index 7e1eace26b4a519d..27282ca8a6b1dada 100644
c5d972
--- a/sysdeps/m68k/dl-trampoline.S
c5d972
+++ b/sysdeps/m68k/dl-trampoline.S
c5d972
@@ -202,7 +202,7 @@ _dl_runtime_profile:
c5d972
 	cfi_adjust_cfa_offset (4)
c5d972
 	move.l (32+FPSPACE)(%sp), -(%sp)
c5d972
 	cfi_adjust_cfa_offset (4)
c5d972
-	jbsr _dl_call_pltexit
c5d972
+	jbsr _dl_audit_pltexit
c5d972
 	lea 16(%sp), %sp
c5d972
 	cfi_adjust_cfa_offset (-16)
c5d972
 	move.l (%sp)+, %d0
c5d972
diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h
c5d972
index b41e10647d81843b..d4bd8b62f4b036a3 100644
c5d972
--- a/sysdeps/mips/dl-machine.h
c5d972
+++ b/sysdeps/mips/dl-machine.h
c5d972
@@ -63,6 +63,7 @@
c5d972
 #define ELF_MACHINE_PLT_REL 1
c5d972
 #define ELF_MACHINE_NO_REL 0
c5d972
 #define ELF_MACHINE_NO_RELA 0
c5d972
+#define PLTREL ElfW(Rel)
c5d972
 
c5d972
 /* Translate a processor specific dynamic tag to the index
c5d972
    in l_info array.  */
c5d972
diff --git a/sysdeps/powerpc/powerpc32/dl-machine.h b/sysdeps/powerpc/powerpc32/dl-machine.h
c5d972
index 31c7f3f95a2ce1b2..84322595793dc8bb 100644
c5d972
--- a/sysdeps/powerpc/powerpc32/dl-machine.h
c5d972
+++ b/sysdeps/powerpc/powerpc32/dl-machine.h
c5d972
@@ -150,6 +150,7 @@ __elf_preferred_address(struct link_map *loader, size_t maplength,
c5d972
 /* The PowerPC never uses REL relocations.  */
c5d972
 #define ELF_MACHINE_NO_REL 1
c5d972
 #define ELF_MACHINE_NO_RELA 0
c5d972
+#define PLTREL ElfW(Rela)
c5d972
 
c5d972
 /* We define an initialization function to initialize HWCAP/HWCAP2 and
c5d972
    platform data so it can be copied into the TCB later.  This is called
c5d972
diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h
c5d972
index 35996bb9173da231..3af1f708378f9a3c 100644
c5d972
--- a/sysdeps/powerpc/powerpc64/dl-machine.h
c5d972
+++ b/sysdeps/powerpc/powerpc64/dl-machine.h
c5d972
@@ -297,6 +297,7 @@ BODY_PREFIX "_dl_start_user:\n"						\
c5d972
 /* The PowerPC never uses REL relocations.  */
c5d972
 #define ELF_MACHINE_NO_REL 1
c5d972
 #define ELF_MACHINE_NO_RELA 0
c5d972
+#define PLTREL ElfW(Rela)
c5d972
 
c5d972
 /* We define an initialization function to initialize HWCAP/HWCAP2 and
c5d972
    platform data so it can be copied into the TCB later.  This is called
c5d972
diff --git a/sysdeps/powerpc/powerpc64/dl-trampoline.S b/sysdeps/powerpc/powerpc64/dl-trampoline.S
c5d972
index aa141dc44b980d9b..23290d32360507fd 100644
c5d972
--- a/sysdeps/powerpc/powerpc64/dl-trampoline.S
c5d972
+++ b/sysdeps/powerpc/powerpc64/dl-trampoline.S
c5d972
@@ -197,7 +197,7 @@ END(_dl_runtime_resolve)
c5d972
 #ifndef PROF
c5d972
 ENTRY (_dl_profile_resolve, 4)
c5d972
 /* Spill r30, r31 to preserve the link_map* and reloc_addr, in case we
c5d972
-   need to call _dl_call_pltexit.  */
c5d972
+   need to call _dl_audit_pltexit.  */
c5d972
 	std	r31,-8(r1)
c5d972
 	std	r30,-16(r1)
c5d972
 /* We need to save the registers used to pass parameters, ie. r3 thru
c5d972
@@ -452,7 +452,7 @@ L(restoreFXR2):
c5d972
 L(callpltexit):
c5d972
 	addi	r5,r1,INT_PARMS
c5d972
 	addi	r6,r1,INT_RTN
c5d972
-	bl	JUMPTARGET(_dl_call_pltexit)
c5d972
+	bl	JUMPTARGET(_dl_audit_pltexit)
c5d972
 #ifndef SHARED
c5d972
 	nop
c5d972
 #endif
c5d972
diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
c5d972
index ded41adff80346b6..2f3bb085ae2b6794 100644
c5d972
--- a/sysdeps/s390/s390-32/dl-machine.h
c5d972
+++ b/sysdeps/s390/s390-32/dl-machine.h
c5d972
@@ -279,6 +279,7 @@ _dl_start_user:\n\
c5d972
 /* The S390 never uses Elf32_Rel relocations.  */
c5d972
 #define ELF_MACHINE_NO_REL 1
c5d972
 #define ELF_MACHINE_NO_RELA 0
c5d972
+#define PLTREL ElfW(Rela)
c5d972
 
c5d972
 /* We define an initialization functions.  This is called very early in
c5d972
    _dl_sysdep_start.  */
c5d972
diff --git a/sysdeps/s390/s390-32/dl-trampoline.h b/sysdeps/s390/s390-32/dl-trampoline.h
c5d972
index d36c002743bf2f0c..c447a41f067c462b 100644
c5d972
--- a/sysdeps/s390/s390-32/dl-trampoline.h
c5d972
+++ b/sysdeps/s390/s390-32/dl-trampoline.h
c5d972
@@ -207,7 +207,7 @@ _dl_runtime_profile:
c5d972
 	basr   %r1,0
c5d972
 5:	l      %r14,7f-5b(%r1)
c5d972
 	la     %r5,40(%r12)		# pointer to struct La_s390_32_retval
c5d972
-	bas    %r14,0(%r14,%r1)		# call _dl_call_pltexit
c5d972
+	bas    %r14,0(%r14,%r1)		# call _dl_audit_pltexit
c5d972
 
c5d972
 	lr     %r15,%r12		# remove stack frame
c5d972
 	cfi_def_cfa_register (15)
c5d972
@@ -224,7 +224,7 @@ _dl_runtime_profile:
c5d972
 	br     %r14
c5d972
 
c5d972
 6:	.long  _dl_profile_fixup - 0b
c5d972
-7:	.long  _dl_call_pltexit - 5b
c5d972
+7:	.long  _dl_audit_pltexit - 5b
c5d972
 	cfi_endproc
c5d972
 	.size _dl_runtime_profile, .-_dl_runtime_profile
c5d972
 #endif
c5d972
diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h
c5d972
index 36327c40a1972dd7..033e7c9916e751f4 100644
c5d972
--- a/sysdeps/s390/s390-64/dl-machine.h
c5d972
+++ b/sysdeps/s390/s390-64/dl-machine.h
c5d972
@@ -228,6 +228,7 @@ _dl_start_user:\n\
c5d972
 /* The 64 bit S/390 never uses Elf64_Rel relocations.  */
c5d972
 #define ELF_MACHINE_NO_REL 1
c5d972
 #define ELF_MACHINE_NO_RELA 0
c5d972
+#define PLTREL ElfW(Rela)
c5d972
 
c5d972
 /* We define an initialization functions.  This is called very early in
c5d972
    _dl_sysdep_start.  */
c5d972
diff --git a/sysdeps/s390/s390-64/dl-trampoline.h b/sysdeps/s390/s390-64/dl-trampoline.h
c5d972
index d313fd521db0b859..18534d629ebc00e2 100644
c5d972
--- a/sysdeps/s390/s390-64/dl-trampoline.h
c5d972
+++ b/sysdeps/s390/s390-64/dl-trampoline.h
c5d972
@@ -203,7 +203,7 @@ _dl_runtime_profile:
c5d972
 	lmg    %r2,%r4,48(%r12)		# r2, r3: load arguments saved by PLT
c5d972
 					# r4: pointer to struct La_s390_64_regs
c5d972
 	la     %r5,72(%r12)		# pointer to struct La_s390_64_retval
c5d972
-	brasl  %r14,_dl_call_pltexit
c5d972
+	brasl  %r14,_dl_audit_pltexit
c5d972
 
c5d972
 	lgr    %r15,%r12		# remove stack frame
c5d972
 	cfi_def_cfa_register (15)
c5d972
diff --git a/sysdeps/sh/dl-trampoline.S b/sysdeps/sh/dl-trampoline.S
c5d972
index 0c8f84d26d3015ca..73f865f2af4e2d48 100644
c5d972
--- a/sysdeps/sh/dl-trampoline.S
c5d972
+++ b/sysdeps/sh/dl-trampoline.S
c5d972
@@ -423,8 +423,8 @@ _dl_runtime_profile:
c5d972
 	.align 2
c5d972
 #ifdef SHARED
c5d972
 7:	.long _GLOBAL_OFFSET_TABLE_
c5d972
-8:	.long _dl_call_pltexit@GOTOFF
c5d972
+8:	.long _dl_audit_pltexit@GOTOFF
c5d972
 #else
c5d972
-8:	.long _dl_call_pltexit
c5d972
+8:	.long _dl_audit_pltexit
c5d972
 #endif
c5d972
 	.size _dl_runtime_profile, .-_dl_runtime_profile
c5d972
diff --git a/sysdeps/sparc/sparc32/dl-trampoline.S b/sysdeps/sparc/sparc32/dl-trampoline.S
c5d972
index 098ffcfacc55d0b6..18ef2f0d3655b3de 100644
c5d972
--- a/sysdeps/sparc/sparc32/dl-trampoline.S
c5d972
+++ b/sysdeps/sparc/sparc32/dl-trampoline.S
c5d972
@@ -127,7 +127,7 @@ _dl_profile_invoke:
c5d972
 	mov	%l5, %o0
c5d972
 	mov	%l6, %o1
c5d972
 	add	%sp, (11 * 8), %o2
c5d972
-	call	_dl_call_pltexit
c5d972
+	call	_dl_audit_pltexit
c5d972
 	 add	%sp, ( 9 * 8), %o3
c5d972
 
c5d972
 	ldd	[%sp + ( 9 * 8)], %i0
c5d972
diff --git a/sysdeps/sparc/sparc64/dl-trampoline.S b/sysdeps/sparc/sparc64/dl-trampoline.S
c5d972
index 4948b88b9640691d..9c18ceb131c9a25b 100644
c5d972
--- a/sysdeps/sparc/sparc64/dl-trampoline.S
c5d972
+++ b/sysdeps/sparc/sparc64/dl-trampoline.S
c5d972
@@ -196,7 +196,7 @@ _dl_profile_invoke:
c5d972
 	mov	%l5, %o0
c5d972
 	mov	%l6, %o1
c5d972
 	add	%sp, STACK_BIAS + (24 * 8), %o2
c5d972
-	call	_dl_call_pltexit
c5d972
+	call	_dl_audit_pltexit
c5d972
 	 add	%sp, STACK_BIAS + (16 * 8), %o3
c5d972
 
c5d972
 	ldx	[%sp + STACK_BIAS + (16 * 8)], %i0
c5d972
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
c5d972
index 5262aa69c06aa8db..d30317980882ac51 100644
c5d972
--- a/sysdeps/x86_64/dl-machine.h
c5d972
+++ b/sysdeps/x86_64/dl-machine.h
c5d972
@@ -210,6 +210,7 @@ _dl_start_user:\n\
c5d972
 /* The x86-64 never uses Elf64_Rel/Elf32_Rel relocations.  */
c5d972
 #define ELF_MACHINE_NO_REL 1
c5d972
 #define ELF_MACHINE_NO_RELA 0
c5d972
+#define PLTREL ElfW(Rela)
c5d972
 
c5d972
 /* We define an initialization function.  This is called very early in
c5d972
    _dl_sysdep_start.  */
c5d972
diff --git a/sysdeps/x86_64/dl-runtime.h b/sysdeps/x86_64/dl-runtime.h
c5d972
index 3fa61d7a4697cf3f..379f8bd4dea8ef97 100644
c5d972
--- a/sysdeps/x86_64/dl-runtime.h
c5d972
+++ b/sysdeps/x86_64/dl-runtime.h
c5d972
@@ -18,7 +18,7 @@
c5d972
    02111-1307 USA.  */
c5d972
 
c5d972
 /* The ABI calls for the PLT stubs to pass the index of the relocation
c5d972
-   and not its offset.  In _dl_profile_fixup and _dl_call_pltexit we
c5d972
+   and not its offset.  In _dl_profile_fixup and _dl_audit_pltexit we
c5d972
    also use the index.  Therefore it is wasteful to compute the offset
c5d972
    in the trampoline just to reverse the operation immediately
c5d972
    afterwards.  */
c5d972
diff --git a/sysdeps/x86_64/dl-trampoline.h b/sysdeps/x86_64/dl-trampoline.h
c5d972
index a28b1e73a4b187ba..256dfbb64df9f03d 100644
c5d972
--- a/sysdeps/x86_64/dl-trampoline.h
c5d972
+++ b/sysdeps/x86_64/dl-trampoline.h
c5d972
@@ -388,7 +388,7 @@ _dl_runtime_profile:
c5d972
 	jns 3f
c5d972
 
c5d972
 	/* There's nothing in the frame size, so there
c5d972
-	   will be no call to the _dl_call_pltexit. */
c5d972
+	   will be no call to the _dl_audit_pltexit. */
c5d972
 
c5d972
 	/* Get back registers content.  */
c5d972
 	movq LR_RCX_OFFSET(%rsp), %rcx
c5d972
@@ -436,7 +436,7 @@ _dl_runtime_profile:
c5d972
 	mov 24(%rbx), %RSP_LP	# Drop the copied stack content
c5d972
 
c5d972
 	/* Now we have to prepare the La_x86_64_retval structure for the
c5d972
-	   _dl_call_pltexit.  The La_x86_64_regs is being pointed by rsp now,
c5d972
+	   _dl_audit_pltexit.  The La_x86_64_regs is being pointed by rsp now,
c5d972
 	   so we just need to allocate the sizeof(La_x86_64_retval) space on
c5d972
 	   the stack, since the alignment has already been taken care of. */
c5d972
 # ifdef RESTORE_AVX
c5d972
@@ -491,7 +491,7 @@ _dl_runtime_profile:
c5d972
 	movq 24(%rbx), %rdx	# La_x86_64_regs argument to %rdx.
c5d972
 	movq 40(%rbx), %rsi	# Copy args pushed by PLT in register.
c5d972
 	movq 32(%rbx), %rdi	# %rdi: link_map, %rsi: reloc_index
c5d972
-	call _dl_call_pltexit
c5d972
+	call _dl_audit_pltexit
c5d972
 
c5d972
 	/* Restore return registers.  */
c5d972
 	movq LRV_RAX_OFFSET(%rsp), %rax