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