* aclocal.m4: Regenerate.
[deliverable/binutils-gdb.git] / binutils / objdump.c
index f29ea714f578c1ae2a9c9b1d1749c0af2436f89d..1e9d97058ba6c8401ed124d5d10781e59717e8fd 100644 (file)
@@ -1142,8 +1142,8 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
 typedef struct
 {
   char *buffer;
-  size_t size;
-  char *current;
+  size_t pos;
+  size_t alloc;
 } SFILE;
 
 /* sprintf to a "stream".  */
@@ -1151,39 +1151,25 @@ typedef struct
 static int
 objdump_sprintf (SFILE *f, const char *format, ...)
 {
-  char *buf;
   size_t n;
   va_list args;
 
-  va_start (args, format);
-
-  vasprintf (&buf, format, args);
-
-  if (buf == NULL)
+  while (1)
     {
+      size_t space = f->alloc - f->pos;
+  
+      va_start (args, format);
+      n = vsnprintf (f->buffer + f->pos, space, format, args);
       va_end (args);
-      fatal (_("Out of virtual memory"));
-    }
-
-  n = strlen (buf);
 
-  while ((size_t) ((f->buffer + f->size) - f->current) < n + 1)
-    {
-      size_t curroff;
-
-      curroff = f->current - f->buffer;
-      f->size *= 2;
-      f->buffer = xrealloc (f->buffer, f->size);
-      f->current = f->buffer + curroff;
+      if (space > n)
+       break;
+      
+      f->alloc = (f->alloc + n) * 2;
+      f->buffer = xrealloc (f->buffer, f->alloc);
     }
-
-  memcpy (f->current, buf, n);
-  f->current += n;
-  f->current[0] = '\0';
-
-  free (buf);
-
-  va_end (args);
+  f->pos += n;
+  
   return n;
 }
 
@@ -1243,10 +1229,15 @@ disassemble_bytes (struct disassemble_info * info,
   int skip_addr_chars;
   bfd_vma addr_offset;
   int opb = info->octets_per_byte;
+  SFILE sfile;
 
   aux = (struct objdump_disasm_info *) info->application_data;
   section = aux->sec;
 
+  sfile.alloc = 120;
+  sfile.buffer = xmalloc (sfile.alloc);
+  sfile.pos = 0;
+  
   if (insns)
     octets_per_line = 4;
   else
@@ -1311,7 +1302,6 @@ disassemble_bytes (struct disassemble_info * info,
       else
        {
          char buf[50];
-         SFILE sfile;
          int bpc = 0;
          int pb = 0;
 
@@ -1344,9 +1334,7 @@ disassemble_bytes (struct disassemble_info * info,
 
          if (insns)
            {
-             sfile.size = 120;
-             sfile.buffer = xmalloc (sfile.size);
-             sfile.current = sfile.buffer;
+             sfile.pos = 0;
              info->fprintf_func = (fprintf_ftype) objdump_sprintf;
              info->stream = (FILE *) &sfile;
              info->bytes_per_line = 0;
@@ -1371,9 +1359,8 @@ disassemble_bytes (struct disassemble_info * info,
                octets_per_line = info->bytes_per_line;
              if (octets < 0)
                {
-                 if (sfile.current != sfile.buffer)
+                 if (sfile.pos)
                    printf ("%s\n", sfile.buffer);
-                 free (sfile.buffer);
                  break;
                }
            }
@@ -1447,11 +1434,8 @@ disassemble_bytes (struct disassemble_info * info,
 
          if (! insns)
            printf ("%s", buf);
-         else
-           {
-             printf ("%s", sfile.buffer);
-             free (sfile.buffer);
-           }
+         else if (sfile.pos)
+           printf ("%s", sfile.buffer);
 
          if (prefix_addresses
              ? show_raw_insn > 0
@@ -1515,7 +1499,8 @@ disassemble_bytes (struct disassemble_info * info,
              else
                printf ("\t\t\t");
 
-             objdump_print_value (section->vma + q->address, info, TRUE);
+             objdump_print_value (section->vma - rel_offset + q->address,
+                                  info, TRUE);
 
              printf (": %s\t", q->howto->name);
 
@@ -1557,6 +1542,8 @@ disassemble_bytes (struct disassemble_info * info,
 
       addr_offset += octets / opb;
     }
+
+  free (sfile.buffer);
 }
 
 static void
@@ -1600,7 +1587,7 @@ disassemble_section (bfd *abfd, asection *section, void *info)
       /* Dynamic reloc addresses are absolute, non-dynamic are section
         relative.  REL_OFFSET specifies the reloc address corresponding
         to the start of this section.  */
-      rel_offset = pinfo->buffer_vma;
+      rel_offset = section->vma;
     }
   else
     {
This page took 0.024531 seconds and 4 git commands to generate.