From e21e5835b606f4ef1eb42e99bf26a3e43cdf034a Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 15 Apr 2011 11:14:01 +0000 Subject: [PATCH] * elf-bfd.h (struct sdt_note): New struct. (struct elf_obj_tdata) : New field. * elf.c (elfobj_grok_stapsdt_note_1): New function. (elfobj_grok_stapsdt_note): Likewise. (elf_parse_notes): Added code to treat SystemTap note sections. * common.h (NT_STAPSDT): New define. --- bfd/ChangeLog | 9 +++++++++ bfd/elf-bfd.h | 14 ++++++++++++++ bfd/elf.c | 35 +++++++++++++++++++++++++++++++++++ include/elf/ChangeLog | 4 ++++ include/elf/common.h | 4 +++- 5 files changed, 65 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ce76b34e81..8fa9ce10a9 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2011-04-15 Sergio Durigan Junior + + * elf-bfd.h (struct sdt_note): New struct. + (struct elf_obj_tdata) : New field. + * elf.c (elfobj_grok_stapsdt_note_1): New function. + (elfobj_grok_stapsdt_note): Likewise. + (elf_parse_notes): Added code to treat SystemTap note + sections. + 2011-04-12 Richard Henderson * elf64-alpha.c (elf64_alpha_size_dynamic_sections): Do not diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 844610d9f3..39c7de6cb7 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1476,6 +1476,15 @@ enum Tag_compatibility = 32 }; +/* The following struct stores information about every SystemTap section + found in the object file. */ +struct sdt_note +{ + struct sdt_note *next; + bfd_size_type size; + bfd_byte data[1]; +}; + /* Some private data is stashed away for future use using the tdata pointer in the bfd structure. */ @@ -1633,6 +1642,11 @@ struct elf_obj_tdata bfd_size_type build_id_size; bfd_byte *build_id; + /* Linked-list containing information about every Systemtap section + found in the object file. Each section corresponds to one entry + in the list. */ + struct sdt_note *sdt_note_head; + /* True if the bfd contains symbols that have the STT_GNU_IFUNC symbol type or STB_GNU_UNIQUE binding. Used to set the osabi field in the ELF header structure. */ diff --git a/bfd/elf.c b/bfd/elf.c index 0bb0c5a6a9..71de8446ac 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -8416,6 +8416,35 @@ elfobj_grok_gnu_note (bfd *abfd, Elf_Internal_Note *note) } } +static bfd_boolean +elfobj_grok_stapsdt_note_1 (bfd *abfd, Elf_Internal_Note *note) +{ + struct sdt_note *cur = + (struct sdt_note *) bfd_alloc (abfd, sizeof (struct sdt_note) + + note->descsz); + + cur->next = (struct sdt_note *) (elf_tdata (abfd))->sdt_note_head; + cur->size = (bfd_size_type) note->descsz; + memcpy (cur->data, note->descdata, note->descsz); + + elf_tdata (abfd)->sdt_note_head = cur; + + return TRUE; +} + +static bfd_boolean +elfobj_grok_stapsdt_note (bfd *abfd, Elf_Internal_Note *note) +{ + switch (note->type) + { + case NT_STAPSDT: + return elfobj_grok_stapsdt_note_1 (abfd, note); + + default: + return TRUE; + } +} + static bfd_boolean elfcore_netbsd_get_lwpid (Elf_Internal_Note *note, int *lwpidp) { @@ -9189,6 +9218,12 @@ elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset) if (! elfobj_grok_gnu_note (abfd, &in)) return FALSE; } + else if (in.namesz == sizeof "stapsdt" + && strcmp (in.namedata, "stapsdt") == 0) + { + if (! elfobj_grok_stapsdt_note (abfd, &in)) + return FALSE; + } break; } diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index 752730eca2..a43b34d91b 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,7 @@ +2011-04-15 Sergio Durigan Junior + + * common.h (NT_STAPSDT): New define. + 2011-03-31 Bernd Schmidt * tic6x.h (R_C6000_JUMP_SPLOT, R_C6000_EHTYPE, diff --git a/include/elf/common.h b/include/elf/common.h index 52ce9a5111..d48c32c878 100644 --- a/include/elf/common.h +++ b/include/elf/common.h @@ -1,6 +1,6 @@ /* ELF support for BFD. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. Written by Fred Fish @ Cygnus Support, from information published @@ -548,6 +548,8 @@ #define NT_LWPSINFO 17 /* Has a struct lwpsinfo_t */ #define NT_WIN32PSTATUS 18 /* Has a struct win32_pstatus */ +/* Note segment for SystemTap probes. */ +#define NT_STAPSDT 3 /* Note segments for core files on NetBSD systems. Note name must start with "NetBSD-CORE". */