+
+ 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.
+
* NEWS: Mention --as-needed change.
[@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{}
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
#include "dis-asm.h"
#include "libiberty.h"
#include "demangle.h"
+#include "filenames.h"
#include "debug.h"
#include "budbg.h"
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. */
--[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);
OPTION_ENDIAN=150,
OPTION_START_ADDRESS,
OPTION_STOP_ADDRESS,
+ OPTION_PREFIX,
+ OPTION_PREFIX_STRIP,
OPTION_ADJUST_VMA
};
{"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
const char *filename;
const char *functionname;
unsigned int line;
+ bfd_boolean reloc;
if (! with_line_numbers && ! with_source_code)
return;
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
p = *pp;
if (p == NULL)
+ {
+ if (reloc)
+ filename = xstrdup (filename);
p = update_source_path (filename);
+ }
if (p != NULL && line != p->last_line)
{
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;