rtld_start.S revision 1.7
11.7Smycroft/* $NetBSD: rtld_start.S,v 1.7 2003/02/28 07:06:16 mycroft Exp $ */ 21.1Skleink 31.1Skleink/*- 41.6Smycroft * Copyright (c) 1999, 2002 The NetBSD Foundation, Inc. 51.1Skleink * All rights reserved. 61.1Skleink * 71.1Skleink * This code is derived from software contributed to The NetBSD Foundation 81.6Smycroft * by Klaus Klein and by Charles M. Hannum. 91.1Skleink * 101.1Skleink * Redistribution and use in source and binary forms, with or without 111.1Skleink * modification, are permitted provided that the following conditions 121.1Skleink * are met: 131.1Skleink * 1. Redistributions of source code must retain the above copyright 141.1Skleink * notice, this list of conditions and the following disclaimer. 151.1Skleink * 2. Redistributions in binary form must reproduce the above copyright 161.1Skleink * notice, this list of conditions and the following disclaimer in the 171.1Skleink * documentation and/or other materials provided with the distribution. 181.1Skleink * 3. All advertising materials mentioning features or use of this software 191.1Skleink * must display the following acknowledgement: 201.1Skleink * This product includes software developed by the NetBSD 211.1Skleink * Foundation, Inc. and its contributors. 221.1Skleink * 4. Neither the name of The NetBSD Foundation nor the names of its 231.1Skleink * contributors may be used to endorse or promote products derived 241.1Skleink * from this software without specific prior written permission. 251.1Skleink * 261.1Skleink * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 271.1Skleink * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 281.1Skleink * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 291.1Skleink * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 301.1Skleink * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 311.1Skleink * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 321.1Skleink * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 331.1Skleink * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 341.1Skleink * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 351.1Skleink * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 361.1Skleink * POSSIBILITY OF SUCH DAMAGE. 371.1Skleink */ 381.1Skleink 391.1Skleink#include <machine/asm.h> 401.1Skleink 411.1Skleink .text 421.2Skleink .align 4 431.1Skleink .globl .rtld_start 441.1Skleink .type .rtld_start,@function 451.1Skleink.rtld_start: 461.1Skleink subql #8,%sp | storage for obj and cleanup 471.4Smycroft 481.7Smycroft lea (%pc,_GLOBAL_OFFSET_TABLE_@GOTPC),%a0 491.7Smycroft lea (%pc,_DYNAMIC),%a1 501.7Smycroft movel %a1,%a5 511.7Smycroft subl (%a0),%a5 521.5Smycroft 531.5Smycroft movel %a5,-(%sp) | relocbase 541.7Smycroft movel %a1,-(%sp) | &_DYNAMIC 551.4Smycroft jbsr _rtld_relocate_nonplt_self@PLTPC 561.4Smycroft addql #8,%sp | pop arguments 571.4Smycroft 581.5Smycroft movel %a5,-(%sp) | relocbase 591.5Smycroft pea 4(%sp) | sp 601.5Smycroft jbsr _rtld@PLTPC | entry = _rtld(sp, relocbase) 611.5Smycroft addql #8,%sp | pop arguments 621.4Smycroft 631.1Skleink moveal (%sp)+,%a1 | cleanup 641.1Skleink moveal (%sp)+,%a0 | obj 651.1Skleink moveal %d0,%a3 661.1Skleink jmp (%a3) | Go for it! 671.1Skleink .size .rtld_start,.-.rtld_start 681.1Skleink 691.2Skleink .align 4 701.1Skleink .globl _rtld_bind_start 711.1Skleink .type _rtld_bind_start,@function 721.1Skleink_rtld_bind_start: 731.1Skleink moveml %d0-%d1/%a0-%a1,-(%sp) | preserve caller-saved registers 741.1Skleink movel 20(%sp),-(%sp) | push reloff 751.1Skleink movel (16+4)(%sp),-(%sp) | push obj 761.1Skleink jbsr _rtld_bind@PLTPC | %a0 = _rtld_bind(obj, reloff) 771.1Skleink addql #8,%sp | pop args 781.3Sitohy#ifdef __SVR4_ABI__ 791.1Skleink movel %a0,(16+4)(%sp) | write fake `return' address over obj 801.3Sitohy#else 811.3Sitohy movel %d0,(16+4)(%sp) | write fake `return' address over obj 821.3Sitohy#endif 831.1Skleink moveml (%sp)+,%d0-%d1/%a0-%a1 | restore caller-saved registers 841.1Skleink addql #4,%sp | skip reloff 851.1Skleink rts | `return' right into function 861.1Skleink .size _rtld_bind_start,.-_rtld_bind_start 87