diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2009-02-03 15:48:50 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2009-02-03 15:48:50 +0000 |
commit | 0dafdf3fdf89c80c00904b699ff167ec1a292dec (patch) | |
tree | 0b0c265ae270a69f80a693e37ce883e3b724180a /binutils/objdump.c | |
parent | 34a0278d91d5af416424049a8a7a89b60b62ed18 (diff) | |
download | fsf-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.c | 65 |
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; |