X-Git-Url: http://git.csclub.uwaterloo.ca/?p=kopensolaris-gnu%2Fglibc.git;a=blobdiff_plain;f=csu%2Finitfini.c;h=6906c901c4e102dbd65e556e95da56e004afde0e;hp=6b12850a24ee8ff178fbafc216eb4994b39ac7e3;hb=bdce759beec7a794a65323d29ce0b9e8e4f0c9e2;hpb=8005b215eb46c890b4aac8bb4652f8366796d07c diff --git a/csu/initfini.c b/csu/initfini.c index 6b12850a24..6906c901c4 100644 --- a/csu/initfini.c +++ b/csu/initfini.c @@ -1,73 +1,65 @@ /* Special .init and .fini section support. -Copyright (C) 1995, 1996 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 Library General Public License as -published by the Free Software Foundation; either version 2 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -/* This file is compiled into assembly code which is then surrounded by the - lines `cat > crtcommon.tmp <<\EOF_common' and `EOF_common' and thus - becomes a shell script which creates three files of assembly code. - - * The first file is crti.s-new; this puts a function prologue at the - beginning of the .init and .fini sections and defines global symbols for + Copyright (C) 1995, 1996, 1997 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 Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Library General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The Library General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + 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 Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, 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. - * The second file is crtn.s-new; this puts the corresponding function - epilogues in the .init and .fini sections. - - * The third file is crtcommon.tmp, which is whatever miscellaneous cruft - the compiler generated at the end; it should be appended to both crti.s-new - and crtn.s-new. */ + * crtn.s puts the corresponding function epilogues + in the .init and .fini sections. */ #include +/* We use embedded asm for .section unconditionally, as this makes it + easier to insert the necessary directives into crtn.S. */ +#define SECTION(x) asm (".section \"" x "\""); -#ifdef HAVE_ELF -/* These declarations make the functions go in the right sections when - we define them below. GCC syntax does not allow the attribute - specifications to be in the function definitions themselves. */ -void _init (void) __attribute__ ((section (".init"))); -void _fini (void) __attribute__ ((section (".fini"))); - -#define SECTION(x) /* Put nothing extra before the defn. */ - -#else -/* Some non-ELF systems support .init and .fini sections, - but the __attribute__ syntax only works for ELF. */ -#define SECTION(x) asm (".section " x); -#endif +/* Embed an #include to pull in the alignment and .end directives. */ +asm ("\n#include \"defs.h\""); -/* End the here document containing the initial common code. - Then move the output file crtcommon.tmp to crti.s-new and crtn.s-new. */ -asm ("\nEOF_common\n\ -rm -f crti.s-new crtn.s-new\n\ -mv crtcommon.tmp crti.s-new\n\ -cp crti.s-new crtn.s-new"); +/* The initial common code ends here. */ +asm ("\n/*@HEADER_ENDS*/"); -/* Extract a `.end' if one is produced by the compiler. */ -asm ("fgrep .end >/dev/null 2>&1 <<\\EOF.end && need_end=yes"); +/* To determine whether we need .end and .align: */ +asm ("\n/*@TESTS_BEGIN*/"); void -useless_function (void) +dummy (void (*foo) (void)) { - return; + if (foo) + (*foo) (); } -asm ("\nEOF.end\n"); +asm ("\n/*@TESTS_END*/"); -/* Append the .init prologue to crti.s-new. */ -asm ("cat >> crti.s-new <<\\EOF.crti.init"); +/* The beginning of _init: */ +asm ("\n/*@_init_PROLOG_BEGINS*/"); SECTION (".init") void @@ -79,36 +71,33 @@ _init (void) gcrt1.o to reference a symbol which would be defined by some library module which has a constructor; but then user code's constructors would come first, and not be profiled. */ - extern void __gmon_start__ (void); weak_extern (__gmon_start__) + extern void __gmon_start__ (void) __attribute__ ((weak)); /*weak_extern (__gmon_start__);*/ + if (__gmon_start__) __gmon_start__ (); - /* End the here document containing the .init prologue code. - Then fetch the .section directive just written and append that - to crtn.s-new, followed by the function epilogue. */ - asm ("\n\ -EOF.crti.init\n\ - test -n \"$need_end\" && echo .end _init >> crti.s-new\n\ - fgrep .init crti.s-new >>crtn.s-new\n\ - fgrep -v .end >> crtn.s-new <<\\EOF.crtn.init"); + asm ("ALIGN"); + asm("END_INIT"); + /* Now the epilog. */ + asm ("\n/*@_init_PROLOG_ENDS*/"); + asm ("\n/*@_init_EPILOG_BEGINS*/"); + SECTION(".init"); } +asm ("END_INIT"); -/* End the here document containing the .init epilogue code. - Then append the .fini prologue to crti.s-new. */ -asm ("\nEOF.crtn.init\ -\n\ -cat >> crti.s-new <<\\EOF.crti.fini"); +/* End of the _init epilog, beginning of the _fini prolog. */ +asm ("\n/*@_init_EPILOG_ENDS*/"); +asm ("\n/*@_fini_PROLOG_BEGINS*/"); SECTION (".fini") void _fini (void) { - /* End the here document containing the .fini prologue code. - Then fetch the .section directive just written and append that - to crtn.s-new, followed by the function epilogue. */ - asm ("\nEOF.crti.fini\n\ -test -n \"$need_end\" && echo .end _fini >> crti.s-new\n\ -cat > /dev/null <<\\EOF.fini.skip"); + + /* End of the _fini prolog. */ + asm ("ALIGN"); + asm ("END_FINI"); + asm ("\n/*@_fini_PROLOG_ENDS*/"); { /* Let GCC know that _fini is not a leaf function by having a dummy @@ -118,14 +107,15 @@ cat > /dev/null <<\\EOF.fini.skip"); i_am_not_a_leaf (); } - asm ("\nEOF.fini.skip\ -\n\ - fgrep .fini crti.s-new >>crtn.s-new\n\ - fgrep -v .end >> crtn.s-new <<\\EOF.crtn.fini"); + /* Beginning of the _fini epilog. */ + asm ("\n/*@_fini_EPILOG_BEGINS*/"); + SECTION (".fini"); } +asm ("END_FINI"); + +/* End of the _fini epilog. Any further generated assembly (e.g. .ident) + is shared between both crt files. */ +asm ("\n/*@_fini_EPILOG_ENDS*/"); +asm ("\n/*@TRAILER_BEGINS*/"); -/* End the here document containing the .fini epilogue code. - Finally, put the remainder of the generated assembly into crtcommon.tmp. */ -asm ("\nEOF.crtn.fini\ -\n\ -cat > crtcommon.tmp <<\\EOF_common"); +/* End of file. */