4 * Copyright (C) 1996 Wolfgang Solfrank
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by Wolfgang Solfrank.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 * arm run-time link editor entry points.
37 #include <machine/asm.h>
38 #include <sys/syscall.h>
43 * _rtl(int version, struct crt_ldso *crtp)
48 _rtl: @ crt0 calls us here
49 mov ip, sp @ Allocate stack frame
50 stmfd sp!, {sl, fp, ip, lr, pc}
53 ldr r3, [r1, #0] @ base address of ld.so (first field)
54 @ setup arguments for rtld()
55 ldr sl, GOTaddr @ get pc-rel offset for GOT
56 add sl, pc, sl @ here is the GOT
59 ldr r2, [sl, r2] @ 1st entry in GOT is our __DYNAMIC
60 add r2, r2, r3 @ add load address
61 ldr lr, rtldaddr @ get GOT offset for function
62 ldr lr, [sl, lr] @ get function address
63 add r3, lr, r3 @ and relocate
65 mov pc, r3 @ _rtld(version, crtp, DYNAMIC)
67 ldmea fp, {sl, fp, ip, pc}
71 .word __GLOBAL_OFFSET_TABLE_ + (. - (L1+4) )
77 @ First call to a procedure generally comes through here for
81 stmfd sp!, {r0-fp, ip, lr, pc} @ save all regs in standard frame
82 @ (ip and lr to be fixed later)
83 add fp, sp, #(15-1)*4 @ get new fp
84 add r0, fp, #4 @ compute old sp
85 str r0, [fp, #-8] @ fixup saved ip
87 sub r0, ip, #(8+12) @ make it point to the jmpslot
90 str r0, [fp] @ return value from _binder()
91 @ == actual address of function
92 ldmfa fp, {r0-fp, sp, lr, pc} @ restore regs