[binutils-gdb] XCOFF C_STSYM test failure on 32-bit host

Alan Modra amodra@sourceware.org
Tue Dec 14 22:51:42 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=eda0ddeb26a117660f3c0f54572053117641c2c3

commit eda0ddeb26a117660f3c0f54572053117641c2c3
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Dec 14 21:13:21 2021 +1030

    XCOFF C_STSYM test failure on 32-bit host
    
    This test was failing here and on another similar symbol:
    [  4](sec  1)(fl 0x00)(ty   0)(scl 143) (nx 0) 0x05d1745d11745d21 .bs
    where correct output is
    [  4](sec  1)(fl 0x00)(ty   0)(scl 143) (nx 0) 0x000000000000000a .bs
    
    The problem is caused by a 32-bit host pointer being sign-extended
    when stored into a 64-bit bfd_vma, and then that value not being
    trimmed back to 32 bits when used.  The following belt-and-braces
    patch fixes both the store and subsequent reads.
    
            * coffcode.h (coff_slurp_symbol_table): Do not sign extend
            when storing a host pointer to syment.n_value.
            * coffgen.c (coff_get_symbol_info): Cast syment.n_value to a
            bfd_hostptr_t before using in arithmetic.
            (coff_print_symbol): Likewise.

Diff:
---
 bfd/coffcode.h |  4 ++--
 bfd/coffgen.c  | 11 ++++++-----
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index e2b256648ad..4405c9fe5ea 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -4826,8 +4826,8 @@ coff_slurp_symbol_table (bfd * abfd)
 	      /* The value is actually a symbol index.  Save a pointer
 		 to the symbol instead of the index.  FIXME: This
 		 should use a union.  */
-	      src->u.syment.n_value =
-		(long) (intptr_t) (native_symbols + src->u.syment.n_value);
+	      src->u.syment.n_value
+		= (bfd_hostptr_t) (native_symbols + src->u.syment.n_value);
 	      dst->symbol.value = src->u.syment.n_value;
 	      src->fix_value = 1;
 	      break;
diff --git a/bfd/coffgen.c b/bfd/coffgen.c
index 5474f6c24d8..5681af1b621 100644
--- a/bfd/coffgen.c
+++ b/bfd/coffgen.c
@@ -2130,10 +2130,10 @@ coff_get_symbol_info (bfd *abfd, asymbol *symbol, symbol_info *ret)
   if (coffsymbol (symbol)->native != NULL
       && coffsymbol (symbol)->native->fix_value
       && coffsymbol (symbol)->native->is_sym)
-    ret->value =
-      ((coffsymbol (symbol)->native->u.syment.n_value -
-	(bfd_hostptr_t) obj_raw_syments (abfd))
-       / sizeof (combined_entry_type));
+    ret->value
+      = (((bfd_hostptr_t) coffsymbol (symbol)->native->u.syment.n_value
+	  - (bfd_hostptr_t) obj_raw_syments (abfd))
+	 / sizeof (combined_entry_type));
 }
 
 /* Print out information about COFF symbol.  */
@@ -2181,7 +2181,8 @@ coff_print_symbol (bfd *abfd,
 	  if (! combined->fix_value)
 	    val = (bfd_vma) combined->u.syment.n_value;
 	  else
-	    val = ((combined->u.syment.n_value - (bfd_hostptr_t) root)
+	    val = (((bfd_hostptr_t) combined->u.syment.n_value
+		    - (bfd_hostptr_t) root)
 		   / sizeof (combined_entry_type));
 
 	  fprintf (file, "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x",


More information about the Binutils-cvs mailing list