patches/glibc/2.2.5/dl-machine-arm.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Feb 24 11:00:05 2007 +0000 (2007-02-24)
changeset 1 eeea35fbf182
permissions -rw-r--r--
Add the full crosstool-NG sources to the new repository of its own.
You might just say: 'Yeah! crosstool-NG's got its own repo!".
Unfortunately, that's because the previous repo got damaged beyond repair and I had no backup.
That means I'm putting backups in place in the afternoon.
That also means we've lost history... :-(
yann@1
     1
Fixes error:
yann@1
     2
In file included from dynamic-link.h:21,
yann@1
     3
                 from dl-load.c:32:
yann@1
     4
../sysdeps/arm/dl-machine.h:124:25: missing terminating " character
yann@1
     5
...
yann@1
     6
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
yann@1
     7
yann@1
     8
The first two hunks of 
yann@1
     9
http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.39&r2=1.40&cvsroot=glibc
yann@1
    10
applied cleanly, but the third hunk didn't, so I just added the \n\'s by hand for that section.
yann@1
    11
yann@1
    12
--- glibc-2.2.5/sysdeps/arm/dl-machine.h.orig	Sat Sep  8 14:31:40 2001
yann@1
    13
+++ glibc-2.2.5/sysdeps/arm/dl-machine.h	Wed Aug 27 10:55:26 2003
yann@1
    14
@@ -121,14 +121,15 @@
yann@1
    15
    and then redirect to the address it returns.  */
yann@1
    16
    // macro for handling PIC situation....
yann@1
    17
 #ifdef PIC
yann@1
    18
-#define CALL_ROUTINE(x) " ldr sl,0f
yann@1
    19
-	add 	sl, pc, sl
yann@1
    20
-1:	ldr	r2, 2f
yann@1
    21
-	mov	lr, pc
yann@1
    22
-	add	pc, sl, r2
yann@1
    23
-	b	3f
yann@1
    24
-0:	.word	_GLOBAL_OFFSET_TABLE_ - 1b - 4
yann@1
    25
-2:	.word " #x "(GOTOFF)
yann@1
    26
+#define CALL_ROUTINE(x) "\
yann@1
    27
+	ldr sl,0f\n\
yann@1
    28
+	add 	sl, pc, sl\n\
yann@1
    29
+1:	ldr	r2, 2f\n\
yann@1
    30
+	mov	lr, pc\n\
yann@1
    31
+	add	pc, sl, r2\n\
yann@1
    32
+	b	3f\n\
yann@1
    33
+0:	.word	_GLOBAL_OFFSET_TABLE_ - 1b - 4\n\
yann@1
    34
+2:	.word " #x "(GOTOFF)\n\
yann@1
    35
 3:	"
yann@1
    36
 #else
yann@1
    37
 #define CALL_ROUTINE(x) " bl " #x
yann@1
    38
@@ -136,114 +137,114 @@
yann@1
    39
 
yann@1
    40
 #ifndef PROF
yann@1
    41
 # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
yann@1
    42
-	.text
yann@1
    43
-	.globl _dl_runtime_resolve
yann@1
    44
-	.type _dl_runtime_resolve, #function
yann@1
    45
-	.align 2
yann@1
    46
-_dl_runtime_resolve:
yann@1
    47
-	@ we get called with
yann@1
    48
-	@ 	stack[0] contains the return address from this call
yann@1
    49
-	@	ip contains &GOT[n+3] (pointer to function)
yann@1
    50
-	@	lr points to &GOT[2]
yann@1
    51
-
yann@1
    52
-	@ save almost everything; lr is already on the stack
yann@1
    53
-	stmdb	sp!,{r0-r3,sl,fp}
yann@1
    54
-
yann@1
    55
-	@ prepare to call fixup()
yann@1
    56
-	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each
yann@1
    57
-	sub	r1, ip, lr
yann@1
    58
-	sub	r1, r1, #4
yann@1
    59
-	add	r1, r1, r1
yann@1
    60
-
yann@1
    61
-	@ get pointer to linker struct
yann@1
    62
