|
@@ -9,6 +9,13 @@
|
|
|
#include "debug.h"
|
|
|
#include "vdso.h"
|
|
|
|
|
|
+static const char * const debuglink_paths[] = {
|
|
|
+ "%.0s%s",
|
|
|
+ "%s/%s",
|
|
|
+ "%s/.debug/%s",
|
|
|
+ "/usr/lib/debug%s/%s"
|
|
|
+};
|
|
|
+
|
|
|
char dso__symtab_origin(const struct dso *dso)
|
|
|
{
|
|
|
static const char origin[] = {
|
|
@@ -44,24 +51,43 @@ int dso__read_binary_type_filename(const struct dso *dso,
|
|
|
size_t len;
|
|
|
|
|
|
switch (type) {
|
|
|
- case DSO_BINARY_TYPE__DEBUGLINK: {
|
|
|
- char *debuglink;
|
|
|
+ case DSO_BINARY_TYPE__DEBUGLINK:
|
|
|
+ {
|
|
|
+ const char *last_slash;
|
|
|
+ char dso_dir[PATH_MAX];
|
|
|
+ char symfile[PATH_MAX];
|
|
|
+ unsigned int i;
|
|
|
|
|
|
len = __symbol__join_symfs(filename, size, dso->long_name);
|
|
|
- debuglink = filename + len;
|
|
|
- while (debuglink != filename && *debuglink != '/')
|
|
|
- debuglink--;
|
|
|
- if (*debuglink == '/')
|
|
|
- debuglink++;
|
|
|
+ last_slash = filename + len;
|
|
|
+ while (last_slash != filename && *last_slash != '/')
|
|
|
+ last_slash--;
|
|
|
|
|
|
- ret = -1;
|
|
|
- if (!is_regular_file(filename))
|
|
|
+ strncpy(dso_dir, filename, last_slash - filename);
|
|
|
+ dso_dir[last_slash-filename] = '\0';
|
|
|
+
|
|
|
+ if (!is_regular_file(filename)) {
|
|
|
+ ret = -1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = filename__read_debuglink(filename, symfile, PATH_MAX);
|
|
|
+ if (ret)
|
|
|
break;
|
|
|
|
|
|
- ret = filename__read_debuglink(filename, debuglink,
|
|
|
- size - (debuglink - filename));
|
|
|
+ /* Check predefined locations where debug file might reside */
|
|
|
+ ret = -1;
|
|
|
+ for (i = 0; i < ARRAY_SIZE(debuglink_paths); i++) {
|
|
|
+ snprintf(filename, size,
|
|
|
+ debuglink_paths[i], dso_dir, symfile);
|
|
|
+ if (is_regular_file(filename)) {
|
|
|
+ ret = 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
break;
|
|
|
+ }
|
|
|
case DSO_BINARY_TYPE__BUILD_ID_CACHE:
|
|
|
if (dso__build_id_filename(dso, filename, size) == NULL)
|
|
|
ret = -1;
|