debugedit canon fix
authorAnas Nashif <anas.nashif@intel.com>
Thu, 11 Oct 2012 22:27:31 +0000 (15:27 -0700)
committerAnas Nashif <anas.nashif@intel.com>
Sun, 3 Feb 2013 00:44:15 +0000 (16:44 -0800)
tools/debugedit.c

index bb9336c..7f27b47 100644 (file)
@@ -162,7 +162,7 @@ strptr (DSO *dso, int sec, off_t offset)
        {
          if (data->d_buf
              && offset >= data->d_off
-             && offset < data->d_off + data->d_size)
+             && offset < data->d_off + (off_t)data->d_size)
            return (const char *) data->d_buf + (offset - data->d_off);
        }
     }
@@ -503,9 +503,10 @@ static int
 edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
 {
   unsigned char *ptr = debug_sections[DEBUG_LINE].data, *dir;
-  unsigned char **dirt;
+  char **dirt;
   unsigned char *endsec = ptr + debug_sections[DEBUG_LINE].size;
   unsigned char *endcu, *endprol;
+  char line_base;
   unsigned char opcode_base;
   uint32_t value, dirt_cnt;
   size_t comp_dir_len = strlen (comp_dir);
@@ -548,6 +549,7 @@ edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
       return 1;
     }
 
+  line_base = (char) (ptr[2 + (value >= 4)] & 0xff);
   opcode_base = ptr[4 + (value >= 4)];
   ptr = dir = ptr + 4 + (value >= 4) + opcode_base;
 
@@ -559,13 +561,13 @@ edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
       ++value;
     }
 
-  dirt = (unsigned char **) alloca (value * sizeof (unsigned char *));
+  dirt = (char **) alloca (value * sizeof (unsigned char *));
   dirt[0] = (unsigned char *) ".";
   dirt_cnt = 1;
   ptr = dir;
   while (*ptr != 0)
     {
-      dirt[dirt_cnt++] = ptr;
+      dirt[dirt_cnt++] = (char *)ptr;
       ptr = (unsigned char *) strchr ((char *)ptr, 0) + 1;
     }
   ptr++;
@@ -653,7 +655,7 @@ edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
 
   if (dest_dir)
     {
-      unsigned char *srcptr, *buf = NULL;
+      char *srcptr, *buf = NULL;
       size_t base_len = strlen (base_dir);
       size_t dest_len = strlen (dest_dir);
       size_t shrank = 0;
@@ -667,11 +669,14 @@ edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
          ptr = dir;
        }
       else
-       ptr = srcptr = dir;
+       {
+         ptr = dir;
+         srcptr = (char *)dir;
+       }
       while (*srcptr != 0)
        {
          size_t len = strlen ((char *)srcptr) + 1;
-         const unsigned char *readptr = srcptr;
+         const char *readptr = srcptr;
 
          char *orig = strdup ((const char *) srcptr);
 
@@ -698,10 +703,13 @@ edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
 
       if (shrank > 0)
        {
-         if (--shrank == 0)
+         --shrank;
+#if 0
+         if (shrank == 0)
            error (EXIT_FAILURE, 0,
                   "canonicalization unexpectedly shrank by one character");
          else
+#endif
            {
              memset (ptr, 'X', shrank);
              ptr += shrank;
@@ -737,21 +745,26 @@ edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
                }
              dirty_section (DEBUG_STR);
            }
-         else if (ptr != srcptr)
+         else if ((char *)ptr != srcptr)
            memmove (ptr, srcptr, len);
          srcptr += len;
          ptr += len;
-         dir = srcptr;
+         dir = (unsigned char *)srcptr;
          read_uleb128 (srcptr);
          read_uleb128 (srcptr);
          read_uleb128 (srcptr);
          if (ptr != dir)
-           memmove (ptr, dir, srcptr - dir);
-         ptr += srcptr - dir;
+           memmove (ptr, dir, (unsigned char *)srcptr - dir);
+         ptr += (unsigned char *)srcptr - dir;
        }
       *ptr = '\0';
       free (buf);
     }
+
+  ptr++;
+  /* fill the rest until the line number program starts with NOP opcode */
+  memset(ptr, opcode_base - line_base, endprol - ptr);
+  /* don't touch the line number program */
   return 0;
 }