From b7b61ced2a4d4e3222640ad20e6655cb4379c012 Mon Sep 17 00:00:00 2001 From: Antoine Busque Date: Tue, 19 Apr 2016 19:57:57 -0400 Subject: [PATCH] Add --debug-info-target-prefix MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Antoine Busque Signed-off-by: Jérémie Galarneau --- converter/babeltrace.c | 12 ++++++++++++ formats/ctf/ctf.c | 1 + include/babeltrace/babeltrace-internal.h | 1 + lib/so-info.c | 8 +++++++- tests/lib/test_so_info.c | 1 + 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/converter/babeltrace.c b/converter/babeltrace.c index f16e06c4..ff8a6c54 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -107,6 +107,7 @@ enum { OPT_STREAM_INTERSECTION, OPT_DEBUG_INFO_DIR, OPT_DEBUG_INFO_FULL_PATH, + OPT_DEBUG_INFO_TARGET_PREFIX, }; /* @@ -140,6 +141,7 @@ static struct poptOption long_options[] = { #ifdef ENABLE_DEBUGINFO { "debug-info-dir", 0, POPT_ARG_STRING, NULL, OPT_DEBUG_INFO_DIR, NULL, NULL }, { "debug-info-full-path", 0, POPT_ARG_NONE, NULL, OPT_DEBUG_INFO_FULL_PATH, NULL, NULL }, + { "debug-info-target-prefix", 0, POPT_ARG_STRING, NULL, OPT_DEBUG_INFO_TARGET_PREFIX, NULL, NULL }, #endif { NULL, 0, 0, NULL, 0, NULL, NULL }, }; @@ -191,6 +193,8 @@ static void usage(FILE *fp) fprintf(fp, " --debug-info-dir Directory in which to look for debugging information\n"); fprintf(fp, " files. (default: /usr/lib/debug/)\n"); fprintf(fp, " --debug-info-full-path Show full debug info source and binary paths (if available)\n"); + fprintf(fp, " --debug-info-target-prefix Directory to use as a prefix for executable lookup\n"); + fprintf(fp, " during debug info analysis.\n"); #endif list_formats(fp); fprintf(fp, "\n"); @@ -424,6 +428,13 @@ static int parse_options(int argc, char **argv) case OPT_DEBUG_INFO_FULL_PATH: opt_debug_info_full_path = 1; break; + case OPT_DEBUG_INFO_TARGET_PREFIX: + opt_debug_info_target_prefix = (char *) poptGetOptArg(pc); + if (!opt_debug_info_target_prefix) { + ret = -EINVAL; + goto end; + } + break; default: ret = -EINVAL; goto end; @@ -844,6 +855,7 @@ end: free(opt_output_format); free(opt_output_path); free(opt_debug_info_dir); + free(opt_debug_info_target_prefix); g_ptr_array_free(opt_input_paths, TRUE); if (partial_error) exit(EXIT_FAILURE); diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index 7235d806..e0f6cb89 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -86,6 +86,7 @@ uint64_t opt_clock_offset_ns; extern int yydebug; char *opt_debug_info_dir; +char *opt_debug_info_target_prefix; /* * TODO: babeltrace_ctf_console_output ensures that we only print diff --git a/include/babeltrace/babeltrace-internal.h b/include/babeltrace/babeltrace-internal.h index 71c236a4..f11672b1 100644 --- a/include/babeltrace/babeltrace-internal.h +++ b/include/babeltrace/babeltrace-internal.h @@ -198,5 +198,6 @@ extern uint64_t opt_clock_offset; extern uint64_t opt_clock_offset_ns; extern int babeltrace_ctf_console_output; extern char *opt_debug_info_dir; +extern char *opt_debug_info_target_prefix; #endif diff --git a/lib/so-info.c b/lib/so-info.c index 6998fbfb..93d7167f 100644 --- a/lib/so-info.c +++ b/lib/so-info.c @@ -78,7 +78,13 @@ struct so_info *so_info_create(const char *path, uint64_t low_addr, goto error; } - so->elf_path = strdup(path); + if (opt_debug_info_target_prefix) { + so->elf_path = g_build_path("/", opt_debug_info_target_prefix, + path, NULL); + } else { + so->elf_path = strdup(path); + } + if (!so->elf_path) { goto error; } diff --git a/tests/lib/test_so_info.c b/tests/lib/test_so_info.c index 58d02180..ced06be9 100644 --- a/tests/lib/test_so_info.c +++ b/tests/lib/test_so_info.c @@ -46,6 +46,7 @@ #define BUILD_ID_LEN 20 char *opt_debug_info_dir; +char *opt_debug_info_target_prefix; static void test_so_info_build_id(const char *data_dir) -- 2.34.1