perf symbols: Fix debuginfo search for Ubuntu
[linux-2.6-microblaze.git] / tools / perf / util / dso.c
index f338990..99f0a39 100644 (file)
@@ -47,6 +47,7 @@ char dso__symtab_origin(const struct dso *dso)
                [DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO]     = 'D',
                [DSO_BINARY_TYPE__FEDORA_DEBUGINFO]             = 'f',
                [DSO_BINARY_TYPE__UBUNTU_DEBUGINFO]             = 'u',
+               [DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO]     = 'x',
                [DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO]       = 'o',
                [DSO_BINARY_TYPE__BUILDID_DEBUGINFO]            = 'b',
                [DSO_BINARY_TYPE__SYSTEM_PATH_DSO]              = 'd',
@@ -129,6 +130,21 @@ int dso__read_binary_type_filename(const struct dso *dso,
                snprintf(filename + len, size - len, "%s", dso->long_name);
                break;
 
+       case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO:
+               /*
+                * Ubuntu can mixup /usr/lib with /lib, putting debuginfo in
+                * /usr/lib/debug/lib when it is expected to be in
+                * /usr/lib/debug/usr/lib
+                */
+               if (strlen(dso->long_name) < 9 ||
+                   strncmp(dso->long_name, "/usr/lib/", 9)) {
+                       ret = -1;
+                       break;
+               }
+               len = __symbol__join_symfs(filename, size, "/usr/lib/debug");
+               snprintf(filename + len, size - len, "%s", dso->long_name + 4);
+               break;
+
        case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO:
        {
                const char *last_slash;