This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] nm: basic symbol type support for SysV-style symbol table dumping


>>> 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("|     |");
>      }




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]