* corefile.c (num_of_syms_in): New function - computes the number

of symbols in a given file.
        (core_create_syms_from): New function - populates a symbol table
        from the symbols found in a specified file.
        * corefile.h: Prototype core_create_syms_from.
        * gprof.c (long_options): Add --external-symbol-table.
        (usage): Mention it.
        (main): Initiailize external_symbol_table from
        --external-symbol-table option.  If set use it.
        * gprof.texi: Document the new option.

        * NEWS: Mention new feature added to gprof.
This commit is contained in:
Nick Clifton 2009-06-12 15:33:30 +00:00
parent f37111339e
commit 0e27a8f69b
7 changed files with 154 additions and 19 deletions

View File

@ -1,3 +1,7 @@
2009-06-12 Homer Xing <homer.xing@yahoo.com>
* NEWS: Mention new feature added to gprof.
2009-06-12 John Reiser <jreiser@BitWagon.com>
* readelf.c (process_symbol_table): Set gnubuckets to NULL after

View File

@ -1,4 +1,7 @@
-*- text -*-
* The gprof program has been given a new command line option:
--external-symbols-table=<filename> which reads in symbols from a specified
file.
* The plugin target has been added to bfd. It can load the same shared objects
used by gold and uses them to provide basic support for new file formats.

View File

@ -1,3 +1,16 @@
2009-06-12 Homer Xing <homer.xing@yahoo.com>
* corefile.c (num_of_syms_in): New function - computes the number
of symbols in a given file.
(core_create_syms_from): New function - populates a symbol table
from the symbols found in a specified file.
* corefile.h: Prototype core_create_syms_from.
* gprof.c (long_options): Add --external-symbol-table.
(usage): Mention it.
(main): Initiailize external_symbol_table from
--external-symbol-table option. If set use it.
* gprof.texi: Document the new option.
2009-06-04 Alan Modra <amodra@bigpond.net.au>
* dep-in.sed: Don't use \n in replacement part of s command.

View File

@ -1,6 +1,6 @@
/* corefile.c
Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
Free Software Foundation, Inc.
This file is part of GNU Binutils.
@ -33,13 +33,13 @@ bfd *core_bfd;
static int core_num_syms;
static asymbol **core_syms;
asection *core_text_sect;
PTR core_text_space;
void * core_text_space;
static int min_insn_size;
int offset_to_code;
/* For mapping symbols to specific .o files during file ordering. */
struct function_map *symbol_map;
struct function_map * symbol_map;
unsigned int symbol_map_count;
static void read_function_mappings (const char *);
@ -434,6 +434,104 @@ get_src_info (bfd_vma addr, const char **filename, const char **name, int *line_
}
}
/* Return number of symbols in a symbol-table file. */
static int
num_of_syms_in (FILE * f)
{
const int BUFSIZE = 1024;
char * buf = (char *) xmalloc (BUFSIZE);
char * address = (char *) xmalloc (BUFSIZE);
char type;
char * name = (char *) xmalloc (BUFSIZE);
int num = 0;
while (!feof (f) && fgets (buf, BUFSIZE - 1, f))
{
if (sscanf (buf, "%s %c %s", address, &type, name) == 3)
if (type == 't' || type == 'T')
++num;
}
free (buf);
free (address);
free (name);
return num;
}
/* Read symbol table from a file. */
void
core_create_syms_from (const char * sym_table_file)
{
const int BUFSIZE = 1024;
char * buf = (char *) xmalloc (BUFSIZE);
char * address = (char *) xmalloc (BUFSIZE);
char type;
char * name = (char *) xmalloc (BUFSIZE);
bfd_vma min_vma = ~(bfd_vma) 0;
bfd_vma max_vma = 0;
FILE * f;
f = fopen (sym_table_file, "r");
if (!f)
{
fprintf (stderr, _("%s: could not open %s.\n"), whoami, sym_table_file);
done (1);
}
/* Pass 1 - determine upper bound on number of function names. */
symtab.len = num_of_syms_in (f);
if (symtab.len == 0)
{
fprintf (stderr, _("%s: file `%s' has no symbols\n"), whoami, sym_table_file);
done (1);
}
symtab.base = (Sym *) xmalloc (symtab.len * sizeof (Sym));
/* Pass 2 - create symbols. */
symtab.limit = symtab.base;
if (fseek (f, 0, SEEK_SET) != 0)
{
perror (sym_table_file);
done (1);
}
while (!feof (f) && fgets (buf, sizeof (buf), f))
{
if (sscanf (buf, "%s %c %s", address, &type, name) == 3)
if (type != 't' && type != 'T')
continue;
sym_init (symtab.limit);
sscanf (address, "%lx", &(symtab.limit->addr) );
symtab.limit->name = (char *) xmalloc (strlen (name) + 1);
strcpy ((char *) symtab.limit->name, name);
symtab.limit->mapped = 0;
symtab.limit->is_func = TRUE;
symtab.limit->is_bb_head = TRUE;
symtab.limit->is_static = (type == 't');
min_vma = MIN (symtab.limit->addr, min_vma);
max_vma = MAX (symtab.limit->addr, max_vma);
++symtab.limit;
}
fclose (f);
symtab.len = symtab.limit - symtab.base;
symtab_finalize (&symtab);
free (buf);
free (address);
free (name);
}
/* Read in symbol table from core.
One symbol per function is entered. */

View File

@ -1,6 +1,6 @@
/* corefile.h
Copyright 2000, 2001, 2002, 2004, 2007 Free Software Foundation, Inc.
Copyright 2000, 2001, 2002, 2004, 2007, 2009 Free Software Foundation, Inc.
This file is part of GNU Binutils.
@ -28,12 +28,12 @@ struct function_map
char *file_name;
};
extern struct function_map *symbol_map;
extern struct function_map * symbol_map;
extern unsigned int symbol_map_count;
extern bfd *core_bfd; /* BFD for core-file. */
extern asection *core_text_sect;/* Core text section. */
extern PTR core_text_space; /* Text space of a.out in core. */
extern bfd * core_bfd; /* BFD for core-file. */
extern asection * core_text_sect; /* Core text section. */
extern void * core_text_space; /* Text space of a.out in core. */
extern int offset_to_code; /* Offset (in bytes) of code from entry
address of routine. */
@ -41,5 +41,6 @@ extern void core_init (const char *);
extern void core_get_text_space (bfd *);
extern void core_create_function_syms (void);
extern void core_create_line_syms (void);
extern void core_create_syms_from (const char *);
#endif /* corefile_h */

View File

@ -47,9 +47,10 @@
static void usage (FILE *, int) ATTRIBUTE_NORETURN;
const char *whoami;
const char *function_mapping_file;
const char *a_out_name = A_OUTNAME;
const char * whoami;
const char * function_mapping_file;
static const char * external_symbol_table;
const char * a_out_name = A_OUTNAME;
long hz = HZ_WRONG;
/*
@ -98,6 +99,7 @@ static struct option long_options[] =
{"line", no_argument, 0, 'l'},
{"no-static", no_argument, 0, 'a'},
{"ignore-non-functions", no_argument, 0, 'D'},
{"external-symbol-table", required_argument, 0, 'S'},
/* output styles: */
@ -155,7 +157,7 @@ static void
usage (FILE *stream, int status)
{
fprintf (stream, _("\
Usage: %s [-[abcDhilLsTvwxyz]] [-[ACeEfFJnNOpPqQZ][name]] [-I dirs]\n\
Usage: %s [-[abcDhilLsTvwxyz]] [-[ACeEfFJnNOpPqSQZ][name]] [-I dirs]\n\
[-d[num]] [-k from/to] [-m min-count] [-t table-length]\n\
[--[no-]annotated-source[=name]] [--[no-]exec-counts[=name]]\n\
[--[no-]flat-profile[=name]] [--[no-]graph[=name]]\n\
@ -166,7 +168,7 @@ Usage: %s [-[abcDhilLsTvwxyz]] [-[ACeEfFJnNOpPqQZ][name]] [-I dirs]\n\
[--no-static] [--print-path] [--separate-files]\n\
[--static-call-graph] [--sum] [--table-length=len] [--traditional]\n\
[--version] [--width=n] [--ignore-non-functions]\n\
[--demangle[=STYLE]] [--no-demangle] [@FILE]\n\
[--demangle[=STYLE]] [--no-demangle] [--external-symbol-table=name] [@FILE]\n\
[image-file] [profile-file...]\n"),
whoami);
if (REPORT_BUGS_TO[0] && status == 0)
@ -199,7 +201,7 @@ main (int argc, char **argv)
expandargv (&argc, &argv);
while ((ch = getopt_long (argc, argv,
"aA::bBcC::d::De:E:f:F:hiI:J::k:lLm:n:N:O:p::P::q::Q::rR:st:Tvw:xyzZ::",
"aA::bBcC::d::De:E:f:F:hiI:J::k:lLm:n:N:O:p::P::q::Q::rR:sS:t:Tvw:xyzZ::",
long_options, 0))
!= EOF)
{
@ -398,6 +400,10 @@ main (int argc, char **argv)
output_style |= STYLE_SUMMARY_FILE;
user_specified |= STYLE_SUMMARY_FILE;
break;
case 'S':
external_symbol_table = optarg;
DBG (AOUTDEBUG, printf ("external-symbol-table: %s\n", optarg));
break;
case 't':
bb_table_length = atoi (optarg);
if (bb_table_length < 0)
@ -512,7 +518,9 @@ This program is free software. This program has absolutely no warranty.\n"));
core_get_text_space (core_bfd);
/* Create symbols from core image. */
if (line_granularity)
if (external_symbol_table)
core_create_syms_from (external_symbol_table);
else if (line_granularity)
core_create_line_syms ();
else
core_create_function_syms ();

View File

@ -1,7 +1,7 @@
\input texinfo @c -*-texinfo-*-
@setfilename gprof.info
@c Copyright 1988, 1992, 1993, 1998, 1999, 2000, 2001, 2002, 2003,
@c 2004, 2007, 2008
@c 2004, 2007, 2008, 2009
@c Free Software Foundation, Inc.
@settitle GNU gprof
@setchapternewpage odd
@ -24,7 +24,7 @@ END-INFO-DIR-ENTRY
This file documents the gprof profiler of the GNU system.
@c man begin COPYRIGHT
Copyright @copyright{} 1988, 92, 97, 98, 99, 2000, 2001, 2003, 2007, 2008 Free Software Foundation, Inc.
Copyright @copyright{} 1988, 92, 97, 98, 99, 2000, 2001, 2003, 2007, 2008, 2009 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
@ -57,7 +57,7 @@ execute programs. @sc{gnu} @code{gprof} was written by Jay Fenlason.
Eric S. Raymond made some minor corrections and additions in 2003.
@vskip 0pt plus 1filll
Copyright @copyright{} 1988, 92, 97, 98, 99, 2000, 2003, 2008 Free Software Foundation, Inc.
Copyright @copyright{} 1988, 92, 97, 98, 99, 2000, 2003, 2008, 2009 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
@ -128,7 +128,8 @@ gprof [ -[abcDhilLrsTvwxyz] ] [ -[ACeEfFJnNOpPqQZ][@var{name}] ]
[ --static-call-graph ] [ --sum ] [ --table-length=@var{len} ]
[ --traditional ] [ --version ] [ --width=@var{n} ]
[ --ignore-non-functions ] [ --demangle[=@var{STYLE}] ]
[ --no-demangle ] [ @var{image-file} ] [ @var{profile-file} @dots{} ]
[ --no-demangle ] [--external-symbol-table=name]
[ @var{image-file} ] [ @var{profile-file} @dots{} ]
@c man end
@end smallexample
@ -725,6 +726,13 @@ to only propagate times for symbols matching @var{symspec}.
The @samp{-n} option causes @code{gprof}, in its call graph analysis,
not to propagate times for symbols matching @var{symspec}.
@item -S@var{filename}
@itemx --external-symbol-table=@var{filename}
The @samp{-S} option causes @code{gprof} to read an external symbol table
file, such as @file{/proc/kallsyms}, rather than read the symbol table
from the given object file (the default is @code{a.out}). This is useful
for profiling kernel modules.
@item -z
@itemx --display-unused-functions
If you give the @samp{-z} option, @code{gprof} will mention all