aboutsummaryrefslogtreecommitdiff
path: root/binutils/objdump.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2009-02-03 15:48:50 +0000
committerH.J. Lu <hjl.tools@gmail.com>2009-02-03 15:48:50 +0000
commit0dafdf3fdf89c80c00904b699ff167ec1a292dec (patch)
tree0b0c265ae270a69f80a693e37ce883e3b724180a /binutils/objdump.c
parent34a0278d91d5af416424049a8a7a89b60b62ed18 (diff)
downloadfsf-binutils-gdb-0dafdf3fdf89c80c00904b699ff167ec1a292dec.zip
fsf-binutils-gdb-0dafdf3fdf89c80c00904b699ff167ec1a292dec.tar.gz
fsf-binutils-gdb-0dafdf3fdf89c80c00904b699ff167ec1a292dec.tar.bz2
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.
Diffstat (limited to 'binutils/objdump.c')
-rw-r--r--binutils/objdump.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 87ccc64..faae6ed 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -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}
};
@@ -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;