1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/patches/glibc/2.2.5/dl-machine-arm.patch Tue May 22 21:16:17 2007 +0000
1.3 @@ -0,0 +1,389 @@
1.4 +Fixes error:
1.5 +In file included from dynamic-link.h:21,
1.6 + from dl-load.c:32:
1.7 +../sysdeps/arm/dl-machine.h:124:25: missing terminating " character
1.8 +...
1.9 +make[2]: *** [/crosstool-0.22/build/arm-unknown-linux-gnu/gcc-3.3-glibc-2.2.5/build-glibc/elf/dl-load.o] Error 1
1.10 +
1.11 +The first two hunks of
1.12 +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.39&r2=1.40&cvsroot=glibc
1.13 +applied cleanly, but the third hunk didn't, so I just added the \n\'s by hand for that section.
1.14 +
1.15 +--- glibc-2.2.5/sysdeps/arm/dl-machine.h.orig Sat Sep 8 14:31:40 2001
1.16 ++++ glibc-2.2.5/sysdeps/arm/dl-machine.h Wed Aug 27 10:55:26 2003
1.17 +@@ -121,14 +121,15 @@
1.18 + and then redirect to the address it returns. */
1.19 + // macro for handling PIC situation....
1.20 + #ifdef PIC
1.21 +-#define CALL_ROUTINE(x) " ldr sl,0f
1.22 +- add sl, pc, sl
1.23 +-1: ldr r2, 2f
1.24 +- mov lr, pc
1.25 +- add pc, sl, r2
1.26 +- b 3f
1.27 +-0: .word _GLOBAL_OFFSET_TABLE_ - 1b - 4
1.28 +-2: .word " #x "(GOTOFF)
1.29 ++#define CALL_ROUTINE(x) "\
1.30 ++ ldr sl,0f\n\
1.31 ++ add sl, pc, sl\n\
1.32 ++1: ldr r2, 2f\n\
1.33 ++ mov lr, pc\n\
1.34 ++ add pc, sl, r2\n\
1.35 ++ b 3f\n\
1.36 ++0: .word _GLOBAL_OFFSET_TABLE_ - 1b - 4\n\
1.37 ++2: .word " #x "(GOTOFF)\n\
1.38 + 3: "
1.39 + #else
1.40 + #define CALL_ROUTINE(x) " bl " #x
1.41 +@@ -136,114 +137,114 @@
1.42 +
1.43 + #ifndef PROF
1.44 + # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
1.45 +- .text
1.46 +- .globl _dl_runtime_resolve
1.47 +- .type _dl_runtime_resolve, #function
1.48 +- .align 2
1.49 +-_dl_runtime_resolve:
1.50 +- @ we get called with
1.51 +- @ stack[0] contains the return address from this call
1.52 +- @ ip contains &GOT[n+3] (pointer to function)
1.53 +- @ lr points to &GOT[2]
1.54 +-
1.55 +- @ save almost everything; lr is already on the stack
1.56 +- stmdb sp!,{r0-r3,sl,fp}
1.57 +-
1.58 +- @ prepare to call fixup()
1.59 +- @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each
1.60 +- sub r1, ip, lr
1.61 +- sub r1, r1, #4
1.62 +- add r1, r1, r1
1.63 +-
1.64 +- @ get pointer to linker struct
1.65 +- ldr r0, [lr, #-4]
1.66 +-
1.67 +- @ call fixup routine
1.68 +- " CALL_ROUTINE(fixup) "
1.69 +-
1.70 +- @ save the return
1.71 +- mov ip, r0
1.72 +-
1.73 +- @ restore the stack
1.74 +- ldmia sp!,{r0-r3,sl,fp,lr}
1.75 +-
1.76 +- @ jump to the newly found address
1.77 +- mov pc, ip
1.78 +-
1.79 +- .size _dl_runtime_resolve, .-_dl_runtime_resolve
1.80 +-
1.81 +- .globl _dl_runtime_profile
1.82 +- .type _dl_runtime_profile, #function
1.83 +- .align 2
1.84 +-_dl_runtime_profile:
1.85 +- @ save almost everything; lr is already on the stack
1.86 +- stmdb sp!,{r0-r3,sl,fp}
1.87 +-
1.88 +- @ prepare to call fixup()
1.89 +- @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each
1.90 +- sub r1, ip, lr
1.91 +- sub r1, r1, #4
1.92 +- add r1, r1, r1
1.93 +-
1.94 +- @ get pointer to linker struct
1.95 +- ldr r0, [lr, #-4]
1.96 +-
1.97 +- @ call profiling fixup routine
1.98 +- " CALL_ROUTINE(profile_fixup) "
1.99 +-
1.100 +- @ save the return
1.101 +- mov ip, r0
1.102 +-
1.103 +- @ restore the stack
1.104 +- ldmia sp!,{r0-r3,sl,fp,lr}
1.105 +-
1.106 +- @ jump to the newly found address
1.107 +- mov pc, ip
1.108 +-
1.109 +- .size _dl_runtime_resolve, .-_dl_runtime_resolve
1.110 +- .previous
1.111 ++ .text\n\
1.112 ++ .globl _dl_runtime_resolve\n\
1.113 ++ .type _dl_runtime_resolve, #function\n\
1.114 ++ .align 2\n\
1.115 ++_dl_runtime_resolve:\n\
1.116 ++ @ we get called with\n\
1.117 ++ @ stack[0] contains the return address from this call\n\
1.118 ++ @ ip contains &GOT[n+3] (pointer to function)\n\
1.119 ++ @ lr points to &GOT[2]\n\
1.120 ++\n\
1.121 ++ @ save almost everything; lr is already on the stack\n\
1.122 ++ stmdb sp!,{r0-r3,sl,fp}\n\
1.123 ++\n\
1.124 ++ @ prepare to call fixup()\n\
1.125 ++ @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\
1.126 ++ sub r1, ip, lr\n\
1.127 ++ sub r1, r1, #4\n\
1.128 ++ add r1, r1, r1\n\
1.129 ++\n\
1.130 ++ @ get pointer to linker struct\n\
1.131 ++ ldr r0, [lr, #-4]\n\
1.132 ++\n\
1.133 ++ @ call fixup routine\n\
1.134 ++ " CALL_ROUTINE(fixup) "\n\
1.135 ++\n\
1.136 ++ @ save the return\n\
1.137 ++ mov ip, r0\n\
1.138 ++\n\
1.139 ++ @ restore the stack\n\
1.140 ++ ldmia sp!,{r0-r3,sl,fp,lr}\n\
1.141 ++\n\
1.142 ++ @ jump to the newly found address\n\
1.143 ++ mov pc, ip\n\
1.144 ++\n\
1.145 ++ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
1.146 ++\n\
1.147 ++ .globl _dl_runtime_profile\n\
1.148 ++ .type _dl_runtime_profile, #function\n\
1.149 ++ .align 2\n\
1.150 ++_dl_runtime_profile:\n\
1.151 ++ @ save almost everything; lr is already on the stack\n\
1.152 ++ stmdb sp!,{r0-r3,sl,fp}\n\
1.153 ++\n\
1.154 ++ @ prepare to call fixup()\n\
1.155 ++ @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\
1.156 ++ sub r1, ip, lr\n\
1.157 ++ sub r1, r1, #4\n\
1.158 ++ add r1, r1, r1\n\
1.159 ++\n\
1.160 ++ @ get pointer to linker struct\n\
1.161 ++ ldr r0, [lr, #-4]\n\
1.162 ++\n\
1.163 ++ @ call profiling fixup routine\n\
1.164 ++ " CALL_ROUTINE(profile_fixup) "\n\
1.165 ++\n\
1.166 ++ @ save the return\n\
1.167 ++ mov ip, r0\n\
1.168 ++\n\
1.169 ++ @ restore the stack\n\
1.170 ++ ldmia sp!,{r0-r3,sl,fp,lr}\n\
1.171 ++\n\
1.172 ++ @ jump to the newly found address\n\
1.173 ++ mov pc, ip\n\
1.174 ++\n\
1.175 ++ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
1.176 ++ .previous\n\
1.177 + ");
1.178 + #else // PROF
1.179 + # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
1.180 +- .text
1.181 +- .globl _dl_runtime_resolve
1.182 +- .globl _dl_runtime_profile
1.183 +- .type _dl_runtime_resolve, #function
1.184 +- .type _dl_runtime_profile, #function
1.185 +- .align 2
1.186 +-_dl_runtime_resolve:
1.187 +-_dl_runtime_profile:
1.188 +- @ we get called with
1.189 +- @ stack[0] contains the return address from this call
1.190 +- @ ip contains &GOT[n+3] (pointer to function)
1.191 +- @ lr points to &GOT[2]
1.192 +-
1.193 +- @ save almost everything; return add is already on the stack
1.194 +- stmdb sp!,{r0-r3,sl,fp}
1.195 +-
1.196 +- @ prepare to call fixup()
1.197 +- @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each
1.198 +- sub r1, ip, lr
1.199 +- sub r1, r1, #4
1.200 +- add r1, r1, r1
1.201 +-
1.202 +- @ get pointer to linker struct
1.203 +- ldr r0, [lr, #-4]
1.204 +-
1.205 +- @ call profiling fixup routine
1.206 +- " CALL_ROUTINE(fixup) "
1.207 +-
1.208 +- @ save the return
1.209 +- mov ip, r0
1.210 +-
1.211 +- @ restore the stack
1.212 +- ldmia sp!,{r0-r3,sl,fp,lr}
1.213 +-
1.214 +- @ jump to the newly found address
1.215 +- mov pc, ip
1.216 +-
1.217 +- .size _dl_runtime_profile, .-_dl_runtime_profile
1.218 +- .previous
1.219 ++ .text\n\
1.220 ++ .globl _dl_runtime_resolve\n\
1.221 ++ .globl _dl_runtime_profile\n\
1.222 ++ .type _dl_runtime_resolve, #function\n\
1.223 ++ .type _dl_runtime_profile, #function\n\
1.224 ++ .align 2\n\
1.225 ++_dl_runtime_resolve:\n\
1.226 ++_dl_runtime_profile:\n\
1.227 ++ @ we get called with\n\
1.228 ++ @ stack[0] contains the return address from this call\n\
1.229 ++ @ ip contains &GOT[n+3] (pointer to function)\n\
1.230 ++ @ lr points to &GOT[2]\n\
1.231 ++\n\
1.232 ++ @ save almost everything; return add is already on the stack\n\
1.233 ++ stmdb sp!,{r0-r3,sl,fp}\n\
1.234 ++\n\
1.235 ++ @ prepare to call fixup()\n\
1.236 ++ @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\
1.237 ++ sub r1, ip, lr\n\
1.238 ++ sub r1, r1, #4\n\
1.239 ++ add r1, r1, r1\n\
1.240 ++\n\
1.241 ++ @ get pointer to linker struct\n\
1.242 ++ ldr r0, [lr, #-4]\n\
1.243 ++\n\
1.244 ++ @ call profiling fixup routine\n\
1.245 ++ " CALL_ROUTINE(fixup) "\n\
1.246 ++\n\
1.247 ++ @ save the return\n\
1.248 ++ mov ip, r0\n\
1.249 ++\n\
1.250 ++ @ restore the stack\n\
1.251 ++ ldmia sp!,{r0-r3,sl,fp,lr}\n\
1.252 ++\n\
1.253 ++ @ jump to the newly found address\n\
1.254 ++ mov pc, ip\n\
1.255 ++\n\
1.256 ++ .size _dl_runtime_profile, .-_dl_runtime_profile\n\
1.257 ++ .previous\n\
1.258 + ");
1.259 + #endif //PROF
1.260 +
1.261 +@@ -256,70 +257,70 @@
1.262 + its return value is the user program's entry point. */
1.263 +
1.264 + #define RTLD_START asm ("\
1.265 +-.text
1.266 +-.globl _start
1.267 +-.globl _dl_start_user
1.268 +-_start:
1.269 +- @ at start time, all the args are on the stack
1.270 +- mov r0, sp
1.271 +- bl _dl_start
1.272 +- @ returns user entry point in r0
1.273 +-_dl_start_user:
1.274 +- mov r6, r0
1.275 +- @ we are PIC code, so get global offset table
1.276 +- ldr sl, .L_GET_GOT
1.277 +- add sl, pc, sl
1.278 +-.L_GOT_GOT:
1.279 +- @ Store the highest stack address
1.280 +- ldr r1, .L_STACK_END
1.281 +- ldr r1, [sl, r1]
1.282 +- str sp, [r1]
1.283 +- @ See if we were run as a command with the executable file
1.284 +- @ name as an extra leading argument.
1.285 +- ldr r4, .L_SKIP_ARGS
1.286 +- ldr r4, [sl, r4]
1.287 +- @ get the original arg count
1.288 +- ldr r1, [sp]
1.289 +- @ subtract _dl_skip_args from it
1.290 +- sub r1, r1, r4
1.291 +- @ adjust the stack pointer to skip them
1.292 +- add sp, sp, r4, lsl #2
1.293 +- @ get the argv address
1.294 +- add r2, sp, #4
1.295 +- @ store the new argc in the new stack location
1.296 +- str r1, [sp]
1.297 +- @ compute envp
1.298 +- add r3, r2, r1, lsl #2
1.299 +- add r3, r3, #4
1.300 +-
1.301 +- @ now we call _dl_init
1.302 +- ldr r0, .L_LOADED
1.303 +- ldr r0, [sl, r0]
1.304 +- ldr r0, [r0]
1.305 +- @ call _dl_init
1.306 +- bl _dl_init(PLT)
1.307 +- @ clear the startup flag
1.308 +- ldr r2, .L_STARTUP_FLAG
1.309 +- ldr r1, [sl, r2]
1.310 +- mov r0, #0
1.311 +- str r0, [r1]
1.312 +- @ load the finalizer function
1.313 +- ldr r0, .L_FINI_PROC
1.314 +- ldr r0, [sl, r0]
1.315 +- @ jump to the user_s entry point
1.316 +- mov pc, r6
1.317 +-.L_GET_GOT:
1.318 ++.text\n\
1.319 ++.globl _start\n\
1.320 ++.globl _dl_start_user\n\
1.321 ++_start:\n\
1.322 ++ @ at start time, all the args are on the stack\n\
1.323 ++ mov r0, sp\n\
1.324 ++ bl _dl_start\n\
1.325 ++ @ returns user entry point in r0\n\
1.326 ++_dl_start_user:\n\
1.327 ++ mov r6, r0\n\
1.328 ++ @ we are PIC code, so get global offset table\n\
1.329 ++ ldr sl, .L_GET_GOT\n\
1.330 ++ add sl, pc, sl\n\
1.331 ++.L_GOT_GOT:\n\
1.332 ++ @ Store the highest stack address\n\
1.333 ++ ldr r1, .L_STACK_END\n\
1.334 ++ ldr r1, [sl, r1]\n\
1.335 ++ str sp, [r1]\n\
1.336 ++ @ See if we were run as a command with the executable file\n\
1.337 ++ @ name as an extra leading argument.\n\
1.338 ++ ldr r4, .L_SKIP_ARGS\n\
1.339 ++ ldr r4, [sl, r4]\n\
1.340 ++ @ get the original arg count\n\
1.341 ++ ldr r1, [sp]\n\
1.342 ++ @ subtract _dl_skip_args from it\n\
1.343 ++ sub r1, r1, r4\n\
1.344 ++ @ adjust the stack pointer to skip them\n\
1.345 ++ add sp, sp, r4, lsl #2\n\
1.346 ++ @ get the argv address\n\
1.347 ++ add r2, sp, #4\n\
1.348 ++ @ store the new argc in the new stack location\n\
1.349 ++ str r1, [sp]\n\
1.350 ++ @ compute envp\n\
1.351 ++ add r3, r2, r1, lsl #2\n\
1.352 ++ add r3, r3, #4\n\
1.353 ++\n\
1.354 ++ @ now we call _dl_init\n\
1.355 ++ ldr r0, .L_LOADED\n\
1.356 ++ ldr r0, [sl, r0]\n\
1.357 ++ ldr r0, [r0]\n\
1.358 ++ @ call _dl_init\n\
1.359 ++ bl _dl_init(PLT)\n\
1.360 ++ @ clear the startup flag\n\
1.361 ++ ldr r2, .L_STARTUP_FLAG\n\
1.362 ++ ldr r1, [sl, r2]\n\
1.363 ++ mov r0, #0\n\
1.364 ++ str r0, [r1]\n\
1.365 ++ @ load the finalizer function\n\
1.366 ++ ldr r0, .L_FINI_PROC\n\
1.367 ++ ldr r0, [sl, r0]\n\
1.368 ++ @ jump to the user_s entry point\n\
1.369 ++ mov pc, r6\n\
1.370 ++.L_GET_GOT:\n\
1.371 + .word _GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4 \n\
1.372 + .L_SKIP_ARGS: \n\
1.373 + .word _dl_skip_args(GOTOFF) \n\
1.374 +-.L_STARTUP_FLAG:
1.375 +- .word _dl_starting_up(GOT)
1.376 +-.L_FINI_PROC:
1.377 +- .word _dl_fini(GOT)
1.378 +-.L_STACK_END:
1.379 +- .word __libc_stack_end(GOT)
1.380 +-.L_LOADED:
1.381 +- .word _dl_loaded(GOT)
1.382 ++.L_STARTUP_FLAG:\n\
1.383 ++ .word _dl_starting_up(GOT)\n\
1.384 ++.L_FINI_PROC:\n\
1.385 ++ .word _dl_fini(GOT)\n\
1.386 ++.L_STACK_END:\n\
1.387 ++ .word __libc_stack_end(GOT)\n\
1.388 ++.L_LOADED:\n\
1.389 ++ .word _dl_loaded(GOT)\n\
1.390 + .previous\n\
1.391 + ");
1.392 +