[Patch, ARM/AArch64] Add new elf note types
Richard Earnshaw
rearnsha@arm.com
Wed Nov 21 17:20:00 GMT 2012
On 15/11/12 16:29, Yufeng Zhang wrote:
> Hi,
>
> This patch adds support for three ARM elf note types in bfd and readelf.
>
> Is it OK to commit it?
>
> Thanks,
> Yufeng
>
I think all this should be using AArch64 (or the appropriate
capitalization of it), not ARM.
R.
>
> include/elf/
>
> 2012-11-15 Yufeng Zhang <yufeng.zhang@arm.com>
>
> * common.h (NT_ARM_TLS, NT_ARM_HW_BREAK, NT_ARM_HW_WATCH): New
> macro
> definitions.
>
> bfd/
>
> 2012-11-15 Yufeng Zhang <yufeng.zhang@arm.com>
>
> * elf-bfd.h (elfcore_write_arm_tls): Add prototype.
> (elfcore_write_arm_hw_break): Likewise.
> (elfcore_write_arm_hw_watch): Likewise.
> * elf.c (elfcore_grok_arm_tls): New function.
> (elfcore_grok_arm_hw_break): Likewise.
> (elfcore_grok_arm_hw_watch): Likewise.
> (elfcore_grok_note): Call the new functions to handle the
> corresponding notes.
> (elfcore_write_arm_tls): New function.
> (elfcore_write_arm_hw_break): Likewise.
> (elfcore_write_arm_hw_watch): Likewise.
> (elfcore_write_register_note): Call the new functions to handle
> the
> corresponding pseudo sections.
>
> binutils/
>
> 2012-11-15 Yufeng Zhang <yufeng.zhang@arm.com>
>
> * readelf.c (get_note_type): Handle NT_ARM_TLS, NT_ARM_HW_BREAK
> and NT_ARM_HW_WATCH.
>
> aarch64-new-elf-note-types.patch
>
>
> diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
> index b8d82b1..9d42f44 100644
> --- a/bfd/elf-bfd.h
> +++ b/bfd/elf-bfd.h
> @@ -2269,6 +2269,12 @@ extern char *elfcore_write_s390_system_call
> (bfd *, char *, int *, const void *, int);
> extern char *elfcore_write_arm_vfp
> (bfd *, char *, int *, const void *, int);
> +extern char *elfcore_write_arm_tls
> + (bfd *, char *, int *, const void *, int);
> +extern char *elfcore_write_arm_hw_break
> + (bfd *, char *, int *, const void *, int);
> +extern char *elfcore_write_arm_hw_watch
> + (bfd *, char *, int *, const void *, int);
> extern char *elfcore_write_lwpstatus
> (bfd *, char *, int *, long, int, const void *);
> extern char *elfcore_write_register_note
> diff --git a/bfd/elf.c b/bfd/elf.c
> index cab1cc7..2bb243d 100644
> --- a/bfd/elf.c
> +++ b/bfd/elf.c
> @@ -8140,6 +8140,24 @@ elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
> return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
> }
>
> +static bfd_boolean
> +elfcore_grok_arm_tls (bfd *abfd, Elf_Internal_Note *note)
> +{
> + return elfcore_make_note_pseudosection (abfd, ".reg-arm-tls", note);
> +}
> +
> +static bfd_boolean
> +elfcore_grok_arm_hw_break (bfd *abfd, Elf_Internal_Note *note)
> +{
> + return elfcore_make_note_pseudosection (abfd, ".reg-arm-hw-break", note);
> +}
> +
> +static bfd_boolean
> +elfcore_grok_arm_hw_watch (bfd *abfd, Elf_Internal_Note *note)
> +{
> + return elfcore_make_note_pseudosection (abfd, ".reg-arm-hw-watch", note);
> +}
> +
> #if defined (HAVE_PRPSINFO_T)
> typedef prpsinfo_t elfcore_psinfo_t;
> #if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
> @@ -8580,6 +8598,27 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
> else
> return TRUE;
>
> + case NT_ARM_TLS:
> + if (note->namesz == 6
> + && strcmp (note->namedata, "LINUX") == 0)
> + return elfcore_grok_arm_tls (abfd, note);
> + else
> + return TRUE;
> +
> + case NT_ARM_HW_BREAK:
> + if (note->namesz == 6
> + && strcmp (note->namedata, "LINUX") == 0)
> + return elfcore_grok_arm_hw_break (abfd, note);
> + else
> + return TRUE;
> +
> + case NT_ARM_HW_WATCH:
> + if (note->namesz == 6
> + && strcmp (note->namedata, "LINUX") == 0)
> + return elfcore_grok_arm_hw_watch (abfd, note);
> + else
> + return TRUE;
> +
> case NT_PRPSINFO:
> case NT_PSINFO:
> if (bed->elf_backend_grok_psinfo)
> @@ -9376,6 +9415,42 @@ elfcore_write_arm_vfp (bfd *abfd,
> }
>
> char *
> +elfcore_write_arm_tls (bfd *abfd,
> + char *buf,
> + int *bufsiz,
> + const void *arm_tls,
> + int size)
> +{
> + char *note_name = "LINUX";
> + return elfcore_write_note (abfd, buf, bufsiz,
> + note_name, NT_ARM_TLS, arm_tls, size);
> +}
> +
> +char *
> +elfcore_write_arm_hw_break (bfd *abfd,
> + char *buf,
> + int *bufsiz,
> + const void *arm_hw_break,
> + int size)
> +{
> + char *note_name = "LINUX";
> + return elfcore_write_note (abfd, buf, bufsiz,
> + note_name, NT_ARM_HW_BREAK, arm_hw_break, size);
> +}
> +
> +char *
> +elfcore_write_arm_hw_watch (bfd *abfd,
> + char *buf,
> + int *bufsiz,
> + const void *arm_hw_watch,
> + int size)
> +{
> + char *note_name = "LINUX";
> + return elfcore_write_note (abfd, buf, bufsiz,
> + note_name, NT_ARM_HW_WATCH, arm_hw_watch, size);
> +}
> +
> +char *
> elfcore_write_register_note (bfd *abfd,
> char *buf,
> int *bufsiz,
> @@ -9411,6 +9486,12 @@ elfcore_write_register_note (bfd *abfd,
> return elfcore_write_s390_system_call (abfd, buf, bufsiz, data, size);
> if (strcmp (section, ".reg-arm-vfp") == 0)
> return elfcore_write_arm_vfp (abfd, buf, bufsiz, data, size);
> + if (strcmp (section, ".reg-arm-tls") == 0)
> + return elfcore_write_arm_tls (abfd, buf, bufsiz, data, size);
> + if (strcmp (section, ".reg-arm-hw-break") == 0)
> + return elfcore_write_arm_hw_break (abfd, buf, bufsiz, data, size);
> + if (strcmp (section, ".reg-arm-hw-watch") == 0)
> + return elfcore_write_arm_hw_watch (abfd, buf, bufsiz, data, size);
> return NULL;
> }
>
> diff --git a/binutils/readelf.c b/binutils/readelf.c
> index 2fbf2ae..1a52130 100644
> --- a/binutils/readelf.c
> +++ b/binutils/readelf.c
> @@ -12600,6 +12600,12 @@ get_note_type (unsigned e_type)
> return _("NT_S390_PREFIX (s390 prefix register)");
> case NT_ARM_VFP:
> return _("NT_ARM_VFP (arm VFP registers)");
> + case NT_ARM_TLS:
> + return _("NT_ARM_TLS (arm TLS registers)");
> + case NT_ARM_HW_BREAK:
> + return _("NT_ARM_HW_BREAK (arm hardware breakpoint registers)");
> + case NT_ARM_HW_WATCH:
> + return _("NT_ARM_HW_WATCH (arm hardware watchpoint registers)");
> case NT_PSTATUS:
> return _("NT_PSTATUS (pstatus structure)");
> case NT_FPREGS:
> diff --git a/include/elf/common.h b/include/elf/common.h
> index 1c681d5..7814733 100644
> --- a/include/elf/common.h
> +++ b/include/elf/common.h
> @@ -549,6 +549,12 @@
> /* note name must be "LINUX". */
> #define NT_ARM_VFP 0x400 /* ARM VFP registers */
> /* note name must be "LINUX". */
> +#define NT_ARM_TLS 0x401 /* ARM TLS registers */
> + /* note name must be "LINUX". */
> +#define NT_ARM_HW_BREAK 0x402 /* ARM hardware breakpoint registers */
> + /* note name must be "LINUX". */
> +#define NT_ARM_HW_WATCH 0x403 /* ARM hardware watchpoint registers */
> + /* note name must be "LINUX". */
>
> /* Note segments for core files on dir-style procfs systems. */
>
>
More information about the Binutils
mailing list