aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2015-12-14 09:24:04 +0100
committerJan Beulich <jbeulich@suse.com>2015-12-14 09:24:04 +0100
commit552e55ed06b1e68dfde4fbf3dc0dbd9f43f92108 (patch)
treeafb7e77a6a0b0a38f912d4c4df08ad8b90d8cfa0 /binutils
parent365f51be4900322d3c833183083ff359f4b93db6 (diff)
downloadgdb-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')
-rw-r--r--binutils/ChangeLog11
-rw-r--r--binutils/nm.c56
2 files changed, 63 insertions, 4 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 02e3683..5db9eac 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,14 @@
+2015-12-14 Jan Beulich <jbeulich@suse.com>
+
+ * nm.c: Include coff/external.h, coff/internal.h, and
+ libcoff.h.
+ (struct extended_symbol_info): New field "coffinfo".
+ (get_symbol_type): Rename to get_elf_symbol_type.
+ (get_coff_symbol_type): New.
+ (print_symbol): Also init info.coffinfo.
+ (print_symbol_info_sysv): Print type and section name also for
+ COFF symbols.
+
2015-12-08 Nick Clifton <nickc@redhat.com>
PR binutils/19310
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("| |");
}