PATCH: Fix read_leb128 in readelf for 64bit host

H. J. Lu hjl@lucon.org
Tue Dec 28 02:33:00 GMT 2004


On Sat, Dec 25, 2004 at 04:42:29PM -0800, H. J. Lu wrote:
> read_leb128 in readelf assumes long == int == 32bit. It doesn't work
> with 64bit host. Does this patch look right?
> 
> 

I am going to check in this patch. Gdb 6.3 has the same problem. I
am enclosing a patch here.


H.J.
----
2004-12-27  H.J. Lu  <hongjiu.lu@intel.com>

	* readelf.c (read_leb128): Support 64bit host.

--- binutils/readelf.c.leb	2004-12-10 14:20:22.000000000 -0800
+++ binutils/readelf.c	2004-12-27 10:49:33.689234088 -0800
@@ -6933,7 +6933,7 @@ read_leb128 (unsigned char *data, int *l
 {
   unsigned long int result = 0;
   unsigned int num_read = 0;
-  int shift = 0;
+  unsigned int shift = 0;
   unsigned char byte;
 
   do
@@ -6941,7 +6941,7 @@ read_leb128 (unsigned char *data, int *l
       byte = *data++;
       num_read++;
 
-      result |= (byte & 0x7f) << shift;
+      result |= ((unsigned long int) (byte & 0x7f)) << shift;
 
       shift += 7;
 
@@ -6951,8 +6951,8 @@ read_leb128 (unsigned char *data, int *l
   if (length_return != NULL)
     *length_return = num_read;
 
-  if (sign && (shift < 32) && (byte & 0x40))
-    result |= -1 << shift;
+  if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
+    result |= -1L << shift;
 
   return result;
 }

-------------- next part --------------
2004-12-27  H.J. Lu  <hongjiu.lu@intel.com>

	* dwarf2read.c (read_signed_leb128): Support 64bit host.

--- gdb/dwarf2read.c.leb	2004-12-21 14:24:06.000000000 -0800
+++ gdb/dwarf2read.c	2004-12-27 10:55:02.912450066 -0800
@@ -6098,7 +6098,7 @@ read_signed_leb128 (bfd *abfd, char *buf
 
   result = 0;
   shift = 0;
-  size = 32;
+  size = 8 * sizeof (result);
   num_read = 0;
   i = 0;
   while (1)
@@ -6115,7 +6115,7 @@ read_signed_leb128 (bfd *abfd, char *buf
     }
   if ((shift < size) && (byte & 0x40))
     {
-      result |= -(1 << shift);
+      result |= -(1L << shift);
     }
   *bytes_read_ptr = num_read;
   return result;


More information about the Gdb-patches mailing list