X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Fnm.c;h=1dbf47e84a9201482111b13540a2216e842c47cb;hb=42e344a77c6f6f46e98482117e80c3d0ea9db853;hp=c47e99e581bef9e3689fa4adefdd3d3f7edece91;hpb=869b9d07bbfd935cc39b6bccb3da0506e467b6a7;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/nm.c b/binutils/nm.c index c47e99e581..1dbf47e84a 100644 --- a/binutils/nm.c +++ b/binutils/nm.c @@ -1,13 +1,13 @@ /* nm.c -- Describe symbol table of a rel file. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005 + 2001, 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -20,10 +20,9 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "sysdep.h" #include "bfd.h" #include "progress.h" -#include "bucomm.h" -#include "budemang.h" #include "getopt.h" #include "aout/stab_gnu.h" #include "aout/ranlib.h" @@ -31,6 +30,7 @@ #include "libiberty.h" #include "elf-bfd.h" #include "elf/common.h" +#include "bucomm.h" /* When sorting by size, we use this structure to hold the size and a pointer to the minisymbol. */ @@ -159,20 +159,13 @@ static int filename_per_file = 0; /* Once per file, on its own line. */ static int filename_per_symbol = 0; /* Once per symbol, at start of line. */ /* Print formats for printing a symbol value. */ -#ifndef BFD64 -static char value_format[] = "%08lx"; -#else +static char value_format_32bit[] = "%08lx"; #if BFD_HOST_64BIT_LONG -static char value_format[] = "%016lx"; -#else -/* We don't use value_format for this case. */ -#endif -#endif -#ifdef BFD64 -static int print_width = 16; -#else -static int print_width = 8; +static char value_format_64bit[] = "%016lx"; +#elif BFD_HOST_64BIT_LONG_LONG +static char value_format_64bit[] = "%016llx"; #endif +static int print_width = 0; static int print_radix = 16; /* Print formats for printing stab info. */ static char other_format[] = "%02x"; @@ -254,11 +247,12 @@ usage (FILE *stream, int status) --target=BFDNAME Specify the target object format as BFDNAME\n\ -u, --undefined-only Display only undefined symbols\n\ -X 32_64 (ignored)\n\ + @FILE Read options from FILE\n\ -h, --help Display this information\n\ -V, --version Display this program's version number\n\ \n")); list_supported_targets (program_name, stream); - if (status == 0) + if (REPORT_BUGS_TO[0] && status == 0) fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO); exit (status); } @@ -278,15 +272,11 @@ set_print_radix (char *radix) print_radix = 10; else print_radix = 8; -#ifndef BFD64 - value_format[4] = *radix; -#else + value_format_32bit[4] = *radix; #if BFD_HOST_64BIT_LONG - value_format[5] = *radix; -#else - /* This case requires special handling for octal and decimal - printing. */ -#endif + value_format_64bit[5] = *radix; +#elif BFD_HOST_64BIT_LONG_LONG + value_format_64bit[6] = *radix; #endif other_format[3] = desc_format[3] = *radix; break; @@ -353,11 +343,14 @@ print_symname (const char *format, const char *name, bfd *abfd) { if (do_demangle && *name) { - char *res = demangle (abfd, name); + char *res = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS); - printf (format, res); - free (res); - return; + if (res != NULL) + { + printf (format, res); + free (res); + return; + } } printf (format, name); @@ -1092,6 +1085,26 @@ display_rel_file (bfd *abfd, bfd *archive_bfd) free (minisyms); } +static void +set_print_width (bfd *file) +{ + print_width = bfd_get_arch_size (file); + + if (print_width == -1) + { + /* PR binutils/4292 + Guess the target's bitsize based on its name. + We assume here than any 64-bit format will include + "64" somewhere in its name. The only known exception + is the MMO object file format. */ + if (strstr (bfd_get_target (file), "64") != NULL + || strcmp (bfd_get_target (file), "mmo") == 0) + print_width = 64; + else + print_width = 32; + } +} + static void display_archive (bfd *file) { @@ -1119,10 +1132,7 @@ display_archive (bfd *file) if (bfd_check_format_matches (arfile, bfd_object, &matching)) { - char buf[30]; - - bfd_sprintf_vma (arfile, buf, (bfd_vma) -1); - print_width = strlen (buf); + set_print_width (arfile); format->print_archive_member (bfd_get_filename (file), bfd_get_filename (arfile)); display_rel_file (arfile, file); @@ -1177,10 +1187,7 @@ display_file (char *filename) } else if (bfd_check_format_matches (file, bfd_object, &matching)) { - char buf[30]; - - bfd_sprintf_vma (file, buf, (bfd_vma) -1); - print_width = strlen (buf); + set_print_width (file); format->print_object_filename (filename); display_rel_file (file, NULL); } @@ -1226,7 +1233,7 @@ print_object_filename_sysv (char *filename) printf (_("\n\nUndefined symbols from %s:\n\n"), filename); else printf (_("\n\nSymbols from %s:\n\n"), filename); - if (print_width == 8) + if (print_width == 32) printf (_("\ Name Value Class Type Size Line Section\n\n")); else @@ -1277,7 +1284,7 @@ print_archive_member_sysv (char *archive, const char *filename) printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename); else printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename); - if (print_width == 8) + if (print_width == 32) printf (_("\ Name Value Class Type Size Line Section\n\n")); else @@ -1335,29 +1342,42 @@ print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd) static void print_value (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma val) { -#if ! defined (BFD64) || BFD_HOST_64BIT_LONG - printf (value_format, val); -#else - /* We have a 64 bit value to print, but the host is only 32 bit. */ - if (print_radix == 16) - bfd_fprintf_vma (abfd, stdout, val); - else + switch (print_width) { - char buf[30]; - char *s; + case 32: + printf (value_format_32bit, (unsigned long) val); + break; - s = buf + sizeof buf; - *--s = '\0'; - while (val > 0) + case 64: +#if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG + printf (value_format_64bit, val); +#else + /* We have a 64 bit value to print, but the host is only 32 bit. */ + if (print_radix == 16) + bfd_fprintf_vma (abfd, stdout, val); + else { - *--s = (val % print_radix) + '0'; - val /= print_radix; + char buf[30]; + char *s; + + s = buf + sizeof buf; + *--s = '\0'; + while (val > 0) + { + *--s = (val % print_radix) + '0'; + val /= print_radix; + } + while ((buf + sizeof buf - 1) - s < 16) + *--s = '0'; + printf ("%s", s); } - while ((buf + sizeof buf - 1) - s < 16) - *--s = '0'; - printf ("%s", s); - } #endif + break; + + default: + fatal (_("Print width has not been initialized (%d)"), print_width); + break; + } } /* Print a line of information about a symbol. */ @@ -1367,7 +1387,7 @@ print_symbol_info_bsd (struct extended_symbol_info *info, bfd *abfd) { if (bfd_is_undefined_symclass (SYM_TYPE (info))) { - if (print_width == 16) + if (print_width == 64) printf (" "); printf (" "); } @@ -1410,7 +1430,7 @@ print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd) if (bfd_is_undefined_symclass (SYM_TYPE (info))) { - if (print_width == 8) + if (print_width == 32) printf (" "); else printf (" "); @@ -1440,7 +1460,7 @@ print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd) print_value (abfd, SYM_SIZE (info)); else { - if (print_width == 8) + if (print_width == 32) printf (" "); else printf (" ");