This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: binutils/9784: Would like an option to provide a prefix for the debug info source


This is a patch to implement --prefix=PREFIX and --prefix-strip=LEVEL.
OK to install?

Thanks.


H.J.
---
2009-01-25  H.J. Lu  <hongjiu.lu@intel.com>

	PR binutils/9784
	* NEWS: Mention --prefix=PREFIX and --prefix-strip=LEVEL.

	* doc/binutils.texi: Document --prefix=PREFIX and
	--prefix-strip=LEVEL.

	* objdump.c: Include "filenames.h".
	(prefix): New.
	(prefix_strip): Likewise.
	(prefix_length): Likewise.
	(usage): Add --prefix=PREFIX and --prefix-strip=LEVEL.
	(option_values): Add OPTION_PREFIX and OPTION_PREFIX_STRIP.
	(long_options): Likewise.
	(show_line): Handle prefix and prefix_strip.
	(main): Handle OPTION_PREFIX and OPTION_PREFIX_STRIP.

	* readelf.c (PATH_MAX): Moved to ...
	* sysdep.h: Here.

--- binutils/NEWS.pr9784	2009-01-13 07:35:38.000000000 -0800
+++ binutils/NEWS	2009-01-25 14:07:20.000000000 -0800
@@ -1,5 +1,8 @@
 -*- text -*-
 
+* Added --prefix=PREFIX and --prefix-strip=LEVEL switches to objdump to
+add absolute paths for -S.
+
 * Add new option --use-nul-prefixed-import-tables to dlltool to allow fall-
   back to old import table generation with null element prefix.
 
--- binutils/doc/binutils.texi.pr9784	2009-01-13 07:35:38.000000000 -0800
+++ binutils/doc/binutils.texi	2009-01-25 14:00:00.000000000 -0800
@@ -1614,6 +1614,8 @@ objdump [@option{-a}|@option{--archive-h
         [@option{--[no-]show-raw-insn}]
         [@option{--adjust-vma=}@var{offset}]
         [@option{--special-syms}]
+        [@option{--prefix=}@var{prefix}]
+        [@option{--prefix-strip=}@var{level}]
         [@option{-V}|@option{--version}]
         [@option{-H}|@option{--help}]
         @var{objfile}@dots{}
@@ -1936,6 +1938,16 @@ non-empty sections are displayed.
 Display source code intermixed with disassembly, if possible.  Implies
 @option{-d}.
 
+@item --prefix=@var{prefix}
+@cindex Add prefix to absolute paths
+Specify @var{prefix} to add to the absolute paths when used with
+@option{-S}. 
+
+@item --prefix-strip=@var{level}
+@cindex Strip absolute paths
+Indicate how many initial directory names to strip off the hardwired
+absolute paths. It has no effect without @option{--prefix=}@var{prefix}.
+
 @item --show-raw-insn
 When disassembling instructions, print the instruction in hex as well as
 in symbolic form.  This is the default except when
--- binutils/objdump.c.pr9784	2009-01-25 12:29:05.000000000 -0800
+++ binutils/objdump.c	2009-01-25 13:53:20.000000000 -0800
@@ -61,6 +61,7 @@
 #include "dis-asm.h"
 #include "libiberty.h"
 #include "demangle.h"
+#include "filenames.h"
 #include "debug.h"
 #include "budbg.h"
 
@@ -111,6 +112,9 @@ static int dump_special_syms = 0;	/* --s
 static bfd_vma adjust_section_vma = 0;	/* --adjust-vma */
 static int file_start_context = 0;      /* --file-start-context */
 static bfd_boolean display_file_offsets;/* -F */
+static const char *prefix;		/* --prefix */
+static int prefix_strip;		/* --prefix-strip */
+static size_t prefix_length;
 
 /* Pointer to an array of section names provided by
    one or more "-j secname" command line options.  */
@@ -231,6 +235,8 @@ usage (FILE *stream, int status)
       --[no-]show-raw-insn       Display hex alongside symbolic disassembly\n\
       --adjust-vma=OFFSET        Add OFFSET to all displayed section addresses\n\
       --special-syms             Include special symbols in symbol dumps\n\
+      --prefix=PREFIX            Add PREFIX to absolute paths for -S\n\
+      --prefix-strip=LEVEL       Strip initial directory names for -S\n\
 \n"));
       list_supported_targets (program_name, stream);
       list_supported_architectures (program_name, stream);
@@ -248,6 +254,8 @@ enum option_values
     OPTION_ENDIAN=150,
     OPTION_START_ADDRESS,
     OPTION_STOP_ADDRESS,
+    OPTION_PREFIX,
+    OPTION_PREFIX_STRIP,
     OPTION_ADJUST_VMA
   };
 
@@ -293,6 +301,8 @@ static struct option long_options[]=
   {"target", required_argument, NULL, 'b'},
   {"version", no_argument, NULL, 'V'},
   {"wide", no_argument, NULL, 'w'},
+  {"prefix", required_argument, NULL, OPTION_PREFIX},
+  {"prefix-strip", required_argument, NULL, OPTION_PREFIX_STRIP},
   {0, no_argument, 0, 0}
 };
 