-	ldr	r0, [lr, #-4]
yann@1
    63
-
yann@1
    64
-	@ call fixup routine
yann@1
    65
-	" CALL_ROUTINE(fixup) "
yann@1
    66
-
yann@1
    67
-	@ save the return
yann@1
    68
-	mov	ip, r0
yann@1
    69
-
yann@1
    70
-	@ restore the stack
yann@1
    71
-	ldmia	sp!,{r0-r3,sl,fp,lr}
yann@1
    72
-
yann@1
    73
-	@ jump to the newly found address
yann@1
    74
-	mov	pc, ip
yann@1
    75
-
yann@1
    76
-	.size _dl_runtime_resolve, .-_dl_runtime_resolve
yann@1
    77
-
yann@1
    78
-	.globl _dl_runtime_profile
yann@1
    79
-	.type _dl_runtime_profile, #function
yann@1
    80
-	.align 2
yann@1
    81
-_dl_runtime_profile:
yann@1
    82
-	@ save almost everything; lr is already on the stack
yann@1
    83
-	stmdb	sp!,{r0-r3,sl,fp}
yann@1
    84
-
yann@1
    85
-	@ prepare to call fixup()
yann@1
    86
-	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each
yann@1
    87
-	sub	r1, ip, lr
yann@1
    88
-	sub	r1, r1, #4
yann@1
    89
-	add	r1, r1, r1
yann@1
    90
-
yann@1
    91
-	@ get pointer to linker struct
yann@1
    92
-	ldr	r0, [lr, #-4]
yann@1
    93
-
yann@1
    94
-	@ call profiling fixup routine
yann@1
    95
-	" CALL_ROUTINE(profile_fixup) "
yann@1
    96
-
yann@1
    97
-	@ save the return
yann@1
    98
-	mov	ip, r0
yann@1
    99
-
yann@1
   100
-	@ restore the stack
yann@1
   101
-	ldmia	sp!,{r0-r3,sl,fp,lr}
yann@1
   102
-
yann@1
   103
-	@ jump to the newly found address
yann@1
   104
-	mov	pc, ip
yann@1
   105
-
yann@1
   106
-	.size _dl_runtime_resolve, .-_dl_runtime_resolve
yann@1
   107
-	.previous
yann@1
   108
+	.text\n\
yann@1
   109
+	.globl _dl_runtime_resolve\n\
yann@1
   110
+	.type _dl_runtime_resolve, #function\n\
yann@1
   111
+	.align 2\n\
yann@1
   112
+_dl_runtime_resolve:\n\
yann@1
   113
+	@ we get called with\n\
yann@1
   114
+	@ 	stack[0] contains the return address from this call\n\
yann@1
   115
+	@	ip contains &GOT[n+3] (pointer to function)\n\
yann@1
   116
+	@	lr points to &GOT[2]\n\
yann@1
   117
+\n\
yann@1
   118
+	@ save almost everything; lr is already on the stack\n\
yann@1
   119
+	stmdb	sp!,{r0-r3,sl,fp}\n\
yann@1
   120
+\n\
yann@1
   121
+	@ prepare to call fixup()\n\
yann@1
   122
+	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each\n\
yann@1
   123
+	sub	r1, ip, lr\n\
yann@1
   124
+	sub	r1, r1, #4\n\
yann@1
   125
+	add	r1, r1, r1\n\
yann@1
   126
+\n\
yann@1
   127
+	@ get pointer to linker struct\n\
yann@1
   128
+	ldr	r0, [lr, #-4]\n\
yann@1
   129
+\n\
yann@1
   130
+	@ call fixup routine\n\
yann@1
   131
+	" CALL_ROUTINE(fixup) "\n\
yann@1
   132
+\n\
yann@1
   133
+	@ save the return\n\
yann@1
   134
+	mov	ip, r0\n\
yann@1
   135
+\n\
yann@1
   136
+	@ restore the stack\n\
yann@1
   137
+	ldmia	sp!,{r0-r3,sl,fp,lr}\n\
yann@1
   138
+\n\
yann@1
   139
+	@ jump to the newly found address\n\
yann@1
   140
+	mov	pc, ip\n\
yann@1
   141
+\n\
yann@1
   142
+	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
yann@1
   143
+\n\
yann@1
   144
+	.globl _dl_runtime_profile\n\
yann@1
   145
+	.type _dl_runtime_profile, #function\n\
yann@1
   146
+	.align 2\n\
yann@1
   147
+_dl_runtime_profile:\n\
yann@1
   148
+	@ save almost everything; lr is already on the stack\n\
yann@1
   149
+	stmdb	sp!,{r0-r3,sl,fp}\n\
yann@1
   150
+\n\
yann@1
   151
+	@ prepare to call fixup()\n\
yann@1
   152
+	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each\n\
yann@1
   153
+	sub	r1, ip, lr\n\
yann@1
   154
+	sub	r1, r1, #4\n\
yann@1
   155
+	add	r1, r1, r1\n\
yann@1
   156
+\n\
yann@1
   157
+	@ get pointer to linker struct\n\
yann@1
   158
+	ldr	r0, [lr, #-4]\n\
yann@1
   159
+\n\
yann@1
   160
+	@ call profiling fixup routine\n\
yann@1
   161
+	" CALL_ROUTINE(profile_fixup) "\n\
yann@1
   162
+\n\
yann@1
   163
+	@ save the return\n\
yann@1
   164
+	mov	ip, r0\n\
yann@1
   165
+\n\
yann@1
   166
+	@ restore the stack\n\
yann@1
   167
+	ldmia	sp!,{r0-r3,sl,fp,lr}\n\
yann@1
   168
+\n\
yann@1
   169
+	@ jump to the newly found address\n\
yann@1
   170
+	mov	pc, ip\n\
yann@1
   171
+\n\
yann@1
   172
+	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
yann@1
   173
+	.previous\n\
yann@1
   174
 ");
yann@1
   175
 #else // PROF
yann@1
   176
 # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
yann@1
   177
-	.text
yann@1
   178
-	.globl _dl_runtime_resolve
yann@1
   179
-	.globl _dl_runtime_profile
yann@1
   180
-	.type _dl_runtime_resolve, #function
yann@1
   181
-	.type _dl_runtime_profile, #function
yann@1
   182
-	.align 2
yann@1
   183
-_dl_runtime_resolve:
yann@1
   184
-_dl_runtime_profile:
yann@1
   185
-	@ we get called with
yann@1
   186
-	@ 	stack[0] contains the return address from this call
yann@1
   187
-	@	ip contains &GOT[n+3] (pointer to function)
yann@1
   188
-	@	lr points to &GOT[2]
yann@1
   189
-
yann@1
   190
-	@ save almost everything; return add is already on the stack
yann@1
   191
-	stmdb	sp!,{r0-r3,sl,fp}
yann@1
   192
-
yann@1
   193
-	@ prepare to call fixup()
yann@1
   194
-	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each
yann@1
   195
-	sub	r1, ip, lr
yann@1
   196
-	sub	r1, r1, #4
yann@1
   197
-	add	r1, r1, r1
yann@1
   198
-
yann@1
   199
-	@ get pointer to linker struct
yann@1
   200
-	ldr	r0, [lr, #-4]
yann@1
   201
-
yann@1
   202
-	@ call profiling fixup routine
yann@1
   203
-	" CALL_ROUTINE(fixup) "
yann@1
   204
-
yann@1
   205
-	@ save the return
yann@1
   206
-	mov	ip, r0
yann@1
   207
-
yann@1
   208
-	@ restore the stack
yann@1
   209
-	ldmia	sp!,{r0-r3,sl,fp,lr}
yann@1
   210
-
yann@1
   211
-	@ jump to the newly found address
yann@1
   212
-	mov	pc, ip
yann@1
   213
-
yann@1
   214
-	.size _dl_runtime_profile, .-_dl_runtime_profile
yann@1
   215
-	.previous
yann@1
   216
+	.text\n\
yann@1
   217
+	.globl _dl_runtime_resolve\n\
yann@1
   218
+	.globl _dl_runtime_profile\n\
yann@1
   219
+	.type _dl_runtime_resolve, #function\n\
yann@1
   220
+	.type _dl_runtime_profile, #function\n\
yann@1
   221
+	.align 2\n\
yann@1
   222
+_dl_runtime_resolve:\n\
yann@1
   223
+_dl_runtime_profile:\n\
yann@1
   224
+	@ we get called with\n\
yann@1
   225
+	@ 	stack[0] contains the return address from this call\n\
yann@1
   226
+	@	ip contains &GOT[n+3] (pointer to function)\n\
yann@1
   227
+	@	lr points to &GOT[2]\n\
yann@1
   228
+\n\
yann@1
   229
+	@ save almost everything; return add is already on the stack\n\
yann@1
   230
+	stmdb	sp!,{r0-r3,sl,fp}\n\
yann@1
   231
+\n\
yann@1
   232
+	@ prepare to call fixup()\n\
yann@1
   233
+	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each\n\
yann@1
   234
+	sub	r1, ip, lr\n\
yann@1
   235
+	sub	r1, r1, #4\n\
yann@1
   236
+	add	r1, r1, r1\n\
yann@1
   237
+\n\
yann@1
   238
+	@ get pointer to linker struct\n\
yann@1
   239
+	ldr	r0, [lr, #-4]\n\
yann@1
   240
+\n\
yann@1
   241
+	@ call profiling fixup routine\n\
yann@1
   242
+	" CALL_ROUTINE(fixup) "\n\
yann@1
   243
+\n\
yann@1
   244
+	@ save the return\n\
yann@1
   245
+	mov	ip, r0\n\
yann@1
   246
+\n\
yann@1
   247
+	@ restore the stack\n\
yann@1
   248
+	ldmia	sp!,{r0-r3,sl,fp,lr}\n\
yann@1
   249
+\n\
yann@1
   250
+	@ jump to the newly found address\n\
yann@1
   251
+	mov	pc, ip\n\
yann@1
   252
+\n\
yann@1
   253
+	.size _dl_runtime_profile, .-_dl_runtime_profile\n\
yann@1
   254
+	.previous\n\
yann@1
   255
 ");
yann@1
   256
 #endif //PROF
yann@1
   257
 
yann@1
   258
@@ -256,70 +257,70 @@
yann@1
   259
    its return value is the user program's entry point.  */
yann@1
   260
 
yann@1
   261
 #define RTLD_START asm ("\
yann@1
   262
-.text
yann@1
   263
-.globl _start
yann@1
   264
-.globl _dl_start_user
yann@1
   265
-_start:
yann@1
   266
-	@ at start time, all the args are on the stack
yann@1
   267
-	mov	r0, sp
yann@1
   268
-	bl	_dl_start
yann@1
   269
-	@ returns user entry point in r0
yann@1
   270
-_dl_start_user:
yann@1
   271
-	mov	r6, r0
yann@1
   272
-	@ we are PIC code, so get global offset table
yann@1
   273
-	ldr	sl, .L_GET_GOT
yann@1
   274
-	add	sl, pc, sl
yann@1
   275
-.L_GOT_GOT:
yann@1
   276
-	@ Store the highest stack address
yann@1
   277
-	ldr	r1, .L_STACK_END
yann@1
   278
-	ldr	r1, [sl, r1]
yann@1
   279
-	str	sp, [r1]
yann@1
   280
-	@ See if we were run as a command with the executable file
yann@1
   281
-	@ name as an extra leading argument.
yann@1
   282
-	ldr	r4, .L_SKIP_ARGS
yann@1
   283
-	ldr	r4, [sl, r4]
yann@1
   284
-	@ get the original arg count
yann@1
   285
-	ldr	r1, [sp]
yann@1
   286
-	@ subtract _dl_skip_args from it
yann@1
   287
-	sub	r1, r1, r4
yann@1
   288
-	@ adjust the stack pointer to skip them
yann@1
   289
-	add	sp, sp, r4, lsl #2
yann@1
   290
-	@ get the argv address
yann@1
   291
-	add	r2, sp, #4
yann@1
   292
-	@ store the new argc in the new stack location
yann@1
   293
-	str	r1, [sp]
yann@1
   294
-	@ compute envp
yann@1
   295
-	add	r3, r2, r1, lsl #2
yann@1
   296
-	add	r3, r3, #4
yann@1
   297
-
yann@1
   298
-	@ now we call _dl_init
yann@1
   299
-	ldr	r0, .L_LOADED
yann@1
   300
-	ldr	r0, [sl, r0]
yann@1
   301
-	ldr	r0, [r0]
yann@1
   302
-	@ call _dl_init
yann@1
   303
-	bl	_dl_init(PLT)
yann@1
   304
-	@ clear the startup flag
yann@1
   305
-	ldr	r2, .L_STARTUP_FLAG
yann@1
   306
-	ldr	r1, [sl, r2]
yann@1
   307
-	mov	r0, #0
yann@1
   308
-	str	r0, [r1]
yann@1
   309
-	@ load the finalizer function
yann@1
   310
-	ldr	r0, .L_FINI_PROC
yann@1
   311
-	ldr	r0, [sl, r0]
yann@1
   312
-	@ jump to the user_s entry point
yann@1
   313
-	mov	pc, r6
yann@1
   314
-.L_GET_GOT:
yann@1
   315
+.text\n\
yann@1
   316
+.globl _start\n\
yann@1
   317
+.globl _dl_start_user\n\
yann@1
   318
+_start:\n\
yann@1
   319
+	@ at start time, all the args are on the stack\n\
yann@1
   320
+	mov	r0, sp\n\
yann@1
   321
+	bl	_dl_start\n\
yann@1
   322
+	@ returns user entry point in r0\n\
yann@1
   323
+_dl_start_user:\n\
yann@1
   324
+	mov	r6, r0\n\
yann@1
   325
+	@ we are PIC code, so get global offset table\n\
yann@1
   326
+	ldr	sl, .L_GET_GOT\n\
yann@1
   327
+	add	sl, pc, sl\n\
yann@1
   328
+.L_GOT_GOT:\n\
yann@1
   329
+	@ Store the highest stack address\n\
yann@1
   330
+	ldr	r1, .L_STACK_END\n\
yann@1
   331
+	ldr	r1, [sl, r1]\n\
yann@1
   332
+	str	sp, [r1]\n\
yann@1
   333
+	@ See if we were run as a command with the executable file\n\
yann@1
   334
+	@ name as an extra leading argument.\n\
yann@1
   335
+	ldr	r4, .L_SKIP_ARGS\n\
yann@1
   336
+	ldr	r4, [sl, r4]\n\
yann@1
   337
+	@ get the original arg count\n\
yann@1
   338
+	ldr	r1, [sp]\n\
yann@1
   339
+	@ subtract _dl_skip_args from it\n\
yann@1
   340
+	sub	r1, r1, r4\n\
yann@1
   341
+	@ adjust the stack pointer to skip them\n\
yann@1
   342
+	add	sp, sp, r4, lsl #2\n\
yann@1
   343
+	@ get the argv address\n\
yann@1
   344
+	add	r2, sp, #4\n\
yann@1
   345
+	@ store the new argc in the new stack location\n\
yann@1
   346
+	str	r1, [sp]\n\
yann@1
   347
+	@ compute envp\n\
yann@1
   348
+	add	r3, r2, r1, lsl #2\n\
yann@1
   349
+	add	r3, r3, #4\n\
yann@1
   350
+\n\
yann@1
   351
+	@ now we call _dl_init\n\
yann@1
   352
+	ldr	r0, .L_LOADED\n\
yann@1
   353
+	ldr	r0, [sl, r0]\n\
yann@1
   354
+	ldr	r0, [r0]\n\
yann@1
   355
+	@ call _dl_init\n\
yann@1
   356
+	bl	_dl_init(PLT)\n\
yann@1
   357
+	@ clear the startup flag\n\
yann@1
   358
+	ldr	r2, .L_STARTUP_FLAG\n\
yann@1
   359
+	ldr	r1, [sl, r2]\n\
yann@1
   360
+	mov	r0, #0\n\
yann@1
   361
+	str	r0, [r1]\n\
yann@1
   362
+	@ load the finalizer function\n\
yann@1
   363
+	ldr	r0, .L_FINI_PROC\n\
yann@1
   364
+	ldr	r0, [sl, r0]\n\
yann@1
   365
+	@ jump to the user_s entry point\n\
yann@1
   366
+	mov	pc, r6\n\
yann@1
   367
+.L_GET_GOT:\n\
yann@1
   368
 	.word	_GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4	\n\
yann@1
   369
 .L_SKIP_ARGS:					\n\
yann@1
   370
 	.word	_dl_skip_args(GOTOFF)		\n\
yann@1
   371
-.L_STARTUP_FLAG:
yann@1
   372
-	.word	_dl_starting_up(GOT)
yann@1
   373
-.L_FINI_PROC:
yann@1
   374
-	.word	_dl_fini(GOT)
yann@1
   375
-.L_STACK_END:
yann@1
   376
-	.word	__libc_stack_end(GOT)
yann@1
   377
-.L_LOADED:
yann@1
   378
-	.word	_dl_loaded(GOT)
yann@1
   379
+.L_STARTUP_FLAG:\n\
yann@1
   380
+	.word	_dl_starting_up(GOT)\n\
yann@1
   381
+.L_FINI_PROC:\n\
yann@1
   382
+	.word	_dl_fini(GOT)\n\
yann@1
   383
+.L_STACK_END:\n\
yann@1
   384
+	.word	__libc_stack_end(GOT)\n\
yann@1
   385
+.L_LOADED:\n\
yann@1
   386
+	.word	_dl_loaded(GOT)\n\
yann@1
   387
 .previous\n\
yann@1
   388
 ");
yann@1
   389