From a39f33461a71ec868be8917625b10bd66ab23eef Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 31 Oct 2006 02:36:18 +0000 Subject: [PATCH] * elf.c (elfcore_write_note): Pad note descriptor to 4-byte boundary. Tidy. Comment. --- bfd/ChangeLog | 5 ++++- bfd/elf.c | 47 +++++++++++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index cd3a99fdb4..788c9e20ab 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,4 +1,7 @@ -bfd/ +2006-10-31 Alan Modra + + * elf.c (elfcore_write_note): Pad note descriptor to 4-byte + boundary. Tidy. Comment. 2006-10-30 H.J. Lu diff --git a/bfd/elf.c b/bfd/elf.c index 2594e21576..9550ab1b34 100644 --- 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) -- 2.34.1