yann@1: Fixes error: yann@1: In file included from dynamic-link.h:21, yann@1: from dl-load.c:32: yann@1: ../sysdeps/arm/dl-machine.h:124:25: missing terminating " character yann@1: ... yann@1: 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: yann@1: The first two hunks of yann@1: 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: applied cleanly, but the third hunk didn't, so I just added the \n\'s by hand for that section. yann@1: yann@1: --- glibc-2.2.5/sysdeps/arm/dl-machine.h.orig Sat Sep 8 14:31:40 2001 yann@1: +++ glibc-2.2.5/sysdeps/arm/dl-machine.h Wed Aug 27 10:55:26 2003 yann@1: @@ -121,14 +121,15 @@ yann@1: and then redirect to the address it returns. */ yann@1: // macro for handling PIC situation.... yann@1: #ifdef PIC yann@1: -#define CALL_ROUTINE(x) " ldr sl,0f yann@1: - add sl, pc, sl yann@1: -1: ldr r2, 2f yann@1: - mov lr, pc yann@1: - add pc, sl, r2 yann@1: - b 3f yann@1: -0: .word _GLOBAL_OFFSET_TABLE_ - 1b - 4 yann@1: -2: .word " #x "(GOTOFF) yann@1: +#define CALL_ROUTINE(x) "\ yann@1: + ldr sl,0f\n\ yann@1: + add sl, pc, sl\n\ yann@1: +1: ldr r2, 2f\n\ yann@1: + mov lr, pc\n\ yann@1: + add pc, sl, r2\n\ yann@1: + b 3f\n\ yann@1: +0: .word _GLOBAL_OFFSET_TABLE_ - 1b - 4\n\ yann@1: +2: .word " #x "(GOTOFF)\n\ yann@1: 3: " yann@1: #else yann@1: #define CALL_ROUTINE(x) " bl " #x yann@1: @@ -136,114 +137,114 @@ yann@1: yann@1: #ifndef PROF yann@1: # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ yann@1: - .text yann@1: - .globl _dl_runtime_resolve yann@1: - .type _dl_runtime_resolve, #function yann@1: - .align 2 yann@1: -_dl_runtime_resolve: yann@1: - @ we get called with yann@1: - @ stack[0] contains the return address from this call yann@1: - @ ip contains &GOT[n+3] (pointer to function) yann@1: - @ lr points to &GOT[2] yann@1: - yann@1: - @ save almost everything; lr is already on the stack yann@1: - stmdb sp!,{r0-r3,sl,fp} yann@1: - yann@1: - @ prepare to call fixup() yann@1: - @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each yann@1: - sub r1, ip, lr yann@1: - sub r1, r1, #4 yann@1: - add r1, r1, r1 yann@1: - yann@1: - @ get pointer to linker struct yann@1: - ldr r0, [lr, #-4] yann@1: - yann@1: - @ call fixup routine yann@1: - " CALL_ROUTINE(fixup) " yann@1: - yann@1: - @ save the return yann@1: - mov ip, r0 yann@1: - yann@1: - @ restore the stack yann@1: - ldmia sp!,{r0-r3,sl,fp,lr} yann@1: - yann@1: - @ jump to the newly found address yann@1: - mov pc, ip yann@1: - yann@1: - .size _dl_runtime_resolve, .-_dl_runtime_resolve yann@1: - yann@1: - .globl _dl_runtime_profile yann@1: - .type _dl_runtime_profile, #function yann@1: - .align 2 yann@1: -_dl_runtime_profile: yann@1: - @ save almost everything; lr is already on the stack yann@1: - stmdb sp!,{r0-r3,sl,fp} yann@1: - yann@1: - @ prepare to call fixup() yann@1: - @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each yann@1: - sub r1, ip, lr yann@1: - sub r1, r1, #4 yann@1: - add r1, r1, r1 yann@1: - yann@1: - @ get pointer to linker struct yann@1: - ldr r0, [lr, #-4] yann@1: - yann@1: - @ call profiling fixup routine yann@1: - " CALL_ROUTINE(profile_fixup) " yann@1: - yann@1: - @ save the return yann@1: - mov ip, r0 yann@1: - yann@1: - @ restore the stack yann@1: - ldmia sp!,{r0-r3,sl,fp,lr} yann@1: - yann@1: - @ jump to the newly found address yann@1: - mov pc, ip yann@1: - yann@1: - .size _dl_runtime_resolve, .-_dl_runtime_resolve yann@1: - .previous yann@1: + .text\n\ yann@1: + .globl _dl_runtime_resolve\n\ yann@1: + .type _dl_runtime_resolve, #function\n\ yann@1: + .align 2\n\ yann@1: +_dl_runtime_resolve:\n\ yann@1: + @ we get called with\n\ yann@1: + @ stack[0] contains the return address from this call\n\ yann@1: + @ ip contains &GOT[n+3] (pointer to function)\n\ yann@1: + @ lr points to &GOT[2]\n\ yann@1: +\n\ yann@1: + @ save almost everything; lr is already on the stack\n\ yann@1: + stmdb sp!,{r0-r3,sl,fp}\n\ yann@1: +\n\ yann@1: + @ prepare to call fixup()\n\ yann@1: + @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\ yann@1: + sub r1, ip, lr\n\ yann@1: + sub r1, r1, #4\n\ yann@1: + add r1, r1, r1\n\ yann@1: +\n\ yann@1: + @ get pointer to linker struct\n\ yann@1: + ldr r0, [lr, #-4]\n\ yann@1: +\n\ yann@1: + @ call fixup routine\n\ yann@1: + " CALL_ROUTINE(fixup) "\n\ yann@1: +\n\ yann@1: + @ save the return\n\ yann@1: + mov ip, r0\n\ yann@1: +\n\ yann@1: + @ restore the stack\n\ yann@1: + ldmia sp!,{r0-r3,sl,fp,lr}\n\ yann@1: +\n\ yann@1: + @ jump to the newly found address\n\ yann@1: + mov pc, ip\n\ yann@1: +\n\ yann@1: + .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ yann@1: +\n\ yann@1: + .globl _dl_runtime_profile\n\ yann@1: + .type _dl_runtime_profile, #function\n\ yann@1: + .align 2\n\ yann@1: +_dl_runtime_profile:\n\ yann@1: + @ save almost everything; lr is already on the stack\n\ yann@1: + stmdb sp!,{r0-r3,sl,fp}\n\ yann@1: +\n\ yann@1: + @ prepare to call fixup()\n\ yann@1: + @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\ yann@1: + sub r1, ip, lr\n\ yann@1: + sub r1, r1, #4\n\ yann@1: + add r1, r1, r1\n\ yann@1: +\n\ yann@1: + @ get pointer to linker struct\n\ yann@1: + ldr r0, [lr, #-4]\n\ yann@1: +\n\ yann@1: + @ call profiling fixup routine\n\ yann@1: + " CALL_ROUTINE(profile_fixup) "\n\ yann@1: +\n\ yann@1: + @ save the return\n\ yann@1: + mov ip, r0\n\ yann@1: +\n\ yann@1: + @ restore the stack\n\ yann@1: + ldmia sp!,{r0-r3,sl,fp,lr}\n\ yann@1: +\n\ yann@1: + @ jump to the newly found address\n\ yann@1: + mov pc, ip\n\ yann@1: +\n\ yann@1: + .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ yann@1: + .previous\n\ yann@1: "); yann@1: #else // PROF yann@1: # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ yann@1: - .text yann@1: - .globl _dl_runtime_resolve yann@1: - .globl _dl_runtime_profile yann@1: - .type _dl_runtime_resolve, #function yann@1: - .type _dl_runtime_profile, #function yann@1: - .align 2 yann@1: -_dl_runtime_resolve: yann@1: -_dl_runtime_profile: yann@1: - @ we get called with yann@1: - @ stack[0] contains the return address from this call yann@1: - @ ip contains &GOT[n+3] (pointer to function) yann@1: - @ lr points to &GOT[2] yann@1: - yann@1: - @ save almost everything; return add is already on the stack yann@1: - stmdb sp!,{r0-r3,sl,fp} yann@1: - yann@1: - @ prepare to call fixup() yann@1: - @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each yann@1: - sub r1, ip, lr yann@1: - sub r1, r1, #4 yann@1: - add r1, r1, r1 yann@1: - yann@1: - @ get pointer to linker struct yann@1: - ldr r0, [lr, #-4] yann@1: - yann@1: - @ call profiling fixup routine yann@1: - " CALL_ROUTINE(fixup) " yann@1: - yann@1: - @ save the return yann@1: - mov ip, r0 yann@1: - yann@1: - @ restore the stack yann@1: - ldmia sp!,{r0-r3,sl,fp,lr} yann@1: - yann@1: - @ jump to the newly found address yann@1: - mov pc, ip yann@1: - yann@1: - .size _dl_runtime_profile, .-_dl_runtime_profile yann@1: - .previous yann@1: + .text\n\ yann@1: + .globl _dl_runtime_resolve\n\ yann@1: + .globl _dl_runtime_profile\n\ yann@1: + .type _dl_runtime_resolve, #function\n\ yann@1: + .type _dl_runtime_profile, #function\n\ yann@1: + .align 2\n\ yann@1: +_dl_runtime_resolve:\n\ yann@1: +_dl_runtime_profile:\n\ yann@1: + @ we get called with\n\ yann@1: + @ stack[0] contains the return address from this call\n\ yann@1: + @ ip contains &GOT[n+3] (pointer to function)\n\ yann@1: + @ lr points to &GOT[2]\n\ yann@1: +\n\ yann@1: + @ save almost everything; return add is already on the stack\n\ yann@1: + stmdb sp!,{r0-r3,sl,fp}\n\ yann@1: +\n\ yann@1: + @ prepare to call fixup()\n\ yann@1: + @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\ yann@1: + sub r1, ip, lr\n\ yann@1: + sub r1, r1, #4\n\ yann@1: + add r1, r1, r1\n\ yann@1: +\n\ yann@1: + @ get pointer to linker struct\n\ yann@1: + ldr r0, [lr, #-4]\n\ yann@1: +\n\ yann@1: + @ call profiling fixup routine\n\ yann@1: + " CALL_ROUTINE(fixup) "\n\ yann@1: +\n\ yann@1: + @ save the return\n\ yann@1: + mov ip, r0\n\ yann@1: +\n\ yann@1: + @ restore the stack\n\ yann@1: + ldmia sp!,{r0-r3,sl,fp,lr}\n\ yann@1: +\n\ yann@1: + @ jump to the newly found address\n\ yann@1: + mov pc, ip\n\ yann@1: +\n\ yann@1: + .size _dl_runtime_profile, .-_dl_runtime_profile\n\ yann@1: + .previous\n\ yann@1: "); yann@1: #endif //PROF yann@1: yann@1: @@ -256,70 +257,70 @@ yann@1: its return value is the user program's entry point. */ yann@1: yann@1: #define RTLD_START asm ("\ yann@1: -.text yann@1: -.globl _start yann@1: -.globl _dl_start_user yann@1: -_start: yann@1: - @ at start time, all the args are on the stack yann@1: - mov r0, sp yann@1: - bl _dl_start yann@1: - @ returns user entry point in r0 yann@1: -_dl_start_user: yann@1: - mov r6, r0 yann@1: - @ we are PIC code, so get global offset table yann@1: - ldr sl, .L_GET_GOT yann@1: - add sl, pc, sl yann@1: -.L_GOT_GOT: yann@1: - @ Store the highest stack address yann@1: - ldr r1, .L_STACK_END yann@1: - ldr r1, [sl, r1] yann@1: - str sp, [r1] yann@1: - @ See if we were run as a command with the executable file yann@1: - @ name as an extra leading argument. yann@1: - ldr r4, .L_SKIP_ARGS yann@1: - ldr r4, [sl, r4] yann@1: - @ get the original arg count yann@1: - ldr r1, [sp] yann@1: - @ subtract _dl_skip_args from it yann@1: - sub r1, r1, r4 yann@1: - @ adjust the stack pointer to skip them yann@1: - add sp, sp, r4, lsl #2 yann@1: - @ get the argv address yann@1: - add r2, sp, #4 yann@1: - @ store the new argc in the new stack location yann@1: - str r1, [sp] yann@1: - @ compute envp yann@1: - add r3, r2, r1, lsl #2 yann@1: - add r3, r3, #4 yann@1: - yann@1: - @ now we call _dl_init yann@1: - ldr r0, .L_LOADED yann@1: - ldr r0, [sl, r0] yann@1: - ldr r0, [r0] yann@1: - @ call _dl_init yann@1: - bl _dl_init(PLT) yann@1: - @ clear the startup flag yann@1: - ldr r2, .L_STARTUP_FLAG yann@1: - ldr r1, [sl, r2] yann@1: - mov r0, #0 yann@1: - str r0, [r1] yann@1: - @ load the finalizer function yann@1: - ldr r0, .L_FINI_PROC yann@1: - ldr r0, [sl, r0] yann@1: - @ jump to the user_s entry point yann@1: - mov pc, r6 yann@1: -.L_GET_GOT: yann@1: +.text\n\ yann@1: +.globl _start\n\ yann@1: +.globl _dl_start_user\n\ yann@1: +_start:\n\ yann@1: + @ at start time, all the args are on the stack\n\ yann@1: + mov r0, sp\n\ yann@1: + bl _dl_start\n\ yann@1: + @ returns user entry point in r0\n\ yann@1: +_dl_start_user:\n\ yann@1: + mov r6, r0\n\ yann@1: + @ we are PIC code, so get global offset table\n\ yann@1: + ldr sl, .L_GET_GOT\n\ yann@1: + add sl, pc, sl\n\ yann@1: +.L_GOT_GOT:\n\ yann@1: + @ Store the highest stack address\n\ yann@1: + ldr r1, .L_STACK_END\n\ yann@1: + ldr r1, [sl, r1]\n\ yann@1: + str sp, [r1]\n\ yann@1: + @ See if we were run as a command with the executable file\n\ yann@1: + @ name as an extra leading argument.\n\ yann@1: + ldr r4, .L_SKIP_ARGS\n\ yann@1: + ldr r4, [sl, r4]\n\ yann@1: + @ get the original arg count\n\ yann@1: + ldr r1, [sp]\n\ yann@1: + @ subtract _dl_skip_args from it\n\ yann@1: + sub r1, r1, r4\n\ yann@1: + @ adjust the stack pointer to skip them\n\ yann@1: + add sp, sp, r4, lsl #2\n\ yann@1: + @ get the argv address\n\ yann@1: + add r2, sp, #4\n\ yann@1: + @ store the new argc in the new stack location\n\ yann@1: + str r1, [sp]\n\ yann@1: + @ compute envp\n\ yann@1: + add r3, r2, r1, lsl #2\n\ yann@1: + add r3, r3, #4\n\ yann@1: +\n\ yann@1: + @ now we call _dl_init\n\ yann@1: + ldr r0, .L_LOADED\n\ yann@1: + ldr r0, [sl, r0]\n\ yann@1: + ldr r0, [r0]\n\ yann@1: + @ call _dl_init\n\ yann@1: + bl _dl_init(PLT)\n\ yann@1: + @ clear the startup flag\n\ yann@1: + ldr r2, .L_STARTUP_FLAG\n\ yann@1: + ldr r1, [sl, r2]\n\ yann@1: + mov r0, #0\n\ yann@1: + str r0, [r1]\n\ yann@1: + @ load the finalizer function\n\ yann@1: + ldr r0, .L_FINI_PROC\n\ yann@1: + ldr r0, [sl, r0]\n\ yann@1: + @ jump to the user_s entry point\n\ yann@1: + mov pc, r6\n\ yann@1: +.L_GET_GOT:\n\ yann@1: .word _GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4 \n\ yann@1: .L_SKIP_ARGS: \n\ yann@1: .word _dl_skip_args(GOTOFF) \n\ yann@1: -.L_STARTUP_FLAG: yann@1: - .word _dl_starting_up(GOT) yann@1: -.L_FINI_PROC: yann@1: - .word _dl_fini(GOT) yann@1: -.L_STACK_END: yann@1: - .word __libc_stack_end(GOT) yann@1: -.L_LOADED: yann@1: - .word _dl_loaded(GOT) yann@1: +.L_STARTUP_FLAG:\n\ yann@1: + .word _dl_starting_up(GOT)\n\ yann@1: +.L_FINI_PROC:\n\ yann@1: + .word _dl_fini(GOT)\n\ yann@1: +.L_STACK_END:\n\ yann@1: + .word __libc_stack_end(GOT)\n\ yann@1: +.L_LOADED:\n\ yann@1: + .word _dl_loaded(GOT)\n\ yann@1: .previous\n\ yann@1: "); yann@1: