PR26389, nm prints "c" for a common symbol with -flto and -fcommon
authorAlan Modra <amodra@gmail.com>
Sat, 15 Aug 2020 00:12:44 +0000 (09:42 +0930)
committerAlan Modra <amodra@gmail.com>
Sat, 15 Aug 2020 04:46:02 +0000 (14:16 +0930)
git commit 49d9fd42acef chose to make nm print 'C' for the normal
common section, and 'c' for other commons.  This was an attempt to
make common symbols in .scommon and other small common sections show
a 'c' type without a section name comparison, but it failed for
nm --plugin on lto objects where normal common symbols are stashed in
a "plug" section.  It's also wrong for large common symbols.  So
instead set SEC_SMALL_DATA on sections created for small commons, and
key off that flag to show 'c' type.  If your ELF target doesn't have
an elf_backend_symbol_processing function, then you won't see 'c' for
symbols in .scommon.

Note that due to bfd_decode_symclass decoding common symbols without
a chance for coff_section_type to treat .scommon specially, then
having .scommon in the array of special sections handled by
coff_section_type prior to 49d9fd42acef was entirely ineffective.
That fact escaped me when writing 49d9fd42acef.  Unless .scommon
didn't have SEC_IS_COMMON set, which would be a little weird.

PR 26389
* syms.c (bfd_decode_symclass): Choose 'c' for commons only when
SEC_SMALL_DATA.
* elf32-m32r.c (_bfd_m32r_elf_symbol_processing): Set SEC_SMALL_DATA
on small common section.
* elf32-score.c (s3_bfd_score_elf_symbol_processing): Likewise.
* elf32-score7.c (s7_bfd_score_elf_symbol_processing): Likewise.
* elf32-tic6x.c (elf32_tic6x_symbol_processing): Likewise.
* elf32-v850.c (v850_elf_symbol_processing): Likewise.
* elfxx-mips.c (_bfd_mips_elf_symbol_processing): Likewise.
* ecoff.c (ecoff_set_symbol_info, ecoff_link_add_externals): Likewise.

bfd/ChangeLog
bfd/ecoff.c
bfd/elf32-m32r.c
bfd/elf32-score.c
bfd/elf32-score7.c
bfd/elf32-tic6x.c
bfd/elf32-v850.c
bfd/elfxx-mips.c
bfd/syms.c

index ef077c4131c4c1e02fa644225e3a862bca7dd9b3..85fb61887a7cbc647106349bf2924e604a267b72 100644 (file)
@@ -1,3 +1,17 @@
+2020-08-15  Alan Modra  <amodra@gmail.com>
+
+       PR 26389
+       * syms.c (bfd_decode_symclass): Choose 'c' for commons only when
+       SEC_SMALL_DATA.
+       * elf32-m32r.c (_bfd_m32r_elf_symbol_processing): Set SEC_SMALL_DATA
+       on small common section.
+       * elf32-score.c (s3_bfd_score_elf_symbol_processing): Likewise.
+       * elf32-score7.c (s7_bfd_score_elf_symbol_processing): Likewise.
+       * elf32-tic6x.c (elf32_tic6x_symbol_processing): Likewise.
+       * elf32-v850.c (v850_elf_symbol_processing): Likewise.
+       * elfxx-mips.c (_bfd_mips_elf_symbol_processing): Likewise.
+       * ecoff.c (ecoff_set_symbol_info, ecoff_link_add_externals): Likewise.
+
 2020-08-14  Alan Modra  <amodra@gmail.com>
 
        * hash.c (bfd_hash_set_default_size): Use higher_prime_number
index dcded6f4a7e6bf384f311232958b7fbe74ecd11c..2e4bf888bea6a7bfa6c875278c9e04790ee8eaa5 100644 (file)
@@ -791,7 +791,7 @@ ecoff_set_symbol_info (bfd *abfd,
        {
          /* Initialize the small common section.  */
          ecoff_scom_section.name = SCOMMON;
-         ecoff_scom_section.flags = SEC_IS_COMMON;
+         ecoff_scom_section.flags = SEC_IS_COMMON | SEC_SMALL_DATA;
          ecoff_scom_section.output_section = &ecoff_scom_section;
          ecoff_scom_section.symbol = &ecoff_scom_symbol;
          ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
@@ -3404,7 +3404,7 @@ ecoff_link_add_externals (bfd *abfd,
            {
              /* Initialize the small common section.  */
              ecoff_scom_section.name = SCOMMON;
-             ecoff_scom_section.flags = SEC_IS_COMMON;
+             ecoff_scom_section.flags = SEC_IS_COMMON | SEC_SMALL_DATA;
              ecoff_scom_section.output_section = &ecoff_scom_section;
              ecoff_scom_section.symbol = &ecoff_scom_symbol;
              ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
index 2eae00b8e28f0ef85d5242ece1cb61b1728a1ca5..ea8e3376512c81ce52bd8abf2697e5a89d7fb6d2 100644 (file)
@@ -1354,7 +1354,7 @@ _bfd_m32r_elf_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *asym)
        {
          /* Initialize the small common section.  */
          m32r_elf_scom_section.name = ".scommon";
-         m32r_elf_scom_section.flags = SEC_IS_COMMON;
+         m32r_elf_scom_section.flags = SEC_IS_COMMON | SEC_SMALL_DATA;
          m32r_elf_scom_section.output_section = &m32r_elf_scom_section;
          m32r_elf_scom_section.symbol = &m32r_elf_scom_symbol;
          m32r_elf_scom_section.symbol_ptr_ptr = &m32r_elf_scom_symbol_ptr;
index d1a910f2795e9701fd96b291183bf9411164948f..4be656102f25fc640fb203dcc1a553d50021c572 100644 (file)
@@ -3035,7 +3035,7 @@ s3_bfd_score_elf_symbol_processing (bfd *abfd, asymbol *asym)
        {
          /* Initialize the small common section.  */
          score_elf_scom_section.name = ".scommon";
-         score_elf_scom_section.flags = SEC_IS_COMMON;
+         score_elf_scom_section.flags = SEC_IS_COMMON | SEC_SMALL_DATA;
          score_elf_scom_section.output_section = &score_elf_scom_section;
          score_elf_scom_section.symbol = &score_elf_scom_symbol;
          score_elf_scom_section.symbol_ptr_ptr = &score_elf_scom_symbol_ptr;
index ab5e32a29a4cc2d923ce13bbee5c4e95770796cc..c9746905b230f12c2c45ba35e7c23f8a91df0cd4 100644 (file)
@@ -2840,7 +2840,7 @@ s7_bfd_score_elf_symbol_processing (bfd *abfd, asymbol *asym)
        {
          /* Initialize the small common section.  */
          score_elf_scom_section.name = ".scommon";
-         score_elf_scom_section.flags = SEC_IS_COMMON;
+         score_elf_scom_section.flags = SEC_IS_COMMON | SEC_SMALL_DATA;
          score_elf_scom_section.output_section = &score_elf_scom_section;
          score_elf_scom_section.symbol = &score_elf_scom_symbol;
          score_elf_scom_section.symbol_ptr_ptr = &score_elf_scom_symbol_ptr;
index 9984c05203341cae4a92c6d8f5008aeeb8e8be28..a37ae293175c8532cc014ff12ee40217852c2ba2 100644 (file)
@@ -2974,7 +2974,7 @@ elf32_tic6x_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *asym)
        {
          /* Initialize the small common section.  */
          tic6x_elf_scom_section.name = ".scommon";
-         tic6x_elf_scom_section.flags = SEC_IS_COMMON;
+         tic6x_elf_scom_section.flags = SEC_IS_COMMON | SEC_SMALL_DATA;
          tic6x_elf_scom_section.output_section = &tic6x_elf_scom_section;
          tic6x_elf_scom_section.symbol = &tic6x_elf_scom_symbol;
          tic6x_elf_scom_section.symbol_ptr_ptr = &tic6x_elf_scom_symbol_ptr;
index 0235044d2de47d79b06b1c656da6e5b7fdab6688..c1e959e6c2d2b58a0ddd304f7d64a41131789f69 100644 (file)
@@ -3001,7 +3001,8 @@ v850_elf_symbol_processing (bfd *abfd, asymbol *asym)
        {
          /* Initialize the small common section.  */
          v850_elf_scom_section.name           = ".scommon";
-         v850_elf_scom_section.flags          = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
+         v850_elf_scom_section.flags
+           = SEC_IS_COMMON | SEC_SMALL_DATA | SEC_ALLOC | SEC_DATA;
          v850_elf_scom_section.output_section = & v850_elf_scom_section;
          v850_elf_scom_section.symbol         = & v850_elf_scom_symbol;
          v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
@@ -3019,7 +3020,7 @@ v850_elf_symbol_processing (bfd *abfd, asymbol *asym)
        {
          /* Initialize the tcommon section.  */
          v850_elf_tcom_section.name           = ".tcommon";
-         v850_elf_tcom_section.flags          = SEC_IS_COMMON;
+         v850_elf_tcom_section.flags          = SEC_IS_COMMON | SEC_SMALL_DATA;
          v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
          v850_elf_tcom_section.symbol         = & v850_elf_tcom_symbol;
          v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
@@ -3037,7 +3038,7 @@ v850_elf_symbol_processing (bfd *abfd, asymbol *asym)
        {
          /* Initialize the zcommon section.  */
          v850_elf_zcom_section.name           = ".zcommon";
-         v850_elf_zcom_section.flags          = SEC_IS_COMMON;
+         v850_elf_zcom_section.flags          = SEC_IS_COMMON | SEC_SMALL_DATA;
          v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
          v850_elf_zcom_section.symbol         = & v850_elf_zcom_symbol;
          v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
index 7cfce13cdb48ea3875c0e0b7bbbe54fc7e31ea9b..5b985a493d84239b7d69ca582f5db450cb1ca728 100644 (file)
@@ -7113,7 +7113,7 @@ _bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
        {
          /* Initialize the small common section.  */
          mips_elf_scom_section.name = ".scommon";
-         mips_elf_scom_section.flags = SEC_IS_COMMON;
+         mips_elf_scom_section.flags = SEC_IS_COMMON | SEC_SMALL_DATA;
          mips_elf_scom_section.output_section = &mips_elf_scom_section;
          mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
          mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
index b9f73361e6d314e6dc92a2adce1b9580757f9c27..cb25af17fa1da372a2b46c154e5d201e01fda8be 100644 (file)
@@ -653,10 +653,10 @@ bfd_decode_symclass (asymbol *symbol)
 
   if (symbol->section && bfd_is_com_section (symbol->section))
     {
-      if (symbol->section == bfd_com_section_ptr)
-       return 'C';
-      else
+      if (symbol->section->flags & SEC_SMALL_DATA)
        return 'c';
+      else
+       return 'C';
     }
   if (bfd_is_und_section (symbol->section))
     {