@@ -1190,6 +1200,7 @@ show_line (bfd *abfd, asection *section,
   const char *filename;
   const char *functionname;
   unsigned int line;
+  bfd_boolean reloc;
 
   if (! with_line_numbers && ! with_source_code)
     return;
@@ -1203,6 +1214,43 @@ show_line (bfd *abfd, asection *section,
   if (functionname != NULL && *functionname == '\0')
     functionname = NULL;
 
+  if (filename
+      && IS_ABSOLUTE_PATH (filename)
+      && prefix)
+    {
+      char *path_up;
+      const char *fname = filename;
+      char *path = (char *) alloca (prefix_length + PATH_MAX + 1);
+
+      if (prefix_length)
+	memcpy (path, prefix, prefix_length);
+      path_up = path + prefix_length;
+
+      /* Build relocated filename, stripping off leading directories
+	 from the initial filename if requested. */
+      if (prefix_strip > 0)
+	{
+	  int level = 0;
+	  const char *s;
+
+	  /* Skip selected directory levels. */
+	  for (s = fname + 1; *s != '\0' && level < prefix_strip; s++)
+	    if (IS_DIR_SEPARATOR(*s))
+	      {
+		fname = s;
+		level++;
+	      }
+	}
+
+      /* Update complete filename. */
+      strcpy (path_up, fname);
+
+      filename = path;
+      reloc = TRUE;
+    }
+  else
+    reloc = FALSE;
+
   if (with_line_numbers)
     {
       if (functionname != NULL
@@ -1226,7 +1274,11 @@ show_line (bfd *abfd, asection *section,
       p = *pp;
 
       if (p == NULL)
+	{
+	  if (reloc)
+	    filename = xstrdup (filename);
 	  p = update_source_path (filename);
+	}
 
       if (p != NULL && line != p->last_line)
 	{
@@ -3165,6 +3217,18 @@ main (int argc, char **argv)
 	  if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
 	    fatal (_("error: the stop address should be after the start address"));
 	  break;
+	case OPTION_PREFIX:
+	  prefix = optarg;
+	  prefix_length = strlen (prefix);
+	  /* Remove an unnecessary trailing '/' */
+	  while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
+	    prefix_length--;
+	  break;
+	case OPTION_PREFIX_STRIP:
+	  prefix_strip = atoi (optarg);
+	  if (prefix_strip < 0)
+	    fatal (_("error: prefix strip must be non-negative"));
+	  break;
 	case 'E':
 	  if (strcmp (optarg, "B") == 0)
 	    endian = BFD_ENDIAN_BIG;
--- binutils/readelf.c.pr9784	2009-01-25 12:29:05.000000000 -0800
+++ binutils/readelf.c	2009-01-25 12:29:05.000000000 -0800
@@ -50,25 +50,6 @@
 #include <zlib.h>
 #endif
 
-/* For PATH_MAX.  */
-#ifdef HAVE_LIMITS_H
-#include <limits.h>
-#endif
-
-#ifndef PATH_MAX
-/* For MAXPATHLEN.  */
-# ifdef HAVE_SYS_PARAM_H
-#  include <sys/param.h>
-# endif
-# ifndef PATH_MAX
-#  ifdef MAXPATHLEN
-#   define PATH_MAX MAXPATHLEN
-#  else
-#   define PATH_MAX 1024
-#  endif
-# endif
-#endif
-
 #if __GNUC__ >= 2
 /* Define BFD64 here, even if our default architecture is 32 bit ELF
    as this will allow us to read in and parse 64bit and 32bit ELF files.
--- binutils/sysdep.h.pr9784	2008-08-25 09:25:22.000000000 -0700
+++ binutils/sysdep.h	2009-01-25 12:29:05.000000000 -0800
@@ -174,4 +174,23 @@ void *alloca ();
 /* Used by ar.c and objcopy.c.  */
 #define BUFSIZE 8192
 
+/* For PATH_MAX.  */
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifndef PATH_MAX
+/* For MAXPATHLEN.  */
+# ifdef HAVE_SYS_PARAM_H
+#  include <sys/param.h>
+# endif
+# ifndef PATH_MAX
+#  ifdef MAXPATHLEN
+#   define PATH_MAX MAXPATHLEN
+#  else
+#   define PATH_MAX 1024
+#  endif
+# endif
+#endif
+
 #endif /* _BIN_SYSDEP_H */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]