1 .file "initfini.c" 2 3#include <bits/arm_asm.h> 4 .section .init 5 .global _init 6 .type _init, %function 7#if defined __thumb__ 8 .align 1 9 .thumb 10 .thumb_func 11_init: 12 push {r4-r7, lr} 13#else 14 .align 2 15 .arm 16_init: 17 @ gcc 3.3.2 didn't create a stack frame, gcc 3.4.4 does - 18 @ presumably 3.4.4 can put stuff into .init which requires 19 @ the arguments to be saved. This code is copied from 3.4.4 20 mov ip, sp 21 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc} 22 sub fp, ip, #4 23#endif 24 25 26 .section .fini 27 .global _fini 28 .type _fini, %function 29#if defined __thumb__ 30 .align 1 31 .thumb 32 .thumb_func 33_fini: 34 push {r4-r7, lr} 35#else 36 .align 2 37 .arm 38_fini: 39 mov ip, sp 40 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc} 41 sub fp, ip, #4 42#endif 43 44 45#if (defined __thumb__ || defined __THUMB_INTERWORK__) && (defined __ARM_ARCH_4T__ || defined __ARM_ARCH_5T__ || defined __ARM_ARCH_5TE__) 46 @ To support thumb code it is currently necessary to have the _call_via_rX 47 @ functions exposed to the linker for any program or shared library. PLT 48 @ references are inadequate - the PLT zaps ip and therefore breaks _call_via_ip 49 @ (and the compiler does generate this). It is simpler to put all the 50 @ required code in here - it only amounts to 60 bytes overhead. 51 @NOTE: it would be better to have the compiler generate this stuff as 52 @ required... 53 .section ".text" 54 .align 0 55 .force_thumb 56 57.macro call_via register 58 .global _call_via_\register 59 .type _call_via_\register, %function 60 .weak _call_via_\register 61 .hidden _call_via_\register 62 .thumb_func 63_call_via_\register: 64 bx \register 65 nop 66 .size _call_via_\register, . - _call_via_\register 67.endm 68 69 @ and calls for the 15 general purpose registers (2 bytes each). 70 call_via r0 71 call_via r1 72 call_via r2 73 call_via r3 74 call_via r4 75 call_via r5 76 call_via r6 77 call_via r7 78 call_via r8 79 call_via r9 80 call_via sl 81 call_via fp 82 call_via ip 83 call_via sp 84 call_via lr 85#endif 86 87 .ident "GCC: (GNU) 3.3.2 20031005 (Debian prerelease)" 88