This is the mail archive of the binutils-cvs@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]

[binutils-gdb] Use a 32-bit value to hold the section number in the internal COFF symbol structure.


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

commit 9ae678af999b8a692c4e6efbe493f39f0085d149
Author: Nick Clifton <nickc@redhat.com>
Date:   Mon Jan 18 15:58:47 2016 +0000

    Use a 32-bit value to hold the section number in the internal COFF symbol structure.
    
    	PR ld/19440
    inc	* coff/internal.h (internal_syment): Use int to hold section
    	number.
    	(N_UNDEF): Cast to int not short.
    	(N_ABS): Likewise.
    	(N_DEBUG): Likewise.
    	(N_TV): Likewise.
    	(P_TV): Likewise.
    
    bfd	PR ld/19440
    	* coff-rs6000.c (_bfd_xcoff_swap_sym_in): Sign extend external
    	section number into internal section number.
    	* coff64-rs6000.c (_bfd_xcoff64_swap_sym_in): Likewise.
    	* coffswap.h (coff_swap_sym_in): Likewise.
    	* peXXigen.c (_bfd_XXi_swap_sym_in): Likewise.
    	* coffcode.h (_coff_bigobj_swap_sym_in): Make sure that internal
    	section number field is big enough to hold the external value.

Diff:
---
 bfd/ChangeLog           | 11 +++++++++++
 bfd/coff-rs6000.c       |  2 +-
 bfd/coff64-rs6000.c     |  2 +-
 bfd/coffcode.h          |  1 +
 bfd/coffswap.h          |  2 +-
 bfd/peXXigen.c          |  4 ++--
 include/ChangeLog       | 11 +++++++++++
 include/coff/internal.h | 12 ++++++------
 8 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 4d4ccbc..8b06e74 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,14 @@
+2016-01-18  Nick Clifton  <nickc@redhat.com>
+
+	PR ld/19440
+	* coff-rs6000.c (_bfd_xcoff_swap_sym_in): Sign extend external
+	section number into internal section number.
+	* coff64-rs6000.c (_bfd_xcoff64_swap_sym_in): Likewise.
+	* coffswap.h (coff_swap_sym_in): Likewise.
+	* peXXigen.c (_bfd_XXi_swap_sym_in): Likewise.
+	* coffcode.h (_coff_bigobj_swap_sym_in): Make sure that internal
+	section number field is big enough to hold the external value.
+
 2016-01-17  Alan Modra  <amodra@gmail.com>
 
 	* configure: Regenerate.
diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c
index ed21a05..e7a215b 100644
--- a/bfd/coff-rs6000.c
+++ b/bfd/coff-rs6000.c
@@ -420,7 +420,7 @@ _bfd_xcoff_swap_sym_in (bfd *abfd, void * ext1, void * in1)
     }
 
   in->n_value = H_GET_32 (abfd, ext->e_value);
-  in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
+  in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum);
   in->n_type = H_GET_16 (abfd, ext->e_type);
   in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
   in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c
index 955ea57..a0bc160 100644
--- a/bfd/coff64-rs6000.c
+++ b/bfd/coff64-rs6000.c
@@ -322,7 +322,7 @@ _bfd_xcoff64_swap_sym_in (bfd *abfd, void *ext1, void *in1)
   in->_n._n_n._n_zeroes = 0;
   in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e_offset);
   in->n_value = H_GET_64 (abfd, ext->e_value);
-  in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
+  in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum);
   in->n_type = H_GET_16 (abfd, ext->e_type);
   in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
   in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index d7e8351..caceab6 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -5759,6 +5759,7 @@ coff_bigobj_swap_sym_in (bfd * abfd, void * ext1, void * in1)
     }
 
   in->n_value = H_GET_32 (abfd, ext->e_value);
+  BFD_ASSERT (sizeof (in->n_scnum) >= 4);
   in->n_scnum = H_GET_32 (abfd, ext->e_scnum);
   in->n_type = H_GET_16 (abfd, ext->e_type);
   in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
diff --git a/bfd/coffswap.h b/bfd/coffswap.h
index b9122c8..e6c8c3f 100644
--- a/bfd/coffswap.h
+++ b/bfd/coffswap.h
@@ -322,7 +322,7 @@ coff_swap_sym_in (bfd * abfd, void * ext1, void * in1)
     }
 
   in->n_value = H_GET_32 (abfd, ext->e_value);
-  in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
+  in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum);
   if (sizeof (ext->e_type) == 2)
     in->n_type = H_GET_16 (abfd, ext->e_type);
   else
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index 23fdc9f..b80f981 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -119,7 +119,7 @@ _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1)
     memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
 
   in->n_value = H_GET_32 (abfd, ext->e_value);
-  in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
+  in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum);
 
   if (sizeof (ext->e_type) == 2)
     in->n_type = H_GET_16 (abfd, ext->e_type);
@@ -257,7 +257,7 @@ _bfd_XXi_swap_sym_out (bfd * abfd, void * inp, void * extp)
 	 as the worst that can happen is that some absolute symbols are
 	 needlessly converted into section relative symbols.  */
       && in->n_value > ((1ULL << (sizeof (in->n_value) > 4 ? 32 : 31)) - 1)
-      && in->n_scnum == -1)
+      && in->n_scnum == N_ABS)
     {
       asection * sec;
 
diff --git a/include/ChangeLog b/include/ChangeLog
index 80fc4a8..cd1fae3 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,14 @@
+2016-01-18  Nick Clifton  <nickc@redhat.com>
+
+	PR ld/19440
+	* coff/internal.h (internal_syment): Use int to hold section
+	number.
+	(N_UNDEF): Cast to int not short.
+	(N_ABS): Likewise.
+	(N_DEBUG): Likewise.
+	(N_TV): Likewise.
+	(P_TV): Likewise.
+
 2016-01-11  Nick Clifton  <nickc@redhat.com>
 
 	Import this change from GCC mainline:
diff --git a/include/coff/internal.h b/include/coff/internal.h
index aa758ed..885ac16 100644
--- a/include/coff/internal.h
+++ b/include/coff/internal.h
@@ -483,7 +483,7 @@ struct internal_syment
     char *_n_nptr[2];		/* allows for overlaying	*/
   }     _n;
   bfd_vma n_value;		/* value of symbol		*/
-  short n_scnum;		/* section number		*/
+  int n_scnum;			/* section number		*/
   unsigned short n_flags;	/* copy of flags from filhdr	*/
   unsigned short n_type;	/* type and derived type	*/
   unsigned char n_sclass;	/* storage class		*/
@@ -497,11 +497,11 @@ struct internal_syment
 /* Relocatable symbols have number of the section in which they are defined,
    or one of the following:  */
 
-#define N_UNDEF	((short)0)	/* undefined symbol */
-#define N_ABS	((short)-1)	/* value of symbol is absolute */
-#define N_DEBUG	((short)-2)	/* debugging symbol -- value is meaningless */
-#define N_TV	((short)-3)	/* indicates symbol needs preload transfer vector */
-#define P_TV	((short)-4)	/* indicates symbol needs postload transfer vector*/
+#define N_UNDEF	((int)0)	/* undefined symbol */
+#define N_ABS	((int)-1)	/* value of symbol is absolute */
+#define N_DEBUG	((int)-2)	/* debugging symbol -- value is meaningless */
+#define N_TV	((int)-3)	/* indicates symbol needs preload transfer vector */
+#define P_TV	((int)-4)	/* indicates symbol needs postload transfer vector*/
 
 /* Type of a symbol, in low N bits of the word.  */


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