]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
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 07:58:51 +0000 (17:28 +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.

(cherry picked from commit 4d1823674eedf267c7cafac2b923256db0b10ac8)

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 4cbb28e742bd97cc647cf6a5b3f1353000d8d906..6d1d01a566a0c209559e63905adf796a5604598e 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-12  Nick Clifton  <nickc@redhat.com>
 
        * po/ru.po: Updated Russian translation.
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 dfdf8f38c77bab13d3b7e1d232cae4dc77c9a4a7..f23997e7d6a4d75fce8416c9c29f2f8a3dc097d5 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 d5fe06e7eadf91b559896aa230e412402217fb7a..b8b916bfd3ab597c32c4b6fcd48b3082af35ad94 100644 (file)
@@ -2977,7 +2977,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 160febec94c9e8c988e7f30de6b2d6d0524f96e6..93fedc92624151c5ae574f189c3a5ae5a74b3a0f 100644 (file)
@@ -7116,7 +7116,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))
     {