2009-02-03 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 3 Feb 2009 15:48:50 +0000 (15:48 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
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 c18aa008fa6511448ac65b68eb014c7f8c00ed3b..cb1d6f0e8c54835042576acc5dd27a893a130347 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 60ea0cd7a1f7847799c8d8590b0a598a351a79ea..9b12f083c91517d79ab3dd7393e81657eaacdb42 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 2afe4c25f398a0adf59e94bab15ec69750ee23de..d45d6308b2f8966000e550c44d8bd7058156f8b4 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 87ccc64d0d96e11e7c544aaedadf36553b9453fa..faae6edfddc329024c1dd0adbe304b86ae3a9768 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 38da0b6ec27c15f0141ff46177396e2a45101cbf..d1b3e24edff47d0757107e93d5fc4f6a332d0a18 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 18518dccdc60e6b201e4df62d631e020b55b060c..e3d60d92f321a52e4a1f8d3f1ec0852af80fc438 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 */
This page took 0.03496 seconds and 4 git commands to generate.