elfcore_write_note
Alan Modra
amodra@bigpond.net.au
Tue Oct 31 11:42:00 GMT 2006
On Mon, Oct 30, 2006 at 01:32:00PM +0100, Ulrich Weigand wrote:
> Alan Modra wrote:
>
> > This makes elfcore_write_note agree with elfcore_read_notes regarding
> > the alignment of note fields. We don't comply with the current draft
> > gabi, see http://sourceware.org/ml/binutils/2003-09/msg00300.html, and
> > the pad was wrong anyway.
> >
> > * elf.c (elfcore_write_note): Pad to 4-byte boundary.
>
> Thanks for fixing this! B.t.w. the 'bed' variable is now unused ...
>
> Should we also pad the note content to 4 byte, or should we rely on the
> caller to only call elfcore_write_note with a multiple of 4 as size?
I guess the price for safety is fairly small here.
* elf.c (elfcore_write_note): Pad note descriptor to 4-byte
boundary. Tidy. Comment.
Index: bfd/elf.c
===================================================================
RCS file: /cvs/src/src/bfd/elf.c,v
retrieving revision 1.364
diff -u -p -r1.364 elf.c
--- bfd/elf.c 30 Oct 2006 23:25:49 -0000 1.364
+++ bfd/elf.c 31 Oct 2006 01:31:52 -0000
@@ -8088,45 +8088,42 @@ elfcore_grok_nto_note (bfd *abfd, Elf_In
/* 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)
--
Alan Modra
IBM OzLabs - Linux Technology Centre
More information about the Binutils
mailing list