From libc-alpha-return-16890-listarch-libc-alpha=sources dot redhat dot com at sources dot redhat dot com Wed Jan 19 18:02:53 2005
Return-Path: <libc-alpha-return-16890-listarch-libc-alpha=sources dot redhat dot com at sources dot redhat dot com>
Delivered-To: listarch-libc-alpha at sources dot redhat dot com
Received: (qmail 26073 invoked by alias); 19 Jan 2005 18:02:41 -0000
Mailing-List: contact libc-alpha-help at sources dot redhat dot com; run by ezmlm
Precedence: bulk
List-Subscribe: <mailto:libc-alpha-subscribe at sources dot redhat dot com>
List-Archive: <http://sources.redhat.com/ml/libc-alpha/>
List-Post: <mailto:libc-alpha at sources dot redhat dot com>
List-Help: <mailto:libc-alpha-help at sources dot redhat dot com>, <http://sources dot redhat dot com/ml/#faqs>
Sender: libc-alpha-owner at sources dot redhat dot com
Delivered-To: mailing list libc-alpha at sources dot redhat dot com
Received: (qmail 25420 invoked from network); 19 Jan 2005 18:01:47 -0000
Received: from unknown (HELO mail.codesourcery.com) (65.74.133.9)
  by sourceware dot org with SMTP; 19 Jan 2005 18:01:47 -0000
Received: (qmail 7456 invoked from network); 19 Jan 2005 18:01:44 -0000
Received: from localhost (HELO ?192.168.0.100?) (mitchell@127.0.0.1)
  by mail dot codesourcery dot com with SMTP; 19 Jan 2005 18:01:44 -0000
Message-ID: <41EEA082.1020000@codesourcery.com>
Date: Wed, 19 Jan 2005 10:01:38 -0800
From: Mark Mitchell <mark at codesourcery dot com>
Organization: CodeSourcery, LLC
User-Agent: Mozilla Thunderbird 0.9 (Windows/20041103)
MIME-Version: 1.0
To: Daniel Jacobowitz <drow at false dot org>
CC:  libc-alpha at sources dot redhat dot com
Subject: Re: PATCH: ARM dl-trampoline.S
References: <200501191631.j0JGVVRA002591@sirius.codesourcery.com> <20050119170217.GA3137@nevyn.them.org>
In-Reply-To: <20050119170217 dot GA3137 at nevyn dot them dot org>
Content-Type: multipart/mixed;
 boundary="------------050601050507020101060100"

This is a multi-part message in MIME format.
--------------050601050507020101060100
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Daniel Jacobowitz wrote:
> On Wed, Jan 19, 2005 at 08:31:31AM -0800, Mark Mitchell wrote:
> 
>>This patch updates the ARM port for the recent dl-trampoline.S and
>>link.h changes.  OK to apply?
> 
> 
> Did you test this?  I'm pretty sure that RESOLVE_MAP returns a link
> map, unlike RESOLVE.

No, I didn't test -- except by building glibc.  (There are other 
problems at the moment, AFAICT, with actually running the library on ARM.)

However, you're definitely correct -- good catch! -- and, in fact, in 
looking at my logs I see compiler warnings about the mismatched type 
assignment.  Here is a more plausible version.  How about this one?

Thanks,

-- 
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com
(916) 791-8304

--------------050601050507020101060100
Content-Type: text/plain;
 name="glibc.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="glibc.patch"

2005-01-19  Mark Mitchell  <mark@codesourcery.com>

	* elf/tst-auditmod1.c: Add ARM support.
	* sysdeps/arm/dl-machine.h (ELF_MACHINE_RUNTIME_TRAMPOLINE):
	Remove.
	(RESOLVE): Do not use it; use ...
	(RESOLVE_MAP): ... instead.
	(ARCH_LA_PLTENTER): Define.
	(ARCH_LA_PLTEXIT): Likewise.
	(elf_machine_rel): Use RESOLVE_MAP, not RESOLVE.
	(elf_machine_rela): Likewise.
	* sysdeps/arm/dl-trampoline.S: New file.
	* sysdeps/arm/bits/link.h: Likewise.
	* sysdeps/generic/ldsodefs.h (struct La_arm_regs): Declare.
	(struct audit_ifaces): Add ARM functions.

Index: elf/tst-auditmod1.c
===================================================================
RCS file: /cvs/glibc/libc/elf/tst-auditmod1.c,v
retrieving revision 1.7
diff -c -5 -p -r1.7 tst-auditmod1.c
*** elf/tst-auditmod1.c	16 Jan 2005 06:24:59 -0000	1.7
--- elf/tst-auditmod1.c	19 Jan 2005 17:54:32 -0000
*************** la_symbind64 (Elf64_Sym *sym, unsigned i
*** 100,110 ****
  	  symname, (long int) sym->st_value, ndx, *flags);
  
    return sym->st_value;
  }
  
! #ifdef __i386__
  # define pltenter la_i86_gnu_pltenter
  # define pltexit la_i86_gnu_pltexit
  # define La_regs La_i86_regs
  # define La_retval La_i86_retval
  # define int_retval lrv_eax
--- 100,116 ----
  	  symname, (long int) sym->st_value, ndx, *flags);
  
    return sym->st_value;
  }
  
! #ifdef __arm__
! # define pltenter la_arm_gnu_plteneter
! # define pltext la_arm_gnu_pltexit
! # define La_regs La_arm_regs
! # define La_retval La_arm_retval
! # define int_retval lvr_r0
! #elif defined __i386__
  # define pltenter la_i86_gnu_pltenter
  # define pltexit la_i86_gnu_pltexit
  # define La_regs La_i86_regs
  # define La_retval La_i86_retval
  # define int_retval lrv_eax
Index: sysdeps/arm/dl-trampoline.S
===================================================================
RCS file: sysdeps/arm/dl-trampoline.S
diff -N sysdeps/arm/dl-trampoline.S
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- sysdeps/arm/dl-trampoline.S	19 Jan 2005 17:54:32 -0000
***************
*** 0 ****
--- 1,135 ----
+ /* PLT trampolines.  ARM 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>
+ 
+ #if defined(__USE_BX__)
+ #define BX(x) bx	x
+ #else
+ #define BX(x) mov	pc, x
+ #endif
+ 
+ #ifndef PROF
+ 	.text
+ 	.globl _dl_runtime_resolve
+ 	.type _dl_runtime_resolve, #function
+ 	.align 2
+ _dl_runtime_resolve:
+ 	@ we get called with
+ 	@ 	stack[0] contains the return address from this call
+ 	@	ip contains &GOT[n+3] (pointer to function)
+ 	@	lr points to &GOT[2]
+ 
+ 	@ stack arguments
+ 	stmdb	sp!,{r0-r3}
+ 
+ 	@ get pointer to linker struct
+ 	ldr	r0, [lr, #-4]
+ 
+ 	@ prepare to call _dl_fixup()
+ 	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each
+ 	sub	r1, ip, lr
+ 	sub	r1, r1, #4
+ 	add	r1, r1, r1
+ 
+ 	@ call fixup routine
+ 	bl	_dl_fixup
+ 
+ 	@ save the return
+ 	mov	ip, r0
+ 
+ 	@ get arguments and return address back
+ 	ldmia	sp!, {r0-r3,lr}
+ 
+ 	@ jump to the newly found address
+ 	BX(ip)
+ 
+ 	.size _dl_runtime_resolve, .-_dl_runtime_resolve
+ 
+ 	.globl _dl_runtime_profile
+ 	.type _dl_runtime_profile, #function
+ 	.align 2
+ _dl_runtime_profile:
+ 	@ stack arguments
+ 	stmdb	sp!, {r0-r3}
+ 
+ 	@ get pointer to linker struct
+ 	ldr	r0, [lr, #-4]
+ 
+ 	@ prepare to call _dl_profile_fixup()
+ 	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each
+ 	sub	r1, ip, lr
+ 	sub	r1, r1, #4
+ 	add	r1, r1, r1
+ 
+ 	@ call profiling fixup routine
+ 	bl	_dl_profile_fixup
+ 
+ 	@ save the return
+ 	mov	ip, r0
+ 
+ 	@ get arguments and return address back
+ 	ldmia	sp!, {r0-r3,lr}
+ 
+ 	@ jump to the newly found address
+ 	BX(ip)
+ 
+ 	.size _dl_runtime_resolve, .-_dl_runtime_resolve
+ 	.previous
+ #else
+ 	.text
+ 	.globl _dl_runtime_resolve
+ 	.globl _dl_runtime_profile
+ 	.type _dl_runtime_resolve, #function
+ 	.type _dl_runtime_profile, #function
+ 	.align 2
+ _dl_runtime_resolve:
+ _dl_runtime_profile:
+ 	@ we get called with
+ 	@ 	stack[0] contains the return address from this call
+ 	@	ip contains &GOT[n+3] (pointer to function)
+ 	@	lr points to &GOT[2]
+ 
+ 	@ stack arguments
+ 	stmdb	sp!, {r0-r3}
+ 
+ 	@ get pointer to linker struct
+ 	ldr	r0, [lr, #-4]
+ 
+ 	@ prepare to call _dl_fixup()
+ 	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each
+ 	sub	r1, ip, lr
+ 	sub	r1, r1, #4
+ 	add	r1, r1, r1
+ 
+ 	@ call profiling fixup routine
+ 	bl	_dl_fixup
+ 
+ 	@ save the return
+ 	mov	ip, r0
+ 
+ 	@ get arguments and return address back
+ 	ldmia	sp!, {r0-r3,lr}
+ 
+ 	@ jump to the newly found address
+ 	BX(ip)
+ 
+ 	.size _dl_runtime_profile, .-_dl_runtime_profile
+ 	.previous
+ #endif
Index: sysdeps/arm/bits/link.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/arm/bits/link.h,v
retrieving revision 1.2
diff -c -5 -p -r1.2 link.h
*** sysdeps/arm/bits/link.h	6 Jan 2005 22:40:20 -0000	1.2
--- sysdeps/arm/bits/link.h	19 Jan 2005 17:54:32 -0000
***************
*** 0 ****
--- 1,57 ----
+ /* 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 ARM.  */
+ typedef struct La_arm_regs
+ {
+   uint32_t lvr_r0;
+   uint32_t lvr_r1;
+   uint32_t lvr_r2;
+   uint32_t lvr_r3;
+ } La_arm_regs;
+ 
+ /* Return values for calls from PLT on ARM.  */
+ typedef struct La_arm_retval
+ {
+   uint32_t lvr_r0;
+   uint32_t lvr_r1;
+ } La_arm_retval;
+ 
+ 
+ __BEGIN_DECLS
+ 
+ extern Elf32_Addr la_arm_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx,
+ 				       uintptr_t *__refcook,
+ 				       uintptr_t *__defcook,
+ 				       La_arm_regs *__regs,
+ 				       unsigned int *__flags,
+ 				       const char *__symname,
+ 				       long int *__framesizep);
+ extern unsigned int la_arm_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx,
+ 					uintptr_t *__refcook,
+ 					uintptr_t *__defcook,
+ 					const La_arm_regs *__inregs,
+ 					La_arm_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 -5 -p -r1.112 ldsodefs.h
*** sysdeps/generic/ldsodefs.h	16 Jan 2005 02:07:29 -0000	1.112
--- sysdeps/generic/ldsodefs.h	19 Jan 2005 17:54:32 -0000
*************** enum allowmask
*** 173,182 ****
--- 173,183 ----
      allow_ldso = 8
    };
  
  
  /* Type for list of auditing interfaces.  */
