diff options
author | Jan Beulich <jbeulich@novell.com> | 2015-12-14 09:24:04 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2015-12-14 09:24:04 +0100 |
commit | 552e55ed06b1e68dfde4fbf3dc0dbd9f43f92108 (patch) | |
tree | afb7e77a6a0b0a38f912d4c4df08ad8b90d8cfa0 /binutils/nm.c | |
parent | 365f51be4900322d3c833183083ff359f4b93db6 (diff) | |
download | gdb-552e55ed06b1e68dfde4fbf3dc0dbd9f43f92108.zip gdb-552e55ed06b1e68dfde4fbf3dc0dbd9f43f92108.tar.gz gdb-552e55ed06b1e68dfde4fbf3dc0dbd9f43f92108.tar.bz2 |
nm: basic COFF symbol type support for SysV-style symbol table dumping
Diffstat (limited to 'binutils/nm.c')
-rw-r--r-- | binutils/nm.c | 56 |
1 files changed, 52 insertions, 4 deletions
diff --git a/binutils/nm.c b/binutils/nm.c index ad6e70d..e69caee 100644 --- a/binutils/nm.c +++ b/binutils/nm.c @@ -28,6 +28,13 @@ #include "libiberty.h" #include "elf-bfd.h" #include "elf/common.h" +#define DO_NOT_DEFINE_AOUTHDR +#define DO_NOT_DEFINE_FILHDR +#define DO_NOT_DEFINE_LINENO +#define DO_NOT_DEFINE_SCNHDR +#include "coff/external.h" +#include "coff/internal.h" +#include "libcoff.h" #include "bucomm.h" #include "plugin.h" @@ -56,6 +63,7 @@ struct extended_symbol_info symbol_info *sinfo; bfd_vma ssize; elf_symbol_type *elfinfo; + coff_symbol_type *coffinfo; /* FIXME: We should add more fields for Type, Line, Section. */ }; #define SYM_NAME(sym) (sym->sinfo->name) @@ -331,7 +339,7 @@ set_output_format (char *f) } static const char * -get_symbol_type (unsigned int type) +get_elf_symbol_type (unsigned int type) { static char buff [32]; @@ -354,6 +362,32 @@ get_symbol_type (unsigned int type) return buff; } } + +static const char * +get_coff_symbol_type (const struct internal_syment *sym) +{ + static char buff [32]; + + switch (sym->n_sclass) + { + case C_BLOCK: return "Block"; + case C_FILE: return "File"; + case C_LINE: return "Line"; + } + + if (!sym->n_type) + return "None"; + + switch (DTYPE(sym->n_type)) + { + case DT_FCN: return "Function"; + case DT_PTR: return "Pointer"; + case DT_ARY: return "Array"; + } + + sprintf (buff, _("<unknown>: %d/%d"), sym->n_sclass, sym->n_type); + return buff; +} /* Print symbol name NAME, read from ABFD, with printf format FORM, demangling it if requested. */ @@ -823,8 +857,17 @@ print_symbol (bfd * abfd, info.sinfo = &syminfo; info.ssize = ssize; - /* Synthetic symbols do not have a full elf_symbol_type set of data available. */ - info.elfinfo = is_synthetic ? NULL : elf_symbol_from (abfd, sym); + /* Synthetic symbols do not have a full symbol type set of data available. */ + if (is_synthetic) + { + info.elfinfo = NULL; + info.coffinfo = NULL; + } + else + { + info.elfinfo = elf_symbol_from (abfd, sym); + info.coffinfo = coff_symbol_from (sym); + } format->print_symbol_info (&info, abfd); @@ -1514,7 +1557,10 @@ print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd) /* Type, Size, Line, Section */ if (info->elfinfo) printf ("%18s|", - get_symbol_type (ELF_ST_TYPE (info->elfinfo->internal_elf_sym.st_info))); + get_elf_symbol_type (ELF_ST_TYPE (info->elfinfo->internal_elf_sym.st_info))); + else if (info->coffinfo) + printf ("%18s|", + get_coff_symbol_type (&info->coffinfo->native->u.syment)); else printf (" |"); @@ -1530,6 +1576,8 @@ print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd) if (info->elfinfo) printf("| |%s", info->elfinfo->symbol.section->name); + else if (info->coffinfo) + printf("| |%s", info->coffinfo->symbol.section->name); else printf("| |"); } |