From: Tom Tromey Date: Tue, 8 Nov 2022 19:14:20 +0000 (-0700) Subject: Fix static initialization order problem in windows-nat.c X-Git-Tag: gdb-13-branchpoint~380 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c83b95d88feed26eb04f7eca97c08e3ace0b7cbb;p=thirdparty%2Fbinutils-gdb.git Fix static initialization order problem in windows-nat.c This patch fixes a static initialization order problem in windows-nat.c that was pointed out by Jon Turney. The underlying problem is that the windows_nat_target constructor relies on serial_logfile already being constructed, but this is not enforced by C++ rules. This patch fixes the problem by initializing the global windows_nat_target later. --- diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 6250cbc27a5..5d506507b6d 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -384,7 +384,9 @@ private: bool m_is_async = false; }; -static windows_nat_target the_windows_nat_target; +/* This is a pointer and not a global specifically to avoid a C++ + "static initializer fiasco" situation. */ +static windows_nat_target *the_windows_nat_target; static void check (BOOL ok, const char *file, int line) @@ -620,7 +622,7 @@ windows_nat_target::delete_thread (ptid_t ptid, DWORD exit_code, target_pid_to_str (ptid).c_str (), (unsigned) exit_code); - ::delete_thread (find_thread_ptid (&the_windows_nat_target, ptid)); + ::delete_thread (find_thread_ptid (the_windows_nat_target, ptid)); auto iter = std::find_if (windows_process.thread_list.begin (), windows_process.thread_list.end (), @@ -3118,7 +3120,8 @@ _initialize_windows_nat () calling x86_set_debug_register_length function in processor windows specific native file. */ - add_inf_child_target (&the_windows_nat_target); + the_windows_nat_target = new windows_nat_target; + add_inf_child_target (the_windows_nat_target); #ifdef __CYGWIN__ cygwin_internal (CW_SET_DOS_FILE_WARNING, 0);