Index: oprofile-0.9.3/libutil++/op_bfd.h
===================================================================
--- oprofile-0.9.3.orig/libutil++/op_bfd.h
+++ oprofile-0.9.3/libutil++/op_bfd.h
@@ -43,6 +43,7 @@ public:
 
 	/// ctor for artificial symbols
 	op_bfd_symbol(bfd_vma vma, size_t size, std::string const & name);
+	op_bfd_symbol(bfd_vma vma, unsigned long fp, size_t size, std::string const & name);
 
 	bfd_vma vma() const { return symb_value + section_vma; }
 	unsigned long value() const { return symb_value; }
Index: oprofile-0.9.3/libutil++/op_bfd.cpp
===================================================================
--- oprofile-0.9.3.orig/libutil++/op_bfd.cpp
+++ oprofile-0.9.3/libutil++/op_bfd.cpp
@@ -81,6 +81,14 @@ op_bfd_symbol::op_bfd_symbol(bfd_vma vma
 }
 
 
+op_bfd_symbol::op_bfd_symbol(bfd_vma vma, unsigned long fp, size_t size, string const & name)
+	: bfd_symbol(0), symb_value(0),
+	  section_filepos(fp), section_vma(vma),
+	  symb_size(size), symb_name(name)
+{
+}
+
+
 bool op_bfd_symbol::operator<(op_bfd_symbol const & rhs) const
 {
 	return filepos() < rhs.filepos();
@@ -298,6 +306,7 @@ get_symbol_contents(symbol_index_t sym_i
 	op_bfd_symbol const & bfd_sym = syms[sym_index];
 	size_t size = bfd_sym.size();
 	string const name = bfd_sym.name();
+	if (name[0] == '*') return true;
 	if (name.size() == 0 || name[0] == '?' || !ibfd.valid())
 		return false;
 
Index: oprofile-0.9.3/libutil++/op_spu_bfd.cpp
===================================================================
--- oprofile-0.9.3.orig/libutil++/op_spu_bfd.cpp
+++ oprofile-0.9.3/libutil++/op_spu_bfd.cpp
@@ -16,6 +16,7 @@
 #include <iostream>
 
 #include "op_bfd.h"
+#include "op_spu_bfd.h"
 #include "op_libiberty.h"
 #include "string_filter.h"
 #include "cverb.h"
@@ -155,6 +156,11 @@ find_sec_code:
 
 	get_symbols(symbols);
 
+	/* In some cases the SPU library code generates code stubs on the stack. */
+	/* The kernel module remaps those addresses so add an entry to catch/report them. */
+	symbols.push_back(op_bfd_symbol(OP_SPU_DYN_FLAG, OP_SPU_DYN_FLAG,
+					OP_SPU_MEMSIZE, "*__send_to_ppe(stack)"));
+
 out:
 	add_symbols(symbols, symbol_filter);
 	return;
Index: oprofile-0.9.3/libutil++/op_spu_bfd.h
===================================================================
--- /dev/null
+++ oprofile-0.9.3/libutil++/op_spu_bfd.h
@@ -0,0 +1,18 @@
+/**
+ * @file op_spu_bfd.h
+ *
+ * @remark Copyright 2007 OProfile authors
+ * @remark Read the file COPYING
+ *
+ * @author Bob Nelson
+ * (C) Copyright IBM Corporation 2007
+ */
+
+#ifndef OP_SPU_BFD_H
+#define OP_SPU_BFD_H
+
+#define	OP_SPU_DYN_FLAG		0x10000000	/* kernel module adds this offset */
+						/* to SPU code it can't find in the map */
+#define OP_SPU_MEMSIZE		0x3ffff		/* Physical memory size on an SPU */
+
+#endif /* !OP_SPU_BFD_H */
Index: oprofile-0.9.3/libpp/xml_utils.cpp
===================================================================
--- oprofile-0.9.3.orig/libpp/xml_utils.cpp
+++ oprofile-0.9.3/libpp/xml_utils.cpp
@@ -394,6 +394,7 @@ xml_utils::output_symbol_bytes(ostream &
 	unsigned char contents[size];
 	if (abfd->get_symbol_contents(symb->sym_index, contents)) {
 		string const name = symbol_names.name(symb->name);
+		if (name[0] == '*') size = 0;
 		out << open_element(BYTES, true) << init_attr(TABLE_ID, sym_id);
 		out << close_element(NONE, true);
 		for (size_t i = 0; i < size; ++i) {

