summaryrefslogtreecommitdiff
path: root/packages/glibc/glibc-cvs/trampoline.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/glibc/glibc-cvs/trampoline.patch')
-rw-r--r--packages/glibc/glibc-cvs/trampoline.patch560
1 files changed, 560 insertions, 0 deletions
diff --git a/packages/glibc/glibc-cvs/trampoline.patch b/packages/glibc/glibc-cvs/trampoline.patch
index e69de29bb2..86cfc0a539 100644
--- a/packages/glibc/glibc-cvs/trampoline.patch
+++ b/packages/glibc/glibc-cvs/trampoline.patch
@@ -0,0 +1,560 @@
+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 */