📄 initfini.c
字号:
/* Special .init and .fini section support for ia64. Copyright (C) 2000, 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *//* This file is compiled into assembly code which is then munged by a sed script into two files: crti.s and crtn.s. * crti.s puts a function prologue at the beginning of the .init and .fini sections and defines global symbols for those addresses, so they can be called as functions. * crtn.s puts the corresponding function epilogues in the .init and .fini sections. */__asm__ ("\n\n""#include \"defs.h\"\n""\n""/*@HEADER_ENDS*/\n""\n""/*@_init_PROLOG_BEGINS*/\n");#ifdef HAVE_INITFINI_ARRAY/* If we have working .init_array support, we want to keep the .init section empty (apart from the mandatory prologue/epilogue. This ensures that the default unwind conventions (return-pointer in b0, frame state in ar.pfs, etc.) will do the Right Thing. To ensure an empty .init section, we register gmon_initializer() via the .init_array. --davidm 02/10/29 */static voidgmon_initializer (void){ extern void weak_function __gmon_start__ (void); if (__gmon_start__) (*__gmon_start__)();}__asm__ (".section .init_array, \"aw\"\n" "\tdata8 @fptr(gmon_initializer)\n");#endif__asm__ (".section .init\n"" .align 16\n"" .global _init#\n"" .proc _init#\n""_init:\n"" alloc r34 = ar.pfs, 0, 3, 0, 0\n"" mov r32 = r12\n"" mov r33 = b0\n"" adds r12 = -16, r12\n"#ifdef HAVE_INITFINI_ARRAY " ;;\n" /* see gmon_initializer() below */#else" .weak __gmon_start__#\n"" addl r14 = @ltoff(@fptr(__gmon_start__#)), gp\n"" ;;\n"" ld8 r15 = [r14]\n"" ;;\n"" cmp.eq p6, p7 = 0, r15\n"" (p6) br.cond.dptk .L5\n""\n""/* we could use r35 to save gp, but we use the stack since that's what\n"" * all the other init routines will do --davidm 00/04/05 */\n"" st8 [r12] = gp, -16\n"" br.call.sptk.many b0 = __gmon_start__# ;;\n"" adds r12 = 16, r12\n"" ;;\n"" ld8 gp = [r12]\n"" ;;\n"".L5:\n"#endif" .align 16\n"" .endp _init#\n""\n""/*@_init_PROLOG_ENDS*/\n""\n""/*@_init_EPILOG_BEGINS*/\n"" .section .init\n"" .regstk 0,2,0,0\n"" mov r12 = r32\n"" mov ar.pfs = r34\n"" mov b0 = r33\n"" br.ret.sptk.many b0\n"" .endp _init#\n""/*@_init_EPILOG_ENDS*/\n""\n""/*@_fini_PROLOG_BEGINS*/\n"" .section .fini\n"" .align 16\n"" .global _fini#\n"" .proc _fini#\n""_fini:\n"" alloc r34 = ar.pfs, 0, 3, 0, 0\n"" mov r32 = r12\n"" mov r33 = b0\n"" adds r12 = -16, r12\n"" ;;\n"" .align 16\n"" .endp _fini#\n""\n""/*@_fini_PROLOG_ENDS*/\n"" br.call.sptk.many b0 = i_am_not_a_leaf# ;;\n"" ;;\n""\n""/*@_fini_EPILOG_BEGINS*/\n"" .section .fini\n"" mov r12 = r32\n"" mov ar.pfs = r34\n"" mov b0 = r33\n"" br.ret.sptk.many b0\n"" .endp _fini#\n""\n""/*@_fini_EPILOG_ENDS*/\n""\n""/*@TRAILER_BEGINS*/\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -