From 34aa169dcfa0a2945504fb696dee29bdf989c125 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Fri, 7 Dec 2012 23:04:49 -0500 Subject: add support for ctors/dtors on arm with modern gcc a while back, gcc switched from using the old _init/_fini fragments method for calling ctors and dtors on arm to the __init_array and __fini_array method. unfortunately, on glibc this depends on ugly hacks involving making libc.so a linker script and pulling parts of libc into the main program binary. so I cheat a little bit, and just write asm to iterate over the init/fini arrays from the _init/_fini asm. the same approach could be used on any arch it's needed on, but for now arm is the only one. --- crt/arm/crti.s | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'crt/arm/crti.s') diff --git a/crt/arm/crti.s b/crt/arm/crti.s index 0dd978a8..2f658b76 100644 --- a/crt/arm/crti.s +++ b/crt/arm/crti.s @@ -1,9 +1,27 @@ .section .init .global _init _init: - push {lr} + push {r0,r1,r2,r4,r5,lr} + +.weak __fini_array_start +.weak __fini_array_end .section .fini .global _fini _fini: - push {lr} + push {r4,r5,r6,lr} + adr lr, 1f + ldr r4, 2f + ldr r5, 2f+4 + add r4, r4, lr + add r5, r5, lr +1: adr lr, 1b + cmp r4, r5 + beq 3f + ldmia r4!, {r3} + tst r3,#1 + moveq pc,r3 + bx r3 +2: .word __fini_array_start-1b + .word __fini_array_end-1b +3: -- cgit v1.2.1