This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] nm: basic symbol type support for SysV-style symbol table dumping
- From: "Jan Beulich" <JBeulich at suse dot com>
- To: <binutils at sourceware dot org>
- Date: Tue, 08 Dec 2015 02:18:13 -0700
- Subject: Re: [PATCH] nm: basic symbol type support for SysV-style symbol table dumping
- Authentication-results: sourceware.org; auth=none
- References: <5665B25702000078000BCB47 at prv-mh dot provo dot novell dot com>
>>> On 07.12.15 at 16:22, <JBeulich@suse.com> wrote:
Btw., the title should really read "nm: basic COFF symbol type support
for SysV-style symbol table dumping", which is what I would commit if
approved.
Jan
> binutils/
> 2015-12-07 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-07/binutils/nm.c
> +++ 2015-12-07/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_
> /* 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_
>
> if (info->elfinfo)
> printf("| |%s", info->elfinfo->symbol.section->name);
> + else if (info->coffinfo)
> + printf("| |%s", info->coffinfo->symbol.section->name);
> else
> printf("| |");
> }