From: Philippe Waroquiers Date: Sun, 21 Jun 2020 19:26:25 +0000 (+0200) Subject: Fixes PR 25475: ensure exec-file-mismatch "ask" always asks in case of mismatch. X-Git-Url: http://git.efficios.com/?p=deliverable%2Fbinutils-gdb.git;a=commitdiff_plain;h=a8654e7d784980cb4596f685964200fcc1164c78 Fixes PR 25475: ensure exec-file-mismatch "ask" always asks in case of mismatch. As explained in https://sourceware.org/bugzilla/show_bug.cgi?id=25475, when the currently loaded file has no debug symbol, symbol_file_add_with_addrs does not ask a confirmation to the user before loading the new symbol file. The behaviour is not consistent when symbol_file_add_with_addrs is called due to exec-file-mismatch "ask" setting. The PR discusses several solutions/approaches. The preferred approach (suggested by Joel) is to ensure that GDB always asks a confirmation when it loads a new symbol file due to exec-file-mismatch, using a new SYMFILE add-flag. I tested this manually. If OK, we can remove the bypass introduced by Tom in 6b9374f1, in order to always answer to the 'load' question. gdb/ChangeLog 2020-06-24 Philippe Waroquiers * symfile-add-flags.h: New flag SYMFILE_ALWAYS_CONFIRM. * exec.c (validate_exec_file): If from_tty, set both SYMFILE_VERBOSE (== from_tty) and SYMFILE_ALWAYS_CONFIRM. * symfile.c (symbol_file_add_with_addrs): if always_confirm and from_tty, unconditionally ask a confirmation. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 57bd32397d..12ef02bc99 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2020-06-24 Philippe Waroquiers + + * symfile-add-flags.h: New flag SYMFILE_ALWAYS_CONFIRM. + * exec.c (validate_exec_file): If from_tty, set both + SYMFILE_VERBOSE (== from_tty) and SYMFILE_ALWAYS_CONFIRM. + * symfile.c (symbol_file_add_with_addrs): if always_confirm + and from_tty, unconditionally ask a confirmation. + 2020-06-23 Andrew Burgess * target-descriptions.c (tdesc_architecture_name): Protect against diff --git a/gdb/exec.c b/gdb/exec.c index fa770c6f02..de473fbcb2 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -315,7 +315,10 @@ validate_exec_file (int from_tty) { symfile_add_flags add_flags = SYMFILE_MAINLINE; if (from_tty) - add_flags |= SYMFILE_VERBOSE; + { + add_flags |= SYMFILE_VERBOSE; + add_flags |= SYMFILE_ALWAYS_CONFIRM; + } try { symbol_file_add_main (exec_file_target.c_str (), add_flags); diff --git a/gdb/symfile-add-flags.h b/gdb/symfile-add-flags.h index 740357bc12..2b2c2e68f2 100644 --- a/gdb/symfile-add-flags.h +++ b/gdb/symfile-add-flags.h @@ -44,6 +44,12 @@ enum symfile_add_flag : unsigned /* The new objfile should be marked OBJF_NOT_FILENAME. */ SYMFILE_NOT_FILENAME = 1 << 5, + + /* If SYMFILE_VERBOSE (interpreted as from_tty) and SYMFILE_ALWAYS_CONFIRM, + always ask user to confirm loading the symbol file. + Without this flag, symbol_file_add_with_addrs asks a confirmation only + for a main symbol file replacing a file having symbols. */ + SYMFILE_ALWAYS_CONFIRM = 1 << 6, }; DEF_ENUM_FLAGS_TYPE (enum symfile_add_flag, symfile_add_flags); diff --git a/gdb/symfile.c b/gdb/symfile.c index b29f864b37..2c38ce4431 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -1051,6 +1051,7 @@ symbol_file_add_with_addrs (bfd *abfd, const char *name, struct objfile *objfile; const int from_tty = add_flags & SYMFILE_VERBOSE; const int mainline = add_flags & SYMFILE_MAINLINE; + const int always_confirm = add_flags & SYMFILE_ALWAYS_CONFIRM; const int should_print = (print_symbol_loading_p (from_tty, mainline, 1) && (readnow_symbol_files || (add_flags & SYMFILE_NO_READ) == 0)); @@ -1069,12 +1070,13 @@ symbol_file_add_with_addrs (bfd *abfd, const char *name, if ((add_flags & SYMFILE_NOT_FILENAME) != 0) flags |= OBJF_NOT_FILENAME; - /* Give user a chance to burp if we'd be + /* Give user a chance to burp if ALWAYS_CONFIRM or we'd be interactively wiping out any existing symbols. */ - if ((have_full_symbols () || have_partial_symbols ()) - && mainline - && from_tty + if (from_tty + && (always_confirm + || ((have_full_symbols () || have_partial_symbols ()) + && mainline)) && !query (_("Load new symbol table from \"%s\"? "), name)) error (_("Not confirmed."));