This changes the DWARF reader to capture the current working directory
and the current debug directory. This avoids races when the DWARF
reader is working in the background.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31716
---
gdb/dwarf2/read.c | 19 ++++++++++++-------
gdb/dwarf2/read.h | 6 ++++++
2 files changed, 18 insertions(+), 7 deletions(-)
@@ -1251,7 +1251,9 @@ line_header_eq_voidp (const void *item_lhs, const void *item_rhs)
dwarf2_per_bfd::dwarf2_per_bfd (bfd *obfd, const dwarf2_debug_sections *names,
bool can_copy_)
: obfd (obfd),
- can_copy (can_copy_)
+ can_copy (can_copy_),
+ captured_cwd (current_directory),
+ captured_debug_dir (debug_file_directory)
{
if (names == NULL)
names = &dwarf2_elf_names;
@@ -9043,10 +9045,12 @@ try_open_dwop_file (dwarf2_per_objfile *per_objfile,
gdb::unique_xmalloc_ptr<char> search_path_holder;
if (search_cwd)
{
- if (!debug_file_directory.empty ())
+ const std::string &debug_dir = per_objfile->per_bfd->captured_debug_dir;
+
+ if (!debug_dir.empty ())
{
search_path_holder.reset (concat (".", dirname_separator_string,
- debug_file_directory.c_str (),
+ debug_dir.c_str (),
(char *) NULL));
search_path = search_path_holder.get ();
}
@@ -9054,7 +9058,7 @@ try_open_dwop_file (dwarf2_per_objfile *per_objfile,
search_path = ".";
}
else
- search_path = debug_file_directory.c_str ();
+ search_path = per_objfile->per_bfd->captured_debug_dir.c_str ();
/* Add the path for the executable binary to the list of search paths. */
std::string objfile_dir = ldirname (objfile_name (per_objfile->objfile));
@@ -9069,7 +9073,8 @@ try_open_dwop_file (dwarf2_per_objfile *per_objfile,
gdb::unique_xmalloc_ptr<char> absolute_name;
desc = openp (search_path, flags, file_name,
- O_RDONLY | O_BINARY, &absolute_name);
+ O_RDONLY | O_BINARY, &absolute_name,
+ per_objfile->per_bfd->captured_cwd.c_str ());
if (desc < 0)
return NULL;
@@ -9123,7 +9128,7 @@ open_dwo_file (dwarf2_per_objfile *per_objfile,
/* That didn't work, try debug-file-directory, which, despite its name,
is a list of paths. */
- if (debug_file_directory.empty ())
+ if (per_objfile->per_bfd->captured_debug_dir.empty ())
return NULL;
return try_open_dwop_file (per_objfile, file_name,
@@ -9404,7 +9409,7 @@ open_dwp_file (dwarf2_per_objfile *per_objfile, const char *file_name)
[IWBN if the dwp file name was recorded in the executable, akin to
.gnu_debuglink, but that doesn't exist yet.]
Strip the directory from FILE_NAME and search again. */
- if (!debug_file_directory.empty ())
+ if (!per_objfile->per_bfd->captured_debug_dir.empty ())
{
/* Don't implicitly search the current directory here.
If the user wants to search "." to handle this case,
@@ -558,6 +558,12 @@ struct dwarf2_per_bfd
std::unordered_map<sect_offset, std::vector<sect_offset>,
gdb::hash_enum<sect_offset>>
abstract_to_concrete;
+
+ /* Current directory, captured at the moment that object this was
+ created. */
+ std::string captured_cwd;
+ /* Captured copy of debug_file_directory. */
+ std::string captured_debug_dir;
};
/* An iterator for all_units that is based on index. This