* write.c (resolve_reloc_expr_symbols): Convert local symbols
[deliverable/binutils-gdb.git] / gdb / osabi.c
index 988e388728261d96e216dd2216300523a01b3364..22130f00fc81e6a305d684527bcd3e09d671c621 100644 (file)
@@ -1,6 +1,6 @@
 /* OS ABI variant handling for GDB.
 
-   Copyright (C) 2001, 2002, 2003, 2004, 2007, 2008
+   Copyright (C) 2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -67,13 +67,12 @@ static const char * const gdb_osabi_names[] =
   "Interix",
   "HP/UX ELF",
   "HP/UX SOM",
-
   "QNX Neutrino",
-
   "Cygwin",
   "AIX",
   "DICOS",
   "Darwin",
+  "Symbian",
 
   "<invalid>"
 };
@@ -87,6 +86,30 @@ gdbarch_osabi_name (enum gdb_osabi osabi)
   return gdb_osabi_names[GDB_OSABI_INVALID];
 }
 
+/* Lookup the OS ABI corresponding to the specified target description
+   string.  */
+
+enum gdb_osabi
+osabi_from_tdesc_string (const char *name)
+{
+  int i;
+
+  for (i = 0; i < ARRAY_SIZE (gdb_osabi_names); i++)
+    if (strcmp (name, gdb_osabi_names[i]) == 0)
+      {
+       /* See note above: the name table matches the indices assigned
+          to enum gdb_osabi.  */
+       enum gdb_osabi osabi = (enum gdb_osabi) i;
+
+       if (osabi == GDB_OSABI_INVALID)
+         return GDB_OSABI_UNKNOWN;
+       else
+         return osabi;
+      }
+
+  return GDB_OSABI_UNKNOWN;
+}
+
 /* Handler for a given architecture/OS ABI pair.  There should be only
    one handler for a given OS ABI each architecture family.  */
 struct gdb_osabi_handler  
@@ -161,7 +184,7 @@ gdbarch_register_osabi (enum bfd_architecture arch, unsigned long machine,
 }
 \f
 
-/* Sniffer to find the OS ABI for a given file's architecture and flavour. 
+/* Sniffer to find the OS ABI for a given file's architecture and flavour.
    It is legal to have multiple sniffers for each arch/flavour pair, to
    disambiguate one OS's a.out from another, for example.  The first sniffer
    to return something other than GDB_OSABI_UNKNOWN wins, so a sniffer should
@@ -205,10 +228,11 @@ gdbarch_lookup_osabi (bfd *abfd)
   if (user_osabi_state == osabi_user)
     return user_selected_osabi;
 
-  /* If we don't have a binary, return the default OS ABI (if set) or
-     unknown (otherwise).  */
+  /* If we don't have a binary, just return unknown.  The caller may
+     have other sources the OSABI can be extracted from, e.g., the
+     target description.  */
   if (abfd == NULL) 
-    return GDB_OSABI_DEFAULT;
+    return GDB_OSABI_UNKNOWN;
 
   match = GDB_OSABI_UNKNOWN;
   match_specific = 0;
@@ -269,12 +293,7 @@ gdbarch_lookup_osabi (bfd *abfd)
        }
     }
 
-  /* 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;
-  else
-    return match;
+  return match;
 }
 
 
@@ -439,8 +458,9 @@ generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
              break;
 
            default:
-             internal_error (__FILE__, __LINE__, _("\
-generic_elf_osabi_sniff_abi_tag_sections: unknown OS number %d"),
+             internal_error (__FILE__, __LINE__,
+                             _("generic_elf_osabi_sniff_abi_tag_sections: "
+                               "unknown OS number %d"),
                              abi_tag);
            }
          return;
@@ -494,11 +514,15 @@ generic_elf_osabi_sniffer (bfd *abfd)
   switch (elfosabi)
     {
     case ELFOSABI_NONE:
+    case ELFOSABI_GNU:
       /* When the EI_OSABI field in the ELF header is ELFOSABI_NONE
          (0), then the ELF structures in the file are conforming to
          the base specification for that machine (there are no
          OS-specific extensions).  In order to determine the real OS
-         in use we must look for OS-specific notes.  */
+         in use, we must look for OS-specific notes.
+
+         The same applies for ELFOSABI_GNU: this can mean GNU/Hurd,
+         GNU/Linux, and possibly more.  */
       bfd_map_over_sections (abfd,
                             generic_elf_osabi_sniff_abi_tag_sections,
                             &osabi);
@@ -512,14 +536,6 @@ generic_elf_osabi_sniffer (bfd *abfd)
       osabi = GDB_OSABI_NETBSD_ELF;
       break;
 
-    case ELFOSABI_LINUX:
-      osabi = GDB_OSABI_LINUX;
-      break;
-
-    case ELFOSABI_HURD:
-      osabi = GDB_OSABI_HURD;
-      break;
-
     case ELFOSABI_SOLARIS:
       osabi = GDB_OSABI_SOLARIS;
       break;
@@ -569,6 +585,7 @@ set_osabi (char *args, int from_tty, struct cmd_list_element *c)
   else
     {
       int i;
+
       for (i = 1; i < GDB_OSABI_INVALID; i++)
        if (strcmp (set_osabi_string, gdbarch_osabi_name (i)) == 0)
          {
@@ -595,8 +612,9 @@ show_osabi (struct ui_file *file, int from_tty, struct cmd_list_element *c,
 {
   if (user_osabi_state == osabi_auto)
     fprintf_filtered (file,
-                     _("The current OS ABI is \"auto\" (currently \"%s\").\n"),
-                     gdbarch_osabi_name (gdbarch_osabi (current_gdbarch)));
+                     _("The current OS ABI is \"auto\" "
+                       "(currently \"%s\").\n"),
+                     gdbarch_osabi_name (gdbarch_osabi (get_current_arch ())));
   else
     fprintf_filtered (file, _("The current OS ABI is \"%s\".\n"),
                      gdbarch_osabi_name (user_selected_osabi));
@@ -611,8 +629,6 @@ extern initialize_file_ftype _initialize_gdb_osabi; /* -Wmissing-prototype */
 void
 _initialize_gdb_osabi (void)
 {
-  struct cmd_list_element *c;
-
   if (strcmp (gdb_osabi_names[GDB_OSABI_INVALID], "<invalid>") != 0)
     internal_error
       (__FILE__, __LINE__,
@@ -625,11 +641,10 @@ _initialize_gdb_osabi (void)
 
   /* Register the "set osabi" command.  */
   add_setshow_enum_cmd ("osabi", class_support, gdb_osabi_available_names,
-                       &set_osabi_string, _("\
-Set OS ABI of target."), _("\
-Show OS ABI of target."), NULL,
-                       set_osabi,
-                       show_osabi,
+                       &set_osabi_string,
+                       _("Set OS ABI of target."),
+                       _("Show OS ABI of target."),
+                       NULL, set_osabi, show_osabi,
                        &setlist, &showlist);
   user_osabi_state = osabi_auto;
 }
This page took 0.030479 seconds and 4 git commands to generate.