* elf.c (elfcore_write_note): Pad note descriptor to 4-byte
authorAlan Modra <amodra@gmail.com>
Tue, 31 Oct 2006 02:36:18 +0000 (02:36 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 31 Oct 2006 02:36:18 +0000 (02:36 +0000)
boundary.  Tidy.  Comment.

bfd/ChangeLog
bfd/elf.c

index cd3a99fdb4db347488c96d6a9e9ec40420118d69..788c9e20ab5279860b177e9b5ea322584e9247c7 100644 (file)
@@ -1,4 +1,7 @@
-bfd/
+2006-10-31  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf.c (elfcore_write_note): Pad note descriptor to 4-byte
+       boundary.  Tidy.  Comment.
 
 2006-10-30  H.J. Lu  <hongjiu.lu@intel.com>
 
index 2594e21576b47cf0aa9101747ec6fa4da0831443..9550ab1b348f329f1e48d35be04195b1d9b1e0d8 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -8088,45 +8088,42 @@ elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
 /* Function: elfcore_write_note
 
    Inputs:
-     buffer to hold note
+     buffer to hold note, and current size of buffer
      name of note
      type of note
      data for note
      size of data for note
 
+   Writes note to end of buffer.  ELF64 notes are written exactly as
+   for ELF32, despite the current (as of 2006) ELF gabi specifying
+   that they ought to have 8-byte namesz and descsz field, and have
+   8-byte alignment.  Other writers, eg. Linux kernel, do the same.
+
    Return:
-   End of buffer containing note.  */
+   Pointer to realloc'd buffer, *BUFSIZ updated.  */
 
 char *
-elfcore_write_note (bfd  *abfd,
+elfcore_write_note (bfd *abfd,
                    char *buf,
-                   int  *bufsiz,
+                   int *bufsiz,
                    const char *name,
-                   int  type,
+                   int type,
                    const void *input,
-                   int  size)
+                   int size)
 {
   Elf_External_Note *xnp;
   size_t namesz;
-  size_t pad;
   size_t newspace;
-  char *p, *dest;
+  char *dest;
 
   namesz = 0;
-  pad = 0;
   if (name != NULL)
-    {
-      const struct elf_backend_data *bed;
-
-      namesz = strlen (name) + 1;
-      bed = get_elf_backend_data (abfd);
-      pad = -namesz & 3;
-    }
+    namesz = strlen (name) + 1;
 
-  newspace = 12 + namesz + pad + size;
+  newspace = 12 + ((namesz + 3) & -4) + ((size + 3) & -4);
 
-  p = realloc (buf, *bufsiz + newspace);
-  dest = p + *bufsiz;
+  buf = realloc (buf, *bufsiz + newspace);
+  dest = buf + *bufsiz;
   *bufsiz += newspace;
   xnp = (Elf_External_Note *) dest;
   H_PUT_32 (abfd, namesz, xnp->namesz);
@@ -8137,14 +8134,20 @@ elfcore_write_note (bfd  *abfd,
     {
       memcpy (dest, name, namesz);
       dest += namesz;
-      while (pad != 0)
+      while (namesz & 3)
        {
          *dest++ = '\0';
-         --pad;
+         ++namesz;
        }
     }
   memcpy (dest, input, size);
-  return p;
+  dest += size;
+  while (size & 3)
+    {
+      *dest++ = '\0';
+      ++size;
+    }
+  return buf;
 }
 
 #if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)