[PATCH 1/6] Make BFD read `.stapsdt' section from binary
Sergio Durigan Junior
sergiodj@redhat.com
Mon Apr 4 03:08:00 GMT 2011
Hi,
The following patch implements the necessary code to make BFD read the
`.stapsdt' note section from the binary file. It basically allocates a
linked-list where each entry contains information about one SystemTap
probe.
It was regtested on the compile farm.
Thanks,
Sergio.
>From 1f7a8198c27ab823f191b713dae3641d108f1212 Mon Sep 17 00:00:00 2001
From: Sergio Durigan Junior <sergiodj@redhat.com>
Date: Mon, 28 Mar 2011 20:32:20 -0300
Subject: [PATCH 1/6] patch 0: BFD patch
---
bfd/ChangeLog | 9 +++++++++
bfd/elf-bfd.h | 14 ++++++++++++++
bfd/elf.c | 37 +++++++++++++++++++++++++++++++++++++
3 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 1c34293..cfcffba 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2011-04-04 Sergio Durigan Junior <sergiodj@redhat.com>
+
+ * elf-bfd.h (struct sdt_note): New struct.
+ (struct elf_obj_tdata) <sdt_note_head>: 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-01 Tristan Gingold <gingold@adacore.com>
* elfxx-ia64.c: include bfd_stdint.h
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 21ec38f..d50823a 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. Used to set the osabi field in the ELF header
structure. */
diff --git a/bfd/elf.c b/bfd/elf.c
index f69abf2..3c038eb 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -8416,6 +8416,37 @@ elfobj_grok_gnu_note (bfd *abfd, Elf_Internal_Note *note)
}
}
+#define SDT_NOTE_TYPE 3
+
+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 SDT_NOTE_TYPE:
+ 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 +9220,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;
}
--
1.7.3.4
More information about the Gdb-patches
mailing list