OSDN Git Service

2009-02-03 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl@lucon.org>
Tue, 3 Feb 2009 15:48:50 +0000 (15:48 +0000)
committerH.J. Lu <hjl@lucon.org>
Tue, 3 Feb 2009 15:48:50 +0000 (15:48 +0000)
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/ChangeLog
binutils/NEWS
binutils/doc/binutils.texi
binutils/objdump.c
binutils/readelf.c
binutils/sysdep.h

index c18aa00..cb1d6f0 100644 (file)
@@ -1,3 +1,24 @@
+2009-02-03  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.
+
 2009-01-31  Alan Modra  <amodra@bigpond.net.au>
 
        * NEWS: Mention --as-needed change.
index 60ea0cd..9b12f08 100644 (file)
@@ -5,6 +5,9 @@
   latter case the library is not linked if it is found in a DT_NEEDED
   entry of one of the libraries already linked.
 
+* 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.
 
index 2afe4c2..d45d630 100644 (file)
@@ -1614,6 +1614,8 @@ objdump [@option{-a}|@option{--archive-headers}]
         [@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
index 87ccc64..faae6ed 100644 (file)
@@ -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;   /* --special-syms */
 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}
 };
 \f
@@ -1190,6 +1200,7 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
   const char *filename;
   const char *functionname;
   unsigned int line;
+  bfd_boolean reloc;
 
   if (! with_line_numbers && ! with_source_code)
     return;
@@ -1203,6 +1214,44 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
   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. */
+      strncpy (path_up, fname, PATH_MAX);
+      path_up[PATH_MAX] = '\0';
+
+      filename = path;
+      reloc = TRUE;
+    }
+  else
+    reloc = FALSE;
+
   if (with_line_numbers)
     {
       if (functionname != NULL
@@ -1226,7 +1275,11 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
       p = *pp;
 
       if (p == NULL)
+       {
+         if (reloc)
+           filename = xstrdup (filename);
          p = update_source_path (filename);
+       }
 
       if (p != NULL && line != p->last_line)
        {
@@ -3161,6 +3214,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;
index 38da0b6..d1b3e24 100644 (file)
 #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.
index 18518dc..e3d60d9 100644 (file)
@@ -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 */