summaryrefslogtreecommitdiff
path: root/recipes/glibc/glibc-2.2.5/dl-machine-arm.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/glibc/glibc-2.2.5/dl-machine-arm.patch')
-rw-r--r--recipes/glibc/glibc-2.2.5/dl-machine-arm.patch383
1 files changed, 383 insertions, 0 deletions
diff --git a/recipes/glibc/glibc-2.2.5/dl-machine-arm.patch b/recipes/glibc/glibc-2.2.5/dl-machine-arm.patch
new file mode 100644
index 0000000000..7684b43b39
--- /dev/null
+++ b/recipes/glibc/glibc-2.2.5/dl-machine-arm.patch
@@ -0,0 +1,383 @@
+
+#
+# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher
+#
+
+--- glibc-2.2.5/sysdeps/arm/dl-machine.h~dl-machine-arm.patch 2004-09-03 19:00:33.000000000 -0500
++++ glibc-2.2.5/sysdeps/arm/dl-machine.h 2004-09-03 19:00:37.000000000 -0500
+@@ -121,14 +121,15 @@
+ and then redirect to the address it returns. */
+ // macro for handling PIC situation....
+ #ifdef PIC
+-#define CALL_ROUTINE(x) " ldr sl,0f
+- add sl, pc, sl
+-1: ldr r2, 2f
+- mov lr, pc
+- add pc, sl, r2
+- b 3f
+-0: .word _GLOBAL_OFFSET_TABLE_ - 1b - 4
+-2: .word " #x "(GOTOFF)
++#define CALL_ROUTINE(x) "\
++ ldr sl,0f\n\
++ add sl, pc, sl\n\
++1: ldr r2, 2f\n\
++ mov lr, pc\n\
++ add pc, sl, r2\n\
++ b 3f\n\
++0: .word _GLOBAL_OFFSET_TABLE_ - 1b - 4\n\
++2: .word " #x "(GOTOFF)\n\
+ 3: "
+ #else
+ #define CALL_ROUTINE(x) " bl " #x
+@@ -136,114 +137,114 @@
+
+ #ifndef PROF
+ # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+- .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]
+-
+- @ save almost everything; lr is already on the stack
+- stmdb sp!,{r0-r3,sl,fp}
+-
+- @ prepare to call 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
+-
+- @ get pointer to linker struct
+- ldr r0, [lr, #-4]
+-
+- @ call fixup routine
+- " CALL_ROUTINE(fixup) "
+-
+- @ save the return
+- mov ip, r0
+-
+- @ restore the stack
+- ldmia sp!,{r0-r3,sl,fp,lr}
+-
+- @ jump to the newly found address
+- mov pc, ip
+-
+- .size _dl_runtime_resolve, .-_dl_runtime_resolve
+-
+- .globl _dl_runtime_profile
+- .type _dl_runtime_profile, #function
+- .align 2
+-_dl_runtime_profile:
+- @ save almost everything; lr is already on the stack
+- stmdb sp!,{r0-r3,sl,fp}
+-
+- @ prepare to call 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
+-
+- @ get pointer to linker struct
+- ldr r0, [lr, #-4]
+-
+- @ call profiling fixup routine
+- " CALL_ROUTINE(profile_fixup) "
+-
+- @ save the return
+- mov ip, r0
+-
+- @ restore the stack
+- ldmia sp!,{r0-r3,sl,fp,lr}
+-
+- @ jump to the newly found address
+- mov pc, ip
+-
+- .size _dl_runtime_resolve, .-_dl_runtime_resolve
+- .previous
++ .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\
++ @ save almost everything; lr is already on the stack\n\
++ stmdb sp!,{r0-r3,sl,fp}\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\
++ @ get pointer to linker struct\n\
++ ldr r0, [lr, #-4]\n\
++\n\
++ @ call fixup routine\n\
++ " CALL_ROUTINE(fixup) "\n\
++\n\
++ @ save the return\n\
++ mov ip, r0\n\
++\n\
++ @ restore the stack\n\
++ ldmia sp!,{r0-r3,sl,fp,lr}\n\
++\n\
++ @ jump to the newly found address\n\
++ mov pc, 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\
++ @ save almost everything; lr is already on the stack\n\
++ stmdb sp!,{r0-r3,sl,fp}\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\
++ @ get pointer to linker struct\n\
++ ldr r0, [lr, #-4]\n\
++\n\
++ @ call profiling fixup routine\n\
++ " CALL_ROUTINE(profile_fixup) "\n\
++\n\
++ @ save the return\n\
++ mov ip, r0\n\
++\n\
++ @ restore the stack\n\
++ ldmia sp!,{r0-r3,sl,fp,lr}\n\
++\n\
++ @ jump to the newly found address\n\
++ mov pc, ip\n\
++\n\
++ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
++ .previous\n\
+ ");
+ #else // PROF
+ # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+- .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]
+-
+- @ save almost everything; return add is already on the stack
+- stmdb sp!,{r0-r3,sl,fp}
+-
+- @ prepare to call 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
+-
+- @ get pointer to linker struct
+- ldr r0, [lr, #-4]
+-
+- @ call profiling fixup routine
+- " CALL_ROUTINE(fixup) "
+-
+- @ save the return
+- mov ip, r0
+-
+- @ restore the stack
+- ldmia sp!,{r0-r3,sl,fp,lr}
+-
+- @ jump to the newly found address
+- mov pc, ip
+-
+- .size _dl_runtime_profile, .-_dl_runtime_profile
+- .previous
++ .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\
++ @ save almost everything; return add is already on the stack\n\
++ stmdb sp!,{r0-r3,sl,fp}\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\
++ @ get pointer to linker struct\n\
++ ldr r0, [lr, #-4]\n\
++\n\
++ @ call profiling fixup routine\n\
++ " CALL_ROUTINE(fixup) "\n\
++\n\
++ @ save the return\n\
++ mov ip, r0\n\
++\n\
++ @ restore the stack\n\
++ ldmia sp!,{r0-r3,sl,fp,lr}\n\
++\n\
++ @ jump to the newly found address\n\
++ mov pc, ip\n\
++\n\
++ .size _dl_runtime_profile, .-_dl_runtime_profile\n\
++ .previous\n\
+ ");
+ #endif //PROF
+
+@@ -256,70 +257,70 @@
+ its return value is the user program's entry point. */
+
+ #define RTLD_START asm ("\
+-.text
+-.globl _start
+-.globl _dl_start_user
+-_start:
+- @ at start time, all the args are on the stack
+- mov r0, sp
+- bl _dl_start
+- @ returns user entry point in r0
+-_dl_start_user:
+- mov r6, r0
+- @ we are PIC code, so get global offset table
+- ldr sl, .L_GET_GOT
+- add sl, pc, sl
+-.L_GOT_GOT:
+- @ Store the highest stack address
+- ldr r1, .L_STACK_END
+- ldr r1, [sl, r1]
+- str sp, [r1]
+- @ See if we were run as a command with the executable file
+- @ name as an extra leading argument.
+- ldr r4, .L_SKIP_ARGS
+- ldr r4, [sl, r4]
+- @ get the original arg count
+- ldr r1, [sp]
+- @ subtract _dl_skip_args from it
+- sub r1, r1, r4
+- @ adjust the stack pointer to skip them
+- add sp, sp, r4, lsl #2
+- @ get the argv address
+- add r2, sp, #4
+- @ store the new argc in the new stack location
+- str r1, [sp]
+- @ compute envp
+- add r3, r2, r1, lsl #2
+- add r3, r3, #4
+-
+- @ now we call _dl_init
+- ldr r0, .L_LOADED
+- ldr r0, [sl, r0]
+- ldr r0, [r0]
+- @ call _dl_init
+- bl _dl_init(PLT)
+- @ clear the startup flag
+- ldr r2, .L_STARTUP_FLAG
+- ldr r1, [sl, r2]
+- mov r0, #0
+- str r0, [r1]
+- @ load the finalizer function
+- ldr r0, .L_FINI_PROC
+- ldr r0, [sl, r0]
+- @ jump to the user_s entry point
+- mov pc, r6
+-.L_GET_GOT:
++.text\n\
++.globl _start\n\
++.globl _dl_start_user\n\
++_start:\n\
++ @ at start time, all the args are on the stack\n\
++ mov r0, sp\n\
++ bl _dl_start\n\
++ @ returns user entry point in r0\n\
++_dl_start_user:\n\
++ mov r6, r0\n\
++ @ we are PIC code, so get global offset table\n\
++ ldr sl, .L_GET_GOT\n\
++ add sl, pc, sl\n\
++.L_GOT_GOT:\n\
++ @ Store the highest stack address\n\
++ ldr r1, .L_STACK_END\n\
++ ldr r1, [sl, r1]\n\
++ str sp, [r1]\n\
++ @ See if we were run as a command with the executable file\n\
++ @ name as an extra leading argument.\n\
++ ldr r4, .L_SKIP_ARGS\n\
++ ldr r4, [sl, r4]\n\
++ @ get the original arg count\n\
++ ldr r1, [sp]\n\
++ @ subtract _dl_skip_args from it\n\
++ sub r1, r1, r4\n\
++ @ adjust the stack pointer to skip them\n\
++ add sp, sp, r4, lsl #2\n\
++ @ get the argv address\n\
++ add r2, sp, #4\n\
++ @ store the new argc in the new stack location\n\
++ str r1, [sp]\n\
++ @ compute envp\n\
++ add r3, r2, r1, lsl #2\n\
++ add r3, r3, #4\n\
++\n\
++ @ now we call _dl_init\n\
++ ldr r0, .L_LOADED\n\
++ ldr r0, [sl, r0]\n\
++ ldr r0, [r0]\n\
++ @ call _dl_init\n\
++ bl _dl_init(PLT)\n\
++ @ clear the startup flag\n\
++ ldr r2, .L_STARTUP_FLAG\n\
++ ldr r1, [sl, r2]\n\
++ mov r0, #0\n\
++ str r0, [r1]\n\
++ @ load the finalizer function\n\
++ ldr r0, .L_FINI_PROC\n\
++ ldr r0, [sl, r0]\n\
++ @ jump to the user_s entry point\n\
++ mov pc, r6\n\
++.L_GET_GOT:\n\
+ .word _GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4 \n\
+ .L_SKIP_ARGS: \n\
+ .word _dl_skip_args(GOTOFF) \n\
+-.L_STARTUP_FLAG:
+- .word _dl_starting_up(GOT)
+-.L_FINI_PROC:
+- .word _dl_fini(GOT)
+-.L_STACK_END:
+- .word __libc_stack_end(GOT)
+-.L_LOADED:
+- .word _dl_loaded(GOT)
++.L_STARTUP_FLAG:\n\
++ .word _dl_starting_up(GOT)\n\
++.L_FINI_PROC:\n\
++ .word _dl_fini(GOT)\n\
++.L_STACK_END:\n\
++ .word __libc_stack_end(GOT)\n\
++.L_LOADED:\n\
++ .word _dl_loaded(GOT)\n\
+ .previous\n\
+ ");
+