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.
This commit is contained in:
H.J. Lu 2009-02-03 15:48:50 +00:00
parent 34a0278d91
commit 0dafdf3fdf
6 changed files with 120 additions and 19 deletions

View 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}
};
@ -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;