Package: oprofile-common Version: 0.9.2-3 Severity: normal Tags: patch upstream
--- Please enter the report below this line. --- opreport and oparchive use the function find_separate_debug_file() to search for a separate debug file. Given the paths dir_in (directory name of the executable or SO), global_in (global debug directory, "/usr/lib/debug") it looks for debug information in these directories, in order: 1. $dir_in 2. $dir_in/.debug 3. $global_in/$dir_in Now when the executable is in an archive, dir_in must include the archive path in order for (1) and (2) to be correct, but that means (3) will be wrong. I fixed this by adding a separate parameter for the archive path and makes the search list: 1. $archive_in/$dir_in 2. $archive_in/$dir_in/.debug 3. $archive_in/$global_in/$dir_in Attaching a patch for this. In oparchive, this also removes the _source_ archive path (options::archive_path) from the destination for copying the separate debug file. I think this is correct and the inclusion of the source archive path was another bug. Ben. --- System information. --- Architecture: i386 Kernel: Linux 2.6.18-4-686 Debian Release: 4.0 500 testing shadbolt 500 testing mirror 100 unstable mirror --- Package information. --- Depends (Version) | Installed ==============================-+-=========== oprofile-common | 0.9.3~cvs20070106-4.1
only in patch2: unchanged: --- oprofile-0.9.2.orig/libutil++/op_bfd.cpp +++ oprofile-0.9.2/libutil++/op_bfd.cpp @@ -305,11 +305,11 @@ 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, + archive_path, + filename.substr(0, filename.rfind('/')), + DEBUGDIR, + debug_filename)) { cverb << vbfd << "now loading: " << debug_filename << endl; dbfd.abfd = open_bfd(debug_filename); if (dbfd.has_debug_info()) only in patch2: unchanged: --- oprofile-0.9.2.orig/libutil++/bfd_support.h +++ oprofile-0.9.2/libutil++/bfd_support.h @@ -65,14 +65,15 @@ /* * find_separate_debug_file - return true if a valid separate debug file found * @param ibfd binary file + * @param archive_in archive directory * @param dir_in directory holding the binary file - * @param global_in + * @param global_in global directory for separate debug files * @param filename path to valid debug file * * Search order for debug file and use first one found: - * 1) dir_in directory - * 2) dir_in/.debug directory - * 3) global_in/dir_in directory + * 1) archive_in/dir_in directory + * 2) archive_in/dir_in/.debug directory + * 3) archive_in/global_in/dir_in directory * * Newer binutils and Linux distributions (e.g. Fedora) allow the * creation of debug files that are separate from the binary. The @@ -83,6 +84,7 @@ */ extern bool find_separate_debug_file(bfd * ibfd, + std::string const & archive_in, std::string const & dir_in, std::string const & global_in, std::string & filename); only in patch2: unchanged: --- oprofile-0.9.2.orig/libutil++/bfd_support.cpp +++ oprofile-0.9.2/libutil++/bfd_support.cpp @@ -273,9 +273,13 @@ } -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 & archive_in, + string const & dir_in, + string const & global_in, + string & filename) { + string archive(archive_in); string dir(dir_in); string global(global_in); string basename; @@ -284,6 +288,9 @@ if (!get_debug_link_info(ibfd, basename, crc32)) return false; + if (archive.size() > 0 && archive.at(archive.size() - 1) != '/') + archive += '/'; + if (dir.size() > 0 && dir.at(dir.size() - 1) != '/') dir += '/'; @@ -293,13 +300,13 @@ cverb << vbfd << "looking for debugging file " << basename << " with crc32 = " << hex << crc32 << endl; - string first_try(dir + basename); - string second_try(dir + ".debug/" + basename); + string first_try(archive + dir + basename); + string second_try(archive + dir + ".debug/" + basename); if (dir.size() > 0 && dir[0] == '/') dir = dir.substr(1); - string third_try(global + dir + basename); + string third_try(archive + global + dir + basename); if (separate_debug_file_exists(first_try, crc32)) filename = first_try; only in patch2: unchanged: --- oprofile-0.9.2.orig/pp/oparchive.cpp +++ oprofile-0.9.2/pp/oparchive.cpp @@ -90,12 +90,13 @@ */ bfd * ibfd = open_bfd(exe_name); if (ibfd) { - string global(options::archive_path + DEBUGDIR); - string dirname = op_dirname(options::archive_path + - exe_name); + string dirname = op_dirname(exe_name); string debug_filename; - if (find_separate_debug_file(ibfd, dirname, global, - debug_filename)) { + if (find_separate_debug_file(ibfd, + options::archive_path, + dirname, + DEBUGDIR, + debug_filename)) { /* found something copy it over */ string dest_debug = options::outdirectory + dirname + "/" +
signature.asc
Description: This is a digitally signed message part