+ struct La_arm_regs;
  struct La_i86_regs;
  struct La_i86_retval;
  struct La_x86_64_regs;
  struct La_x86_64_retval;
  struct La_ppc32_regs;
*************** struct audit_ifaces
*** 202,211 ****
--- 203,216 ----
      uintptr_t (*symbind64) (Elf64_Sym *, unsigned int, uintptr_t *,
  			    uintptr_t *, unsigned int *, const char *);
    };
    union
    {
+     Elf32_Addr (*arm_gnu_pltenter) (Elf32_Sym *, unsigned int, uintptr_t *,
+ 				    uintptr_t *, struct La_arm_regs *,
+ 				    unsigned int *, const char *name,
+ 				    long int *framesizep);
      Elf32_Addr (*i86_gnu_pltenter) (Elf32_Sym *, unsigned int, uintptr_t *,
  				    uintptr_t *, struct La_i86_regs *,
  				    unsigned int *, const char *name,
  				    long int *framesizep);
      Elf64_Addr (*x86_64_gnu_pltenter) (Elf64_Sym *, unsigned int, uintptr_t *,
*************** struct audit_ifaces
*** 229,238 ****
--- 234,246 ----
  				     unsigned int *, const char *name,
  				     long int *framesizep);
    };
    union
    {
+     unsigned int (*arm_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *,
+ 				     uintptr_t *, const struct La_arm_regs *,
+ 				     struct La_i86_retval *, const char *);
      unsigned int (*i86_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *,
  				     uintptr_t *, const struct La_i86_regs *,
  				     struct La_i86_retval *, const char *);
      unsigned int (*x86_64_gnu_pltexit) (Elf64_Sym *, unsigned int, uintptr_t *,
  					uintptr_t *,

--------------050601050507020101060100--

diff -u -r1.52 dl-machine.h
--- sysdeps/arm/dl-machine.h	15 Mar 2005 22:57:26 -0000	1.52
+++ sysdeps/arm/dl-machine.h	22 Apr 2005 03:38:15 -0000
@@ -129,119 +129,6 @@
 #define BX(x) "mov\tpc, " #x
 #endif
 
-#ifndef PROF
-# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
-	.text\n\
-	.globl _dl_runtime_resolve\n\
-	.type _dl_runtime_resolve, #function\n\
-	.align 2\n\
-_dl_runtime_resolve:\n\
-	@ we get called with\n\
-	@ 	stack[0] contains the return address from this call\n\
-	@	ip contains &GOT[n+3] (pointer to function)\n\
-	@	lr points to &GOT[2]\n\
-\n\
-	@ stack arguments\n\
-	stmdb	sp!,{r0-r3}\n\
-\n\
-	@ get pointer to linker struct\n\
-	ldr	r0, [lr, #-4]\n\
-\n\
-	@ prepare to call fixup()\n\
-	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each\n\
-	sub	r1, ip, lr\n\
-	sub	r1, r1, #4\n\
-	add	r1, r1, r1\n\
-\n\
-	@ call fixup routine\n\
-	bl	fixup\n\
-\n\
-	@ save the return\n\
-	mov	ip, r0\n\
-\n\
-	@ get arguments and return address back\n\
-	ldmia	sp!, {r0-r3,lr}\n\
-\n\
-	@ jump to the newly found address\n\
-	" BX(ip) "\n\
-\n\
-	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
-\n\
-	.globl _dl_runtime_profile\n\
-	.type _dl_runtime_profile, #function\n\
-	.align 2\n\
-_dl_runtime_profile:\n\
-	@ stack arguments\n\
-	stmdb	sp!, {r0-r3}\n\
-\n\
-	@ get pointer to linker struct\n\
-	ldr	r0, [lr, #-4]\n\
-\n\
-	@ prepare to call fixup()\n\
-	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each\n\
-	sub	r1, ip, lr\n\
-	sub	r1, r1, #4\n\
-	add	r1, r1, r1\n\
-\n\
-	@ call profiling fixup routine\n\
-	bl	profile_fixup\n\
-\n\
-	@ save the return\n\
-	mov	ip, r0\n\
-\n\
-	@ get arguments and return address back\n\
-	ldmia	sp!, {r0-r3,lr}\n\
-\n\
-	@ jump to the newly found address\n\
-	" BX(ip) "\n\
-\n\
-	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
-	.previous\n\
-");
-#else // PROF
-# 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 2\n\
-_dl_runtime_resolve:\n\
-_dl_runtime_profile:\n\
-	@ we get called with\n\
-	@ 	stack[0] contains the return address from this call\n\
-	@	ip contains &GOT[n+3] (pointer to function)\n\
-	@	lr points to &GOT[2]\n\
-\n\
-	@ stack arguments\n\
-	stmdb	sp!, {r0-r3}\n\
-\n\
-	@ get pointer to linker struct\n\
-	ldr	r0, [lr, #-4]\n\
-\n\
-	@ prepare to call fixup()\n\
-	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each\n\
-	sub	r1, ip, lr\n\
-	sub	r1, r1, #4\n\
-	add	r1, r1, r1\n\
-\n\
-	@ call profiling fixup routine\n\
-	bl	fixup\n\
-\n\
-	@ save the return\n\
-	mov	ip, r0\n\
-\n\
-	@ get arguments and return address back\n\
-	ldmia	sp!, {r0-r3,lr}\n\
-\n\
-	@ jump to the newly found address\n\
-	" BX(ip) "\n\
-\n\
-	.size _dl_runtime_profile, .-_dl_runtime_profile\n\
-	.previous\n\
-");
-#endif //PROF
-
 /* Mask identifying addresses reserved for the user program,
    where the dynamic linker should not map anything.  */
 #define ELF_MACHINE_USER_ADDRESS_MASK	0xf8000000UL
@@ -348,6 +235,10 @@
   return value;
 }
 
+/* Names of the architecture-specific auditing callback functions.  */
+#define ARCH_LA_PLTENTER arm_gnu_pltenter
+#define ARCH_LA_PLTEXIT arm_gnu_pltexit
+
 #endif /* !dl_machine_h */
 
 
@@ -355,7 +246,7 @@
    Prelinked libraries may use Elf32_Rela though.  */
 #define ELF_MACHINE_NO_RELA defined RTLD_BOOTSTRAP
 
-#ifdef RESOLVE
+#ifdef RESOLVE_MAP
 
 /* Deal with an out-of-range PC24 reloc.  */
 static Elf32_Addr
@@ -425,7 +316,8 @@
 #endif
     {
       const Elf32_Sym *const refsym = sym;
-      Elf32_Addr value = RESOLVE (&sym, version, r_type);
+      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
+      Elf32_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
       if (sym)
 	value += sym->st_value;
 
@@ -535,7 +427,8 @@
 # ifndef RESOLVE_CONFLICT_FIND_MAP
       const Elf32_Sym *const refsym = sym;
 # endif
-      Elf32_Addr value = RESOLVE (&sym, version, r_type);
+      struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
+      Elf32_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
       if (sym)
 	value += sym->st_value;
 
@@ -637,4 +530,4 @@
     _dl_reloc_bad_type (map, r_type, 1);
 }
 
-#endif /* RESOLVE */
+#endif /* RESOLVE_MAP */