* [patch/rfc] Fix gdb/1426: osabi initialization race condition
@ 2003-10-24 2:45 Andrew Cagney
2003-10-24 4:12 ` Daniel Jacobowitz
0 siblings, 1 reply; 3+ messages in thread
From: Andrew Cagney @ 2003-10-24 2:45 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 488 bytes --]
Hello,
ref: http://sources.redhat.com/gdb/bugs/1426 for details.
The attached implements the "hack" suggested in tdep/1426 to work around
a bogus error message:
A handler for the OS ABI "GNU/Linux" is not built into this
configuration of GDB. Attempting to continue with the default
rs6000:6000 settingsGNU gdb 2003-10-23-cvs
Copyright 2003 Free Software Foundation, Inc.
...
that appears on some platforms during startup.
Baring comment, I'll commit this in a few days.
Andrew
[-- Attachment #2: diffs --]
[-- Type: text/plain, Size: 3778 bytes --]
2003-10-23 Andrew Cagney <cagney@redhat.com>
* osabi.c (GDB_OSABI_DEFAULT): Delete macro definition.
(user_osabi_default): New static variable.
(_initialize_gdb_osabi): Initialize "user_osabi_default" to
GDB_OSABI_DEFAULT if defined, GDB_OSABI_UNKNOWN otherwize.
(gdbarch_lookup_osabi): Replace GDB_OSABI_DEFAULT with
"user_osabi_default".
(set_osabi, show_osabi): Ditto.
Work around GDB PR tdep/1426.
Index: osabi.c
===================================================================
RCS file: /cvs/src/src/gdb/osabi.c,v
retrieving revision 1.17
diff -u -r1.17 osabi.c
--- osabi.c 24 Aug 2003 11:47:18 -0000 1.17
+++ osabi.c 24 Oct 2003 02:30:08 -0000
@@ -30,10 +30,6 @@
#include "elf-bfd.h"
-#ifndef GDB_OSABI_DEFAULT
-#define GDB_OSABI_DEFAULT GDB_OSABI_UNKNOWN
-#endif
-
/* State for the "set osabi" command. */
static enum { osabi_auto, osabi_default, osabi_user } user_osabi_state;
static enum gdb_osabi user_selected_osabi;
@@ -45,6 +41,23 @@
};
static const char *set_osabi_string;
+/* Value for the "default" osabi.
+
+ It is initialized, during per-file initialization, by the function
+ _initialize_osabi below, to the build-time macro GDB_OSABI_DEFAULT.
+ Due to a race condition with the code trying to create the initial
+ "static" architecture, it is not statically initialized to
+ GDB_OSABI_DEFAULT.
+
+ The problem with static initialization is that the code creating
+ that initial "static" architecture calls gdbarch_osabi_init
+ (requesting the "default" OSABI) before any per-file initialization
+ has occured, but it is only during that per-file initialization
+ that the OSABI target code gets to register that said "default"
+ OSABI. Starting the user_osabi_default out as "uninitialized", and
+ then initializing it at per-file time works around the problem. */
+static int user_osabi_default = GDB_OSABI_UNINITIALIZED;
+
/* This table matches the indices assigned to enum gdb_osabi. Keep
them in sync. */
static const char * const gdb_osabi_names[] =
@@ -210,8 +223,8 @@
an inconclusive result (otherwise). */
if (abfd == NULL)
{
- if (GDB_OSABI_DEFAULT != GDB_OSABI_UNKNOWN)
- return GDB_OSABI_DEFAULT;
+ if (user_osabi_default != GDB_OSABI_UNKNOWN)
+ return user_osabi_default;
else
return GDB_OSABI_UNINITIALIZED;
}
@@ -277,8 +290,8 @@
/* If we didn't find a match, but a default was specified at configure
time, return the default. */
- if (GDB_OSABI_DEFAULT != GDB_OSABI_UNKNOWN && match == GDB_OSABI_UNKNOWN)
- return GDB_OSABI_DEFAULT;
+ if (user_osabi_default != GDB_OSABI_UNKNOWN && match == GDB_OSABI_UNKNOWN)
+ return user_osabi_default;
else
return match;
}
@@ -504,7 +517,7 @@
user_osabi_state = osabi_auto;
else if (strcmp (set_osabi_string, "default") == 0)
{
- user_selected_osabi = GDB_OSABI_DEFAULT;
+ user_selected_osabi = user_osabi_default;
user_osabi_state = osabi_user;
}
else if (strcmp (set_osabi_string, "none") == 0)
@@ -545,9 +558,9 @@
printf_filtered ("The current OS ABI is \"%s\".\n",
gdbarch_osabi_name (user_selected_osabi));
- if (GDB_OSABI_DEFAULT != GDB_OSABI_UNKNOWN)
+ if (user_osabi_default != GDB_OSABI_UNKNOWN)
printf_filtered ("The default OS ABI is \"%s\".\n",
- gdbarch_osabi_name (GDB_OSABI_DEFAULT));
+ gdbarch_osabi_name (user_osabi_default));
}
\f
extern initialize_file_ftype _initialize_gdb_osabi; /* -Wmissing-prototype */
@@ -577,4 +590,9 @@
add_cmd ("osabi", class_support, show_osabi, "Show OS/ABI of target.",
&showlist);
user_osabi_state = osabi_auto;
+#ifdef GDB_OSABI_DEFAULT
+ user_osabi_default = GDB_OSABI_DEFAULT;
+#else
+ user_osabi_default = GDB_OSABI_UNKNOWN;
+#endif
}
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch/rfc] Fix gdb/1426: osabi initialization race condition
2003-10-24 2:45 [patch/rfc] Fix gdb/1426: osabi initialization race condition Andrew Cagney
@ 2003-10-24 4:12 ` Daniel Jacobowitz
2003-10-24 13:55 ` Andrew Cagney
0 siblings, 1 reply; 3+ messages in thread
From: Daniel Jacobowitz @ 2003-10-24 4:12 UTC (permalink / raw)
To: Andrew Cagney; +Cc: gdb-patches
On Thu, Oct 23, 2003 at 10:44:42PM -0400, Andrew Cagney wrote:
> Hello,
>
> ref: http://sources.redhat.com/gdb/bugs/1426 for details.
>
> The attached implements the "hack" suggested in tdep/1426 to work around
> a bogus error message:
>
> A handler for the OS ABI "GNU/Linux" is not built into this
> configuration of GDB. Attempting to continue with the default
> rs6000:6000 settingsGNU gdb 2003-10-23-cvs
> Copyright 2003 Free Software Foundation, Inc.
> ...
>
> that appears on some platforms during startup.
>
> Baring comment, I'll commit this in a few days.
>
> Andrew
This is a rather unfortunate hack.
This is the way it is now, I think:
- first architecture is created
- per-file init:
- then the target's tdep file creates the osabi
But you've changed it to:
- application startup
- osabi is set to uninitialized
- first architecture is created
- per-file init
- then osabi.c sets user_osabi_default
- then the target's tdep file creates the osabi
(or these two switched, no difference)
This means that if per-file initialization doesn't happen then the
default osabi is never set. But one of the points of setting a
compile-time default OS ABI was so that even if not given a file, GDB
would get the right default. This patch will break using gdbserver on
an arm-linux target without loading a file into GDB (unless set osabi
is used, of course).
Also, one thing I couldn't figure out from the code - why does this
happen on some targets and not others?
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch/rfc] Fix gdb/1426: osabi initialization race condition
2003-10-24 4:12 ` Daniel Jacobowitz
@ 2003-10-24 13:55 ` Andrew Cagney
0 siblings, 0 replies; 3+ messages in thread
From: Andrew Cagney @ 2003-10-24 13:55 UTC (permalink / raw)
To: Daniel Jacobowitz; +Cc: Andrew Cagney, gdb-patches
> On Thu, Oct 23, 2003 at 10:44:42PM -0400, Andrew Cagney wrote:
>
>> Hello,
>>
>> ref: http://sources.redhat.com/gdb/bugs/1426 for details.
>>
>> The attached implements the "hack" suggested in tdep/1426 to work around
>> a bogus error message:
>>
>> A handler for the OS ABI "GNU/Linux" is not built into this
>> configuration of GDB. Attempting to continue with the default
>> rs6000:6000 settingsGNU gdb 2003-10-23-cvs
>> Copyright 2003 Free Software Foundation, Inc.
>> ...
>>
>> that appears on some platforms during startup.
>>
>> Baring comment, I'll commit this in a few days.
>>
>> Andrew
>
>
> This is a rather unfortunate hack.
Hmm, patch withdrawn.
> This is the way it is now, I think:
> - first architecture is created
> - per-file init:
> - then the target's tdep file creates the osabi
The sequence was:
- create fake architecture
- per-file init
- create real architecture
but a more careful check reveals that the first call has been eliminated
- something else is causing that warning :-/
Andrew
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2003-10-24 13:55 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-10-24 2:45 [patch/rfc] Fix gdb/1426: osabi initialization race condition Andrew Cagney
2003-10-24 4:12 ` Daniel Jacobowitz
2003-10-24 13:55 ` Andrew Cagney
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox