2002-06-15 H.J. Lu (hjl@gnu.org) * nm.c: Include "elf/common.h". (extended_symbol_info): Add elfinfo, a pointer to elf_symbol_type. (SYM_SIZE): Use elfinfo if it is not NULL. (get_symbol_type): New function. (print_symbols): Pass (bfd_vma) 0 to print_symbol. (print_symbol): Set the elfinfo field in extended_symbol_info for ELF. (print_object_filename_sysv): Fix the output format. (print_symbol_info_sysv): Print type and section for ELF. --- binutils/nm.c.sysv Sat Jun 15 11:41:11 2002 +++ binutils/nm.c Sat Jun 15 23:46:29 2002 @@ -29,6 +29,7 @@ #include "demangle.h" #include "libiberty.h" #include "elf-bfd.h" +#include "elf/common.h" /* When sorting by size, we use this structure to hold the size and a pointer to the minisymbol. */ @@ -54,6 +55,7 @@ struct extended_symbol_info { symbol_info *sinfo; bfd_vma ssize; + elf_symbol_type *elfinfo; /* FIXME: We should add more fields for Type, Line, Section. */ }; #define SYM_NAME(sym) (sym->sinfo->name) @@ -62,7 +64,8 @@ struct extended_symbol_info #define SYM_STAB_NAME(sym) (sym->sinfo->stab_name) #define SYM_STAB_DESC(sym) (sym->sinfo->stab_desc) #define SYM_STAB_OTHER(sym) (sym->sinfo->stab_other) -#define SYM_SIZE(sym) (sym->ssize) +#define SYM_SIZE(sym) \ + (sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize) static void usage PARAMS ((FILE *, int)); static void set_print_radix PARAMS ((char *)); @@ -104,6 +107,7 @@ static void print_symbol_info_bsd PARAMS static void print_symbol_info_sysv PARAMS ((struct extended_symbol_info *, bfd *)); static void print_symbol_info_posix PARAMS ((struct extended_symbol_info *, bfd *)); static void get_relocs PARAMS ((bfd *, asection *, PTR)); +static const char * get_symbol_type PARAMS ((unsigned int)); /* Support for different output formats. */ struct output_fns @@ -497,6 +501,32 @@ main (argc, argv) return retval; } +static const char * +get_symbol_type (type) + unsigned int type; +{ + static char buff [32]; + + switch (type) + { + case STT_NOTYPE: return "NOTYPE"; + case STT_OBJECT: return "OBJECT"; + case STT_FUNC: return "FUNC"; + case STT_SECTION: return "SECTION"; + case STT_FILE: return "FILE"; + case STT_COMMON: return "COMMON"; + case STT_TLS: return "TLS"; + default: + if (type >= STT_LOPROC && type <= STT_HIPROC) + sprintf (buff, _(": %d"), type); + else if (type >= STT_LOOS && type <= STT_HIOS) + sprintf (buff, _(": %d"), type); + else + sprintf (buff, _(": %d"), type); + return buff; + } +} + static void display_archive (file) bfd *file; @@ -1079,18 +1109,12 @@ print_symbols (abfd, dynamic, minisyms, for (; from < fromend; from += size) { asymbol *sym; - bfd_vma ssize; sym = bfd_minisymbol_to_symbol (abfd, dynamic, from, store); if (sym == NULL) bfd_fatal (bfd_get_filename (abfd)); - if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) - ssize = ((elf_symbol_type *) sym)->internal_elf_sym.st_size; - else - ssize = 0; - - print_symbol (abfd, sym, ssize, archive_bfd); + print_symbol (abfd, sym, (bfd_vma) 0, archive_bfd); } } @@ -1161,6 +1185,10 @@ print_symbol (abfd, sym, ssize, archive_ bfd_get_symbol_info (abfd, sym, &syminfo); info.sinfo = &syminfo; info.ssize = ssize; + if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) + info.elfinfo = (elf_symbol_type *) sym; + else + info.elfinfo = NULL; (*format->print_symbol_info) (&info, abfd); } @@ -1304,7 +1332,7 @@ print_object_filename_sysv (filename) else printf (_("\n\nSymbols from %s:\n\n"), filename); printf (_("\ -Name Value Class Type Size Line Section\n\n")); +Name Value Class Type Size Line Section\n\n")); } static void @@ -1505,14 +1533,21 @@ print_symbol_info_sysv (info, abfd) else { /* Type, Size, Line, Section */ - printf (" |"); + if (info->elfinfo) + printf ("%18s|", + get_symbol_type (ELF_ST_TYPE (info->elfinfo->internal_elf_sym.st_info))); + else + printf (" |"); if (SYM_SIZE (info)) print_value (abfd, SYM_SIZE (info)); else printf(" "); - printf("| |"); + if (info->elfinfo) + printf("| |%s", info->elfinfo->symbol.section->name); + else + printf("| |"); } }