From 0dafdf3fdf89c80c00904b699ff167ec1a292dec Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 3 Feb 2009 15:48:50 +0000 Subject: [PATCH] 2009-02-03 H.J. Lu 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 | 21 ++++++++++++ binutils/NEWS | 3 ++ binutils/doc/binutils.texi | 12 +++++++ binutils/objdump.c | 65 ++++++++++++++++++++++++++++++++++++++ binutils/readelf.c | 19 ----------- binutils/sysdep.h | 19 +++++++++++ 6 files changed, 120 insertions(+), 19 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index c18aa008fa6..cb1d6f0e8c5 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,24 @@ +2009-02-03 H.J. Lu + + 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 * NEWS: Mention --as-needed change. diff --git a/binutils/NEWS b/binutils/NEWS index 60ea0cd7a1f..9b12f083c91 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -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. diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 2afe4c25f39..d45d6308b2f 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -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 diff --git a/binutils/objdump.c b/binutils/objdump.c index 87ccc64d0d9..faae6edfddc 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; diff --git a/binutils/readelf.c b/binutils/readelf.c index 38da0b6ec27..d1b3e24edff 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -50,25 +50,6 @@ #include #endif -/* For PATH_MAX. */ -#ifdef HAVE_LIMITS_H -#include -#endif - -#ifndef PATH_MAX -/* For MAXPATHLEN. */ -# ifdef HAVE_SYS_PARAM_H -# include -# 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. diff --git a/binutils/sysdep.h b/binutils/sysdep.h index 18518dccdc6..e3d60d92f32 100644 --- a/binutils/sysdep.h +++ b/binutils/sysdep.h @@ -174,4 +174,23 @@ void *alloca (); /* Used by ar.c and objcopy.c. */ #define BUFSIZE 8192 +/* For PATH_MAX. */ +#ifdef HAVE_LIMITS_H +#include +#endif + +#ifndef PATH_MAX +/* For MAXPATHLEN. */ +# ifdef HAVE_SYS_PARAM_H +# include +# endif +# ifndef PATH_MAX +# ifdef MAXPATHLEN +# define PATH_MAX MAXPATHLEN +# else +# define PATH_MAX 1024 +# endif +# endif +#endif + #endif /* _BIN_SYSDEP_H */ -- 2.30.2