Index: libutil++/bfd_support.cpp
===================================================================
RCS file: /cvsroot/oprofile/oprofile/libutil++/bfd_support.cpp,v
retrieving revision 1.9
diff -u -r1.9 bfd_support.cpp
--- libutil++/bfd_support.cpp	29 Apr 2008 12:07:46 -0000	1.9
+++ libutil++/bfd_support.cpp	2 Jul 2008 20:55:09 -0000
@@ -12,8 +12,11 @@
 
 #include "op_bfd.h"
 #include "op_fileio.h"
+#include "op_config.h"
 #include "string_manip.h"
+#include "file_manip.h"
 #include "cverb.h"
+#include "locate_images.h"
 
 #include <cstdlib>
 #include <cstring>
@@ -42,13 +45,22 @@
 }
 
 
-bool separate_debug_file_exists(string const & name, unsigned long const crc)
+bool separate_debug_file_exists(string & name, unsigned long const crc, 
+                                extra_images const & extra)
 {
 	unsigned long file_crc = 0;
 	// The size of 2 * 1024 elements for the buffer is arbitrary.
 	char buffer[2 * 1024];
-	
-	ifstream file(name.c_str());
+
+	image_error img_ok;
+	string const image_path = extra.find_image_path(name, img_ok, true);
+
+	if (img_ok != image_ok)
+		return false;
+
+	name = image_path;
+
+	ifstream file(image_path.c_str());
 	if (!file)
 		return false;
 
@@ -281,40 +293,35 @@
 }
 
 
-bool find_separate_debug_file(bfd * ibfd, string const & dir_in,
-                              string const & global_in, string & filename)
+bool find_separate_debug_file(bfd * ibfd, string const & filepath_in, 
+                              string & debug_filename, extra_images const & extra)
 {
-	string dir(dir_in);
-	string global(global_in);
+	string filepath(filepath_in);
 	string basename;
 	unsigned long crc32;
 	
 	if (!get_debug_link_info(ibfd, basename, crc32))
 		return false;
-	
-	if (dir.size() > 0 && dir.at(dir.size() - 1) != '/')
-		dir += '/';
-	
-	if (global.size() > 0 && global.at(global.size() - 1) != '/')
-		global += '/';
+
+	// Work out the image file's directory prefix
+	string filedir = op_dirname(filepath);
+	// Make sure it starts with /
+	if (filedir.size() > 0 && filedir.at(filedir.size() - 1) != '/')
+		filedir += '/';
+
+	string first_try(filedir + ".debug/" + basename);
+	string second_try(DEBUGDIR + filedir + basename);
+	string third_try(filedir + basename);
 
 	cverb << vbfd << "looking for debugging file " << basename 
 	      << " with crc32 = " << hex << crc32 << endl;
-	
-	string first_try(dir + basename);
-	string second_try(dir + ".debug/" + basename);
-
-	if (dir.size() > 0 && dir[0] == '/')
-		dir = dir.substr(1);
 
-	string third_try(global + dir + basename);
-	
-	if (separate_debug_file_exists(first_try, crc32)) 
-		filename = first_try; 
-	else if (separate_debug_file_exists(second_try, crc32))
-		filename = second_try;
-	else if (separate_debug_file_exists(third_try, crc32))
-		filename = third_try;
+	if (separate_debug_file_exists(first_try, crc32, extra)) 
+		debug_filename = first_try; 
+	else if (separate_debug_file_exists(second_try, crc32, extra))
+		debug_filename = second_try;
+	else if (separate_debug_file_exists(third_try, crc32, extra))
+		debug_filename = third_try;
 	else
 		return false;
 	
Index: libutil++/bfd_support.h
===================================================================
RCS file: /cvsroot/oprofile/oprofile/libutil++/bfd_support.h,v
retrieving revision 1.5
diff -u -r1.5 bfd_support.h
--- libutil++/bfd_support.h	28 Apr 2008 21:23:25 -0000	1.5
+++ libutil++/bfd_support.h	2 Jul 2008 20:55:09 -0000
@@ -13,6 +13,7 @@
 
 #include "utility.h"
 #include "op_types.h"
+#include "locate_images.h"
 
 #include <bfd.h>
 #include <stdint.h>
@@ -84,9 +85,9 @@
  */
 extern bool
 find_separate_debug_file(bfd * ibfd, 
-                         std::string const & dir_in,
-                         std::string const & global_in,
-                         std::string & filename);
+                         std::string const & filepath_in,
+                         std::string & debug_filename,
+                         extra_images const & extra);
 
 /// open the given BFD
 bfd * open_bfd(std::string const & file);
