.idata symbols should be reported with i or I flag by nm
authorAlan Modra <amodra@gmail.com>
Thu, 27 Feb 2020 03:53:34 +0000 (14:23 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 27 Feb 2020 21:49:42 +0000 (08:19 +1030)
PR 24511
* syms.c (stt): Trim off all but 'e', 'i' and 'p' entries.
(coff_section_type): Adjust comment.
(decode_section_type): Likewise.  Call coff_section_type before
decode_section_type.
(bfd_decode_symclass): Use 'c' for common sections other than
the standard one.

bfd/ChangeLog
bfd/syms.c

index e5cf5e125e25d13a3925b0f80da785c48c9294b7..6b267094320bcbd2c0976d563a58714942ed27a4 100644 (file)
@@ -1,3 +1,13 @@
+2020-02-27  Alan Modra  <amodra@gmail.com>
+
+       PR 24511
+       * syms.c (stt): Trim off all but 'e', 'i' and 'p' entries.
+       (coff_section_type): Adjust comment.
+       (decode_section_type): Likewise.  Call coff_section_type before
+       decode_section_type.
+       (bfd_decode_symclass): Use 'c' for common sections other than
+       the standard one.
+
 2020-02-27  Alan Modra  <amodra@gmail.com>
 
        * coff-rs6000.c (_bfd_xcoff_read_ar_hdr): Put all data in one
index 8a5c89767a88cac997678e984f1d5665d3938068..c1de8ebab17c5e7633357d765c0dcc60ca308b9e 100644 (file)
@@ -565,30 +565,15 @@ struct section_to_type
   char type;
 };
 
-/* Map section names to POSIX/BSD single-character symbol types.
+/* Map special section names to POSIX/BSD single-character symbol types.
    This table is probably incomplete.  It is sorted for convenience of
    adding entries.  Since it is so short, a linear search is used.  */
 static const struct section_to_type stt[] =
 {
-  {".bss", 'b'},
-  {"code", 't'},               /* MRI .text */
-  {".data", 'd'},
-  {"*DEBUG*", 'N'},
-  {".debug", 'N'},             /* MSVC's .debug (non-standard debug syms) */
   {".drectve", 'i'},           /* MSVC's .drective section */
   {".edata", 'e'},             /* MSVC's .edata (export) section */
-  {".fini", 't'},              /* ELF fini section */
   {".idata", 'i'},             /* MSVC's .idata (import) section */
-  {".init", 't'},              /* ELF init section */
   {".pdata", 'p'},             /* MSVC's .pdata (stack unwind) section */
-  {".rdata", 'r'},             /* Read only data.  */
-  {".rodata", 'r'},            /* Read only data.  */
-  {".sbss", 's'},              /* Small BSS (uninitialized data).  */
-  {".scommon", 'c'},           /* Small common.  */
-  {".sdata", 'g'},             /* Small initialized data.  */
-  {".text", 't'},
-  {"vars", 'd'},               /* MRI .data */
-  {"zerovars", 'b'},           /* MRI .bss */
   {0, 0}
 };
 
@@ -596,8 +581,7 @@ static const struct section_to_type stt[] =
    section S, or '?' for an unknown COFF section.
 
    Check for leading strings which match, followed by a number, '.',
-   or '$' so .text5 matches the .text entry, but .init_array doesn't
-   match the .init entry.  */
+   or '$' so .idata5 matches the .idata entry.  */
 
 static char
 coff_section_type (const char *s)
@@ -619,7 +603,7 @@ coff_section_type (const char *s)
    SECTION, or '?' for an unknown section.  This uses section flags to
    identify sections.
 
-   FIXME These types are unhandled: c, i, e, p.  If we handled these also,
+   FIXME These types are unhandled: e, i, p.  If we handled these also,
    we could perhaps obsolete coff_section_type.  */
 
 static char
@@ -668,7 +652,12 @@ bfd_decode_symclass (asymbol *symbol)
   char c;
 
   if (symbol->section && bfd_is_com_section (symbol->section))
-    return 'C';
+    {
+      if (symbol->section == bfd_com_section_ptr)
+       return 'C';
+      else
+       return 'c';
+    }
   if (bfd_is_und_section (symbol->section))
     {
       if (symbol->flags & BSF_WEAK)
@@ -705,9 +694,9 @@ bfd_decode_symclass (asymbol *symbol)
     c = 'a';
   else if (symbol->section)
     {
-      c = decode_section_type (symbol->section);
+      c = coff_section_type (symbol->section->name);
       if (c == '?')
-       c = coff_section_type (symbol->section->name);
+       c = decode_section_type (symbol->section);
     }
   else
     return '?';