diff options
Diffstat (limited to 'csu')
-rw-r--r-- | csu/Makefile | 25 | ||||
-rw-r--r-- | csu/gmon-start.c | 47 |
2 files changed, 64 insertions, 8 deletions
diff --git a/csu/Makefile b/csu/Makefile index 8f97624240..4fddba2f3a 100644 --- a/csu/Makefile +++ b/csu/Makefile @@ -20,18 +20,21 @@ # This directory contains the C startup code (that which calls main). This # consists of the startfile, built from start.c and installed as crt0.o -# (traditionally) or crt1.o (for ELF); and some initialization code which -# is in the C library itself. In ELF we also install crti.o and crtn.o, -# special "initializer" and "finalizer" files in used in the link to make -# the .init and .fini sections work right; both these files are built (in -# an arcane manner) from initfini.c. +# (traditionally) or crt1.o (for ELF). In ELF we also install crti.o and +# crtn.o, special "initializer" and "finalizer" files in used in the link +# to make the .init and .fini sections work right; both these files are +# built (in an arcane manner) from initfini.c. subdir := csu csu-dummies = $(filter-out $(start-installed-name),crt1.o Mcrt1.o) -extra-objs = start.o $(start-installed-name) $(csu-dummies) -omit-deps = $(patsubst %.o,%,$(start-installed-name) $(csu-dummies)) -install-lib = $(start-installed-name) $(csu-dummies) +extra-objs = start.o gmon-start.o \ + $(start-installed-name) g$(start-installed-name) \ + $(csu-dummies) +omit-deps = $(patsubst %.o,%,$(start-installed-name) g$(start-installed-name) \ + $(csu-dummies)) +install-lib = $(start-installed-name) g$(start-installed-name) \ + $(csu-dummies) distribute = initfini.c all: # Make this the default target; it will be defined in Rules. @@ -95,6 +98,12 @@ $(objpfx)$(start-installed-name): $(objpfx)start.o ln $< $@ endif +# The profiling startfile is made by linking together the normal +# startfile with gmon-start.o, which defines a constructor function +# to turn on profiling code at startup. +$(objpfx)g$(start-installed-name): $(objpfx)start.o $(objpfx)gmon-start.o + $(CC) -nostdlib -nostartfiles -r -o $@ $^ + # These extra files are sometimes expected by system standard linking # procedures, but we have nothing for them to do. So compile empty files. $(addprefix $(objpfx),$(filter-out $(start-installed-name),$(csu-dummies))): diff --git a/csu/gmon-start.c b/csu/gmon-start.c new file mode 100644 index 0000000000..c9d51b113b --- /dev/null +++ b/csu/gmon-start.c @@ -0,0 +1,47 @@ +/* Code to enable profiling at program startup. +Copyright (C) 1995 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. */ + +#include <sys/types.h> +#include <sys/gmon.h> +#include <stdlib.h> +#include <unistd.h> + +/* Beginning and end of our code segment. */ +extern void _start (), etext (); + +/* These functions are defined in gmon/gmon.c; + they do all the work of setting up and cleaning up profiling. */ +extern void monstartup (u_long, u_long); +extern void _mcleanup (void); + +/* This function gets called at startup by the normal constructor + mechanism. We link this file together with start.o to produce gcrt1.o, + so this constructor will be first in the list. */ +static void gmon_start (void) __attribute__ ((constructor)); +static void +gmon_start (void) +{ + /* Start keeping profiling records. */ + monstartup ((u_long) &_start, (u_long) &etext); + + /* Call _mcleanup before exitting; it will write out gmon.out from the + collected data. */ + atexit (&_mcleanup); +} + |