| .file "initfini.c" |
| |
| #include <bits/arm_asm.h> |
| .section .init |
| .global _init |
| .type _init, %function |
| #if defined __thumb__ |
| .align 1 |
| .thumb |
| .thumb_func |
| _init: |
| push {r4-r7, lr} |
| #else |
| .align 2 |
| .arm |
| _init: |
| @ gcc 3.3.2 didn't create a stack frame, gcc 3.4.4 does - |
| @ presumably 3.4.4 can put stuff into .init which requires |
| @ the arguments to be saved. This code is copied from 3.4.4 |
| mov ip, sp |
| stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc} |
| sub fp, ip, #4 |
| #endif |
| |
| |
| .section .fini |
| .global _fini |
| .type _fini, %function |
| #if defined __thumb__ |
| .align 1 |
| .thumb |
| .thumb_func |
| _fini: |
| push {r4-r7, lr} |
| #else |
| .align 2 |
| .arm |
| _fini: |
| mov ip, sp |
| stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc} |
| sub fp, ip, #4 |
| #endif |
| |
| |
| #if (defined __thumb__ || defined __THUMB_INTERWORK__) && (defined __ARM_ARCH_4T__ || defined __ARM_ARCH_5T__ || defined __ARM_ARCH_5TE__) |
| @ To support thumb code it is currently necessary to have the _call_via_rX |
| @ functions exposed to the linker for any program or shared library. PLT |
| @ references are inadequate - the PLT zaps ip and therefore breaks _call_via_ip |
| @ (and the compiler does generate this). It is simpler to put all the |
| @ required code in here - it only amounts to 60 bytes overhead. |
| @NOTE: it would be better to have the compiler generate this stuff as |
| @ required... |
| .section ".text" |
| .align 0 |
| .force_thumb |
| |
| .macro call_via register |
| .global _call_via_\register |
| .type _call_via_\register, %function |
| .weak _call_via_\register |
| .hidden _call_via_\register |
| .thumb_func |
| _call_via_\register: |
| bx \register |
| nop |
| .size _call_via_\register, . - _call_via_\register |
| .endm |
| |
| @ and calls for the 15 general purpose registers (2 bytes each). |
| call_via r0 |
| call_via r1 |
| call_via r2 |
| call_via r3 |
| call_via r4 |
| call_via r5 |
| call_via r6 |
| call_via r7 |
| call_via r8 |
| call_via r9 |
| call_via sl |
| call_via fp |
| call_via ip |
| call_via sp |
| call_via lr |
| #endif |
| |
| .ident "GCC: (GNU) 3.3.2 20031005 (Debian prerelease)" |