diff --git a/gdb/exec.c b/gdb/exec.c
index 07759725711..a1396c2aa3d 100644
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -501,7 +501,16 @@ exec_file_attach (const char *filename, int from_tty)
}
bfd_cache_close_all ();
- gdb::observers::executable_changed.notify ();
+
+ /* Are are loading the same executable? */
+ bfd *prev_bfd = exec_bfd_holder.get ();
+ bfd *curr_bfd = current_program_space->exec_bfd ();
+ bool reload_p = (((prev_bfd != nullptr) == (curr_bfd != nullptr))
+ && (prev_bfd == nullptr
+ || (strcmp (bfd_get_filename (prev_bfd),
+ bfd_get_filename (curr_bfd)) == 0)));
+
+ gdb::observers::executable_changed.notify (current_program_space, reload_p);
}
/* Process the first arg in ARGS as the new exec file.
diff --git a/gdb/observable.h b/gdb/observable.h
index 4ea203c6fc3..464d0b70f5b 100644
--- a/gdb/observable.h
+++ b/gdb/observable.h
@@ -31,6 +31,7 @@ struct inferior;
struct process_stratum_target;
struct target_ops;
struct trace_state_variable;
+struct program_space;
namespace gdb
{
@@ -60,11 +61,18 @@ extern observable signal_received;
/* The target's register contents have changed. */
extern observable target_changed;
-/* The executable being debugged by GDB has changed: The user
- decided to debug a different program, or the program he was
- debugging has been modified since being loaded by the debugger
- (by being recompiled, for instance). */
-extern observable<> executable_changed;
+/* The executable being debugged by GDB in PSPACE has changed: The user
+ decided to debug a different program, or the program he was debugging
+ has been modified since being loaded by the debugger (by being
+ recompiled, for instance). The path to the new executable can be found
+ by examining PSPACE->exec_filename.
+
+ When RELOAD is true the path to the executable hasn't changed, but the
+ file does appear to have changed, so GDB reloaded it, e.g. if the user
+ recompiled the executable. when RELOAD is false then the path to the
+ executable has not changed. */
+extern observable executable_changed;
/* gdb has just connected to an inferior. For 'run', gdb calls this
observer while the inferior is still stopped at the entry-point