Index: libutil++/op_bfd.cpp
===================================================================
RCS file: /cvsroot/oprofile/oprofile/libutil++/op_bfd.cpp,v
retrieving revision 1.83
diff -u -r1.83 op_bfd.cpp
--- libutil++/op_bfd.cpp	19 May 2008 23:15:04 -0000	1.83
+++ libutil++/op_bfd.cpp	2 Jul 2008 20:55:09 -0000
@@ -97,6 +97,7 @@
 	:
 	filename(fname),
 	archive_path(extra_images.get_archive_path()),
+	extra_found_images(extra_images),
 	file_size(-1),
 	anon_obj(false)
 {
@@ -341,11 +342,8 @@
 		return debug_info.reset(true);
 
 	// check to see if there is an .debug file
-	string const global(archive_path + DEBUGDIR);
-	string const image_path = archive_path + filename;
-	string const dirname(image_path.substr(0, image_path.rfind('/')));
 
-	if (find_separate_debug_file(ibfd.abfd, dirname, global, debug_filename)) {
+	if (find_separate_debug_file(ibfd.abfd, filename, debug_filename, extra_found_images)) {
 		cverb << vbfd << "now loading: " << debug_filename << endl;
 		dbfd.abfd = open_bfd(debug_filename);
 		if (dbfd.has_debug_info())
Index: libutil++/op_bfd.h
===================================================================
RCS file: /cvsroot/oprofile/oprofile/libutil++/op_bfd.h,v
retrieving revision 1.51
diff -u -r1.51 op_bfd.h
--- libutil++/op_bfd.h	19 May 2008 23:15:04 -0000	1.51
+++ libutil++/op_bfd.h	2 Jul 2008 20:55:09 -0000
@@ -21,6 +21,7 @@
 #include <set>
 
 #include "bfd_support.h"
+#include "locate_images.h"
 #include "utility.h"
 #include "cached_value.h"
 #include "op_types.h"
@@ -261,6 +262,9 @@
 	/// path to archive
 	std::string archive_path;
 
+	/// reference to extra_images
+	extra_images const & extra_found_images;
+
 	/// file size in bytes
 	off_t file_size;
 
Index: libutil++/op_spu_bfd.cpp
===================================================================
RCS file: /cvsroot/oprofile/oprofile/libutil++/op_spu_bfd.cpp,v
retrieving revision 1.6
diff -u -r1.6 op_spu_bfd.cpp
--- libutil++/op_spu_bfd.cpp	29 Apr 2008 12:07:46 -0000	1.6
+++ libutil++/op_spu_bfd.cpp	2 Jul 2008 20:55:09 -0000
@@ -43,6 +43,7 @@
 	       extra_images const & extra_images, bool & ok)
 	:
 	archive_path(extra_images.get_archive_path()),
+	extra_found_images(extra_images),
 	file_size(-1),
 	embedding_filename(fname)
 {
Index: pp/oparchive.cpp
===================================================================
RCS file: /cvsroot/oprofile/oprofile/pp/oparchive.cpp,v
retrieving revision 1.17
diff -u -r1.17 oparchive.cpp
--- pp/oparchive.cpp	29 Apr 2008 12:07:46 -0000	1.17
+++ pp/oparchive.cpp	2 Jul 2008 20:55:09 -0000
@@ -116,11 +116,10 @@
 		 */
 		bfd * ibfd = open_bfd(real_exe_name);
 		if (ibfd) {
-			string global(archive_path + DEBUGDIR);
 			string dirname = op_dirname(real_exe_name);
 			string debug_filename;
-			if (find_separate_debug_file(ibfd, dirname, global,
-				debug_filename)) {
+			if (find_separate_debug_file(ibfd, real_exe_name,
+				debug_filename, classes.extra_found_images)) {
 				/* found something copy it over */
 				string dest_debug_dir = options::outdirectory +
 					dirname + "/.debug/";
