From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16812 invoked by alias); 5 Apr 2006 07:48:22 -0000 Received: (qmail 16804 invoked by uid 22791); 5 Apr 2006 07:48:21 -0000 X-Spam-Check-By: sourceware.org Received: from province.act-europe.fr (HELO province.act-europe.fr) (212.157.227.214) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 05 Apr 2006 07:48:18 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-province.act-europe.fr (Postfix) with ESMTP id 9A5884AD04; Wed, 5 Apr 2006 09:48:14 +0200 (CEST) Received: from province.act-europe.fr ([127.0.0.1]) by localhost (province.act-europe.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 16622-01; Wed, 5 Apr 2006 09:48:13 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by province.act-europe.fr (Postfix) with ESMTP id 580884ACCC; Wed, 5 Apr 2006 09:48:13 +0200 (CEST) From: Eric Botcazou To: Alan Modra Subject: Re: [PATCH] New option --print-gc-sections Date: Wed, 05 Apr 2006 07:48:00 -0000 User-Agent: KMail/1.7.1 Cc: binutils@gcc.gnu.org, Arnaud Charlet References: <200603281131.41402.ebotcazou@adacore.com> <200604041112.08906.ebotcazou@adacore.com> <20060405033359.GO9418@bubble.grove.modra.org> In-Reply-To: <20060405033359.GO9418@bubble.grove.modra.org> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_3b3MEsoVtKPaXVG" Message-Id: <200604050951.19920.ebotcazou@adacore.com> Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2006-04/txt/msg00047.txt.bz2 --Boundary-00=_3b3MEsoVtKPaXVG Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 751 > If you want to use addr2line on relocatable object files, I suppose this > is a reasonable idea. First try attached, tested on AMD64/Linux. 2006-04-05 Eric Botcazou * addr2line.c (long_options): Add new option 'section'. (usage): Document new -j/--section option. (find_offset_in_section): New function. (translate_addresses): Add 'section' parameter. If it is non-null, call find_offset_in_section on it. (process_file): Add 'section_name' parameter. If it is non-null, look for the section in the BFD object. Pass the section to translate_addresses. (main): Handle new -j option. Pass the section name to process_file. * doc/binutils.texi (addr2line): Document new -j/--section option. -- Eric Botcazou --Boundary-00=_3b3MEsoVtKPaXVG Content-Type: text/x-diff; charset="iso-8859-1"; name="f115-010-3_217.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="f115-010-3_217.diff" Content-length: 7089 Index: addr2line.c =================================================================== RCS file: /cvs/src/src/binutils/addr2line.c,v retrieving revision 1.26 diff -u -p -r1.26 addr2line.c --- addr2line.c 3 Oct 2005 19:37:44 -0000 1.26 +++ addr2line.c 5 Apr 2006 07:37:33 -0000 @@ -56,6 +56,7 @@ static struct option long_options[] = {"exe", required_argument, NULL, 'e'}, {"functions", no_argument, NULL, 'f'}, {"inlines", no_argument, NULL, 'i'}, + {"section", required_argument, NULL, 'j'}, {"target", required_argument, NULL, 'b'}, {"help", no_argument, NULL, 'H'}, {"version", no_argument, NULL, 'V'}, @@ -65,8 +66,9 @@ static struct option long_options[] = static void usage (FILE *, int); static void slurp_symtab (bfd *); static void find_address_in_section (bfd *, asection *, void *); -static void translate_addresses (bfd *); -static void process_file (const char *, const char *); +static void find_offset_in_section (bfd *, asection *); +static void translate_addresses (bfd *, asection *); +static void process_file (const char *, const char *, const char *); /* Print a usage message to STREAM and exit with STATUS. */ @@ -80,7 +82,8 @@ usage (FILE *stream, int status) @ Read options from \n\ -b --target= Set the binary file format\n\ -e --exe= Set the input file name (default is a.out)\n\ - -i --inlines Unwind inlined functions\n\ + -i --inlines Unwind inlined functions\n\ + -j --section= Read section-relative offsets instead of addresses\n\ -s --basenames Strip directory names\n\ -f --functions Show function names\n\ -C --demangle[=style] Demangle function names\n\ @@ -150,11 +153,32 @@ find_address_in_section (bfd *abfd, asec &filename, &functionname, &line); } +/* Look for an offset in a section. This is directly called. */ + +static void +find_offset_in_section (bfd *abfd, asection *section) +{ + bfd_size_type size; + + if (found) + return; + + if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0) + return; + + size = bfd_get_section_size (section); + if (pc >= size) + return; + + found = bfd_find_nearest_line (abfd, section, syms, pc, + &filename, &functionname, &line); +} + /* Read hexadecimal addresses from stdin, translate into file_name:line_number and optionally function name. */ static void -translate_addresses (bfd *abfd) +translate_addresses (bfd *abfd, asection *section) { int read_stdin = (naddr == 0); @@ -177,7 +201,10 @@ translate_addresses (bfd *abfd) } found = FALSE; - bfd_map_over_sections (abfd, find_address_in_section, NULL); + if (section) + find_offset_in_section (abfd, section); + else + bfd_map_over_sections (abfd, find_address_in_section, NULL); if (! found) { @@ -237,9 +264,11 @@ translate_addresses (bfd *abfd) /* Process a file. */ static void -process_file (const char *file_name, const char *target) +process_file (const char *file_name, const char *section_name, + const char *target) { bfd *abfd; + asection *section; char **matching; if (get_file_size (file_name) < 1) @@ -250,7 +279,7 @@ process_file (const char *file_name, con bfd_fatal (file_name); if (bfd_check_format (abfd, bfd_archive)) - fatal (_("%s: can not get addresses from archive"), file_name); + fatal (_("%s: cannot get addresses from archive"), file_name); if (! bfd_check_format_matches (abfd, bfd_object, &matching)) { @@ -263,9 +292,18 @@ process_file (const char *file_name, con xexit (1); } + if (section_name != NULL) + { + section = bfd_get_section_by_name (abfd, section_name); + if (section == NULL) + fatal (_("%s: cannot find section %s"), file_name, section_name); + } + else + section = NULL; + slurp_symtab (abfd); - translate_addresses (abfd); + translate_addresses (abfd, section); if (syms != NULL) { @@ -276,12 +314,12 @@ process_file (const char *file_name, con bfd_close (abfd); } -int main (int, char **); int main (int argc, char **argv) { const char *file_name; + const char *section_name; char *target; int c; @@ -303,8 +341,9 @@ main (int argc, char **argv) set_default_bfd_target (); file_name = NULL; + section_name = NULL; target = NULL; - while ((c = getopt_long (argc, argv, "b:Ce:sfHhiVv", long_options, (int *) 0)) + while ((c = getopt_long (argc, argv, "b:Ce:sfHhij:Vv", long_options, (int *) 0)) != EOF) { switch (c) @@ -348,6 +387,9 @@ main (int argc, char **argv) case 'i': unwind_inlines = TRUE; break; + case 'j': + section_name = optarg; + break; default: usage (stderr, 1); break; @@ -360,7 +402,7 @@ main (int argc, char **argv) addr = argv + optind; naddr = argc - optind; - process_file (file_name, target); + process_file (file_name, section_name, target); return 0; } Index: doc/binutils.texi =================================================================== RCS file: /cvs/src/src/binutils/doc/binutils.texi,v retrieving revision 1.89 diff -u -p -r1.89 binutils.texi --- doc/binutils.texi 9 Mar 2006 21:50:53 -0000 1.89 +++ doc/binutils.texi 5 Apr 2006 07:37:34 -0000 @@ -2601,6 +2601,7 @@ addr2line [@option{-b} @var{bfdname}|@op [@option{-e} @var{filename}|@option{--exe=}@var{filename}] [@option{-f}|@option{--functions}] [@option{-s}|@option{--basename}] [@option{-i}|@option{--inlines}] + [@option{-j}|@option{--section=}@var{name}] [@option{-H}|@option{--help}] [@option{-V}|@option{--version}] [addr addr @dots{}] @c man end @@ -2608,13 +2609,14 @@ addr2line [@option{-b} @var{bfdname}|@op @c man begin DESCRIPTION addr2line -@command{addr2line} translates program addresses into file names and line -numbers. Given an address and an executable, it uses the debugging -information in the executable to figure out which file name and line -number are associated with a given address. - -The executable to use is specified with the @option{-e} option. The -default is the file @file{a.out}. +@command{addr2line} translates addresses into file names and line numbers. +Given an address in an executable or an offset in a section of a relocatable +object, it uses the debugging information to figure out which file name and +line number are associated with it. + +The executable or relocatable object to use is specified with the @option{-e} +option. The default is the file @file{a.out}. The section in the relocatable +object to use is specified with the @option{-j} option. @command{addr2line} has two modes of operation. @@ -2682,6 +2684,10 @@ function will also be printed. For exam @code{callee1} which inlines @code{callee2}, and address is from @code{callee2}, the source information for @code{callee1} and @code{main} will also be printed. + +@item -j +@itemx --section +Read offsets relative to the specified section instead of absolute addresses. @end table @c man end --Boundary-00=_3b3MEsoVtKPaXVG--