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

[committed] Fix printf_vma bugs vs. --enable-64-bit-bfd


    Hi all,

  As per the other day's discussion[*], there are some places in the dump code
that use the wrong function to print VMAs, resulting in the size depending on
the --enable-64-bit-bfd flag rather than the architecture of the BFD in question.

  The attached patch fixes this problem in coffgen.c and peXXigen.c, and has
been tested natively on i686-pc-cygwin and on i686-pc-linux-gnu x
{a29k-unknown-coff, alpha-freebsd, alpha-linuxecoff, alpha-unknown-linux,
alpha-unknown-linuxecoff, arm-epoc-pe, arm-unknown-coff, arm-unknown-linux,
arm-vxworks, arm-wince-pe, h8300-unknown-rtems, h8500-unknown-rtems,
hppa-unknown-linux, hppa64-unknown-linux, i370-unknown-linux, i386-coff,
i386-msdos, i386-pc-netbsdpe, i386-pc-pe, i586-linux, i586-pc-interix,
i586-pc-msdosdjgpp, i586-unknown-beospe, i586-unknown-coff, i686-pc-cygwin,
i686-pc-linux-gnu, i686-pc-mingw32, i960-intel-nindy, i960-unknown-coff,
ia64-unknown-linux, m68k-coff, m68k-unknown-coff, m68k-unknown-linux,
m68k-unknown-netbsd, m88k-unknown-coff, mcore-unknown-pe, mips-dec-bsd,
mips-unknown-ecoff, mips-unknown-linux, mips-unknown-pe, ns32k-unknown-netbsd,
or32-unknown-coff, powerpc-unknown-aix5, powerpc-unknown-linux,
powerpc64-unknown-linux, powerpcle-unknown-pe, ppc-eabi, s390-unknown-linux,
s390x-unknown-linux, sh-coff, sh-unknown-linux, sh-unknown-pe,
sh-unknown-rtems, sparc-unknown-coff, sparc-unknown-linux,
sparc64-unknown-linux, thumb-epoc-pe, tic30-unknown-coff, tic54x-unknown-coff,
tic80-unknown-coff, vax-unknown-netbsd, vax-unknown-vms, vms-vax,
w65-unknown-coff, x86_64-pc-freebsd, x86_64-pc-linux-gnu, x86_64-pc-mingw32,
x86_64-unknown-linux, z8k-coff, z8k-unknown-coff}, in all cases both with and
without --enable-64-bit-bfd, with no new fails and four new passes on 32-bit
targets using the enable option.  Applied.

bfd/ChangeLog:

	* coffgen.c (coff_print_symbol):  Use bfd_fprintf_vma, not
	fprintf_vma directly.
	* peXXigen.c (pe_print_edata):  Likewise.
	(pe_print_pdata):  Likewise.
	(_bfd_XX_print_ce_compressed_pdata):  Likewise.
	(_bfd_XX_print_private_bfd_data_common):  Likewise.

    cheers,
      DaveK
-- 
[*] - http://sourceware.org/ml/binutils/2009-05/msg00283.html and thread.


? ld/autom4te.cache
Index: bfd/coffgen.c
===================================================================
RCS file: /cvs/src/src/bfd/coffgen.c,v
retrieving revision 1.71
diff -p -u -r1.71 coffgen.c
--- bfd/coffgen.c	14 Apr 2009 09:47:43 -0000	1.71
+++ bfd/coffgen.c	19 May 2009 23:23:28 -0000
@@ -1959,16 +1959,7 @@ coff_print_symbol (bfd *abfd,
 		   combined->u.syment.n_type,
 		   combined->u.syment.n_sclass,
 		   combined->u.syment.n_numaux);
-#ifdef BFD64
-	  /* fprintf_vma() on a 64-bit enabled host will always print a 64-bit
-	     value, but really we want to display the address in the target's
-	     address size.  Since we do not have a field in the bfd structure
-	     to tell us this, we take a guess, based on the target's name.  */
-	  if (strstr (bfd_get_target (abfd), "64") == NULL)
-	    fprintf (file, "%08lx", (unsigned long) (val & 0xffffffff));
-	  else
-#endif
-	    fprintf_vma (file, val);
+	  bfd_fprintf_vma (abfd, file, val);
 	  fprintf (file, " %s", symbol->name);
 
 	  for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
@@ -2051,7 +2042,7 @@ coff_print_symbol (bfd *abfd,
 	      while (l->line_number)
 		{
 		  fprintf (file, "\n%4d : ", l->line_number);
-		  fprintf_vma (file, l->u.offset + symbol->section->vma);
+		  bfd_fprintf_vma (abfd, file, l->u.offset + symbol->section->vma);
 		  l++;
 		}
 	    }
Index: bfd/peXXigen.c
===================================================================
RCS file: /cvs/src/src/bfd/peXXigen.c,v
retrieving revision 1.56
diff -p -u -r1.56 peXXigen.c
--- bfd/peXXigen.c	27 Apr 2009 13:59:40 -0000	1.56
+++ bfd/peXXigen.c	19 May 2009 23:23:28 -0000
@@ -1469,7 +1469,7 @@ pe_print_edata (bfd * abfd, void * vfile
 
   fprintf (file,
 	   _("Name \t\t\t\t"));
-  fprintf_vma (file, edt.name);
+  bfd_fprintf_vma (abfd, file, edt.name);
   fprintf (file,
 	   " %s\n", data + edt.name - adj);
 
@@ -1491,17 +1491,17 @@ pe_print_edata (bfd * abfd, void * vfile
 
   fprintf (file,
 	   _("\tExport Address Table \t\t"));
-  fprintf_vma (file, edt.eat_addr);
+  bfd_fprintf_vma (abfd, file, edt.eat_addr);
   fprintf (file, "\n");
 
   fprintf (file,
 	   _("\tName Pointer Table \t\t"));
-  fprintf_vma (file, edt.npt_addr);
+  bfd_fprintf_vma (abfd, file, edt.npt_addr);
   fprintf (file, "\n");
 
   fprintf (file,
 	   _("\tOrdinal Table \t\t\t"));
-  fprintf_vma (file, edt.ot_addr);
+  bfd_fprintf_vma (abfd, file, edt.ot_addr);
   fprintf (file, "\n");
 
   /* The next table to find is the Export Address Table. It's basically
@@ -1666,14 +1666,14 @@ pe_print_pdata (bfd * abfd, void * vfile
       prolog_end_addr &= ~(bfd_vma) 0x3;
 
       fputc (' ', file);
-      fprintf_vma (file, i + section->vma); fputc ('\t', file);
-      fprintf_vma (file, begin_addr); fputc (' ', file);
-      fprintf_vma (file, end_addr); fputc (' ', file);
-      fprintf_vma (file, eh_handler);
+      bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
+      bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
+      bfd_fprintf_vma (abfd, file, end_addr); fputc (' ', file);
+      bfd_fprintf_vma (abfd, file, eh_handler);
 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
       fputc (' ', file);
-      fprintf_vma (file, eh_data); fputc (' ', file);
-      fprintf_vma (file, prolog_end_addr);
+      bfd_fprintf_vma (abfd, file, eh_data); fputc (' ', file);
+      bfd_fprintf_vma (abfd, file, prolog_end_addr);
       fprintf (file, "   %x", em_data);
 #endif
 
@@ -1838,10 +1838,10 @@ _bfd_XX_print_ce_compressed_pdata (bfd *
       exception_flag = (int)((other_data & 0x80000000) >> 31);
 
       fputc (' ', file);
-      fprintf_vma (file, i + section->vma); fputc ('\t', file);
-      fprintf_vma (file, begin_addr); fputc (' ', file);
-      fprintf_vma (file, prolog_length); fputc (' ', file);
-      fprintf_vma (file, function_length); fputc (' ', file);
+      bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
+      bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
+      bfd_fprintf_vma (abfd, file, prolog_length); fputc (' ', file);
+      bfd_fprintf_vma (abfd, file, function_length); fputc (' ', file);
       fprintf (file, "%2d  %2d   ", flag32bit, exception_flag);
 
       /* Get the exception handler's address and the data passed from the
@@ -2068,21 +2068,21 @@ _bfd_XX_print_private_bfd_data_common (b
   fprintf (file, "SizeOfUninitializedData\t%08lx\n",
 	   (unsigned long) i->SizeOfUninitializedData);
   fprintf (file, "AddressOfEntryPoint\t");
-  fprintf_vma (file, i->AddressOfEntryPoint);
+  bfd_fprintf_vma (abfd, file, i->AddressOfEntryPoint);
   fprintf (file, "\nBaseOfCode\t\t");
-  fprintf_vma (file, i->BaseOfCode);
+  bfd_fprintf_vma (abfd, file, i->BaseOfCode);
 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
   /* PE32+ does not have BaseOfData member!  */
   fprintf (file, "\nBaseOfData\t\t");
-  fprintf_vma (file, i->BaseOfData);
+  bfd_fprintf_vma (abfd, file, i->BaseOfData);
 #endif
 
   fprintf (file, "\nImageBase\t\t");
-  fprintf_vma (file, i->ImageBase);
+  bfd_fprintf_vma (abfd, file, i->ImageBase);
   fprintf (file, "\nSectionAlignment\t");
-  fprintf_vma (file, i->SectionAlignment);
+  bfd_fprintf_vma (abfd, file, i->SectionAlignment);
   fprintf (file, "\nFileAlignment\t\t");
-  fprintf_vma (file, i->FileAlignment);
+  bfd_fprintf_vma (abfd, file, i->FileAlignment);
   fprintf (file, "\nMajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
   fprintf (file, "MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
   fprintf (file, "MajorImageVersion\t%d\n", i->MajorImageVersion);
@@ -2141,13 +2141,13 @@ _bfd_XX_print_private_bfd_data_common (b
     fprintf (file, "\t(%s)", subsystem_name);
   fprintf (file, "\nDllCharacteristics\t%08x\n", i->DllCharacteristics);
   fprintf (file, "SizeOfStackReserve\t");
-  fprintf_vma (file, i->SizeOfStackReserve);
+  bfd_fprintf_vma (abfd, file, i->SizeOfStackReserve);
   fprintf (file, "\nSizeOfStackCommit\t");
-  fprintf_vma (file, i->SizeOfStackCommit);
+  bfd_fprintf_vma (abfd, file, i->SizeOfStackCommit);
   fprintf (file, "\nSizeOfHeapReserve\t");
-  fprintf_vma (file, i->SizeOfHeapReserve);
+  bfd_fprintf_vma (abfd, file, i->SizeOfHeapReserve);
   fprintf (file, "\nSizeOfHeapCommit\t");
-  fprintf_vma (file, i->SizeOfHeapCommit);
+  bfd_fprintf_vma (abfd, file, i->SizeOfHeapCommit);
   fprintf (file, "\nLoaderFlags\t\t%08lx\n", (unsigned long) i->LoaderFlags);
   fprintf (file, "NumberOfRvaAndSizes\t%08lx\n",
 	   (unsigned long) i->NumberOfRvaAndSizes);
@@ -2156,7 +2156,7 @@ _bfd_XX_print_private_bfd_data_common (b
   for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
     {
       fprintf (file, "Entry %1x ", j);
-      fprintf_vma (file, i->DataDirectory[j].VirtualAddress);
+      bfd_fprintf_vma (abfd, file, i->DataDirectory[j].VirtualAddress);
       fprintf (file, " %08lx ", (unsigned long) i->DataDirectory[j].Size);
       fprintf (file, "%s\n", dir_names[j]);
     }



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