xref: /openbsd-src/gnu/usr.bin/binutils/gdb/osabi.c (revision 00c85667f8de40c5676f4ffe40dca7069f15197e)
1b725ae77Skettenis /* OS ABI variant handling for GDB.
2*00c85667Skettenis 
3*00c85667Skettenis    Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4b725ae77Skettenis 
5b725ae77Skettenis    This file is part of GDB.
6b725ae77Skettenis 
7b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
8b725ae77Skettenis    it under the terms of the GNU General Public License as published by
9b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
10b725ae77Skettenis    (at your option) any later version.
11b725ae77Skettenis 
12b725ae77Skettenis    This program is distributed in the hope that it will be useful,
13b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
14b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15b725ae77Skettenis    GNU General Public License for more details.
16b725ae77Skettenis 
17b725ae77Skettenis    You should have received a copy of the GNU General Public License
18b725ae77Skettenis    along with this program; if not, write to the Free Software
19b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
20b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
21b725ae77Skettenis 
22b725ae77Skettenis #include "defs.h"
23b725ae77Skettenis 
24b725ae77Skettenis #include "gdb_assert.h"
25b725ae77Skettenis #include "gdb_string.h"
26b725ae77Skettenis 
27b725ae77Skettenis #include "osabi.h"
28b725ae77Skettenis #include "arch-utils.h"
29b725ae77Skettenis #include "gdbcmd.h"
30b725ae77Skettenis #include "command.h"
31b725ae77Skettenis 
32b725ae77Skettenis #include "elf-bfd.h"
33b725ae77Skettenis 
34b725ae77Skettenis #ifndef GDB_OSABI_DEFAULT
35b725ae77Skettenis #define GDB_OSABI_DEFAULT GDB_OSABI_UNKNOWN
36b725ae77Skettenis #endif
37b725ae77Skettenis 
38b725ae77Skettenis /* State for the "set osabi" command.  */
39b725ae77Skettenis static enum { osabi_auto, osabi_default, osabi_user } user_osabi_state;
40b725ae77Skettenis static enum gdb_osabi user_selected_osabi;
41b725ae77Skettenis static const char *gdb_osabi_available_names[GDB_OSABI_INVALID + 3] = {
42b725ae77Skettenis   "auto",
43b725ae77Skettenis   "default",
44b725ae77Skettenis   "none",
45b725ae77Skettenis   NULL
46b725ae77Skettenis };
47b725ae77Skettenis static const char *set_osabi_string;
48b725ae77Skettenis 
49b725ae77Skettenis /* This table matches the indices assigned to enum gdb_osabi.  Keep
50b725ae77Skettenis    them in sync.  */
51b725ae77Skettenis static const char * const gdb_osabi_names[] =
52b725ae77Skettenis {
53b725ae77Skettenis   "none",
54b725ae77Skettenis 
55b725ae77Skettenis   "SVR4",
56b725ae77Skettenis   "GNU/Hurd",
57b725ae77Skettenis   "Solaris",
58b725ae77Skettenis   "OSF/1",
59b725ae77Skettenis   "GNU/Linux",
60b725ae77Skettenis   "FreeBSD a.out",
61b725ae77Skettenis   "FreeBSD ELF",
62b725ae77Skettenis   "NetBSD a.out",
63b725ae77Skettenis   "NetBSD ELF",
64b725ae77Skettenis   "OpenBSD ELF",
65b725ae77Skettenis   "Windows CE",
66b725ae77Skettenis   "DJGPP",
67b725ae77Skettenis   "NetWare",
68b725ae77Skettenis   "Irix",
69b725ae77Skettenis   "LynxOS",
70b725ae77Skettenis   "Interix",
71b725ae77Skettenis   "HP/UX ELF",
72b725ae77Skettenis   "HP/UX SOM",
73b725ae77Skettenis 
74b725ae77Skettenis   "ARM EABI v1",
75b725ae77Skettenis   "ARM EABI v2",
76b725ae77Skettenis   "ARM APCS",
77b725ae77Skettenis   "QNX Neutrino",
78b725ae77Skettenis 
79b725ae77Skettenis   "Cygwin",
80b725ae77Skettenis 
81b725ae77Skettenis   "<invalid>"
82b725ae77Skettenis };
83b725ae77Skettenis 
84b725ae77Skettenis const char *
gdbarch_osabi_name(enum gdb_osabi osabi)85b725ae77Skettenis gdbarch_osabi_name (enum gdb_osabi osabi)
86b725ae77Skettenis {
87b725ae77Skettenis   if (osabi >= GDB_OSABI_UNKNOWN && osabi < GDB_OSABI_INVALID)
88b725ae77Skettenis     return gdb_osabi_names[osabi];
89b725ae77Skettenis 
90b725ae77Skettenis   return gdb_osabi_names[GDB_OSABI_INVALID];
91b725ae77Skettenis }
92b725ae77Skettenis 
93b725ae77Skettenis /* Handler for a given architecture/OS ABI pair.  There should be only
94b725ae77Skettenis    one handler for a given OS ABI each architecture family.  */
95b725ae77Skettenis struct gdb_osabi_handler
96b725ae77Skettenis {
97b725ae77Skettenis   struct gdb_osabi_handler *next;
98b725ae77Skettenis   const struct bfd_arch_info *arch_info;
99b725ae77Skettenis   enum gdb_osabi osabi;
100b725ae77Skettenis   void (*init_osabi)(struct gdbarch_info, struct gdbarch *);
101b725ae77Skettenis };
102b725ae77Skettenis 
103b725ae77Skettenis static struct gdb_osabi_handler *gdb_osabi_handler_list;
104b725ae77Skettenis 
105b725ae77Skettenis void
gdbarch_register_osabi(enum bfd_architecture arch,unsigned long machine,enum gdb_osabi osabi,void (* init_osabi)(struct gdbarch_info,struct gdbarch *))106b725ae77Skettenis gdbarch_register_osabi (enum bfd_architecture arch, unsigned long machine,
107b725ae77Skettenis 			enum gdb_osabi osabi,
108b725ae77Skettenis                         void (*init_osabi)(struct gdbarch_info,
109b725ae77Skettenis 					   struct gdbarch *))
110b725ae77Skettenis {
111b725ae77Skettenis   struct gdb_osabi_handler **handler_p;
112b725ae77Skettenis   const struct bfd_arch_info *arch_info = bfd_lookup_arch (arch, machine);
113b725ae77Skettenis   const char **name_ptr;
114b725ae77Skettenis 
115b725ae77Skettenis   /* Registering an OS ABI handler for "unknown" is not allowed.  */
116b725ae77Skettenis   if (osabi == GDB_OSABI_UNKNOWN)
117b725ae77Skettenis     {
118b725ae77Skettenis       internal_error
119b725ae77Skettenis 	(__FILE__, __LINE__,
120b725ae77Skettenis 	 "gdbarch_register_osabi: An attempt to register a handler for "
121b725ae77Skettenis          "OS ABI \"%s\" for architecture %s was made.  The handler will "
122b725ae77Skettenis 	 "not be registered",
123b725ae77Skettenis 	 gdbarch_osabi_name (osabi),
124b725ae77Skettenis 	 bfd_printable_arch_mach (arch, machine));
125b725ae77Skettenis       return;
126b725ae77Skettenis     }
127b725ae77Skettenis 
128b725ae77Skettenis   gdb_assert (arch_info);
129b725ae77Skettenis 
130b725ae77Skettenis   for (handler_p = &gdb_osabi_handler_list; *handler_p != NULL;
131b725ae77Skettenis        handler_p = &(*handler_p)->next)
132b725ae77Skettenis     {
133b725ae77Skettenis       if ((*handler_p)->arch_info == arch_info
134b725ae77Skettenis 	  && (*handler_p)->osabi == osabi)
135b725ae77Skettenis 	{
136b725ae77Skettenis 	  internal_error
137b725ae77Skettenis 	    (__FILE__, __LINE__,
138b725ae77Skettenis 	     "gdbarch_register_osabi: A handler for OS ABI \"%s\" "
139b725ae77Skettenis 	     "has already been registered for architecture %s",
140b725ae77Skettenis 	     gdbarch_osabi_name (osabi),
141b725ae77Skettenis 	     arch_info->printable_name);
142b725ae77Skettenis 	  /* If user wants to continue, override previous definition.  */
143b725ae77Skettenis 	  (*handler_p)->init_osabi = init_osabi;
144b725ae77Skettenis 	  return;
145b725ae77Skettenis 	}
146b725ae77Skettenis     }
147b725ae77Skettenis 
148b725ae77Skettenis   (*handler_p)
149b725ae77Skettenis     = (struct gdb_osabi_handler *) xmalloc (sizeof (struct gdb_osabi_handler));
150b725ae77Skettenis   (*handler_p)->next = NULL;
151b725ae77Skettenis   (*handler_p)->arch_info = arch_info;
152b725ae77Skettenis   (*handler_p)->osabi = osabi;
153b725ae77Skettenis   (*handler_p)->init_osabi = init_osabi;
154b725ae77Skettenis 
155b725ae77Skettenis   /* Add this OS ABI to the list of enum values for "set osabi", if it isn't
156b725ae77Skettenis      already there.  */
157b725ae77Skettenis   for (name_ptr = gdb_osabi_available_names; *name_ptr; name_ptr ++)
158b725ae77Skettenis     {
159b725ae77Skettenis       if (*name_ptr == gdbarch_osabi_name (osabi))
160b725ae77Skettenis 	return;
161b725ae77Skettenis     }
162b725ae77Skettenis   *name_ptr++ = gdbarch_osabi_name (osabi);
163b725ae77Skettenis   *name_ptr = NULL;
164b725ae77Skettenis }
165b725ae77Skettenis 
166b725ae77Skettenis 
167b725ae77Skettenis /* Sniffer to find the OS ABI for a given file's architecture and flavour.
168b725ae77Skettenis    It is legal to have multiple sniffers for each arch/flavour pair, to
169b725ae77Skettenis    disambiguate one OS's a.out from another, for example.  The first sniffer
170b725ae77Skettenis    to return something other than GDB_OSABI_UNKNOWN wins, so a sniffer should
171b725ae77Skettenis    be careful to claim a file only if it knows for sure what it is.  */
172b725ae77Skettenis struct gdb_osabi_sniffer
173b725ae77Skettenis {
174b725ae77Skettenis   struct gdb_osabi_sniffer *next;
175b725ae77Skettenis   enum bfd_architecture arch;   /* bfd_arch_unknown == wildcard */
176b725ae77Skettenis   enum bfd_flavour flavour;
177b725ae77Skettenis   enum gdb_osabi (*sniffer)(bfd *);
178b725ae77Skettenis };
179b725ae77Skettenis 
180b725ae77Skettenis static struct gdb_osabi_sniffer *gdb_osabi_sniffer_list;
181b725ae77Skettenis 
182b725ae77Skettenis void
gdbarch_register_osabi_sniffer(enum bfd_architecture arch,enum bfd_flavour flavour,enum gdb_osabi (* sniffer_fn)(bfd *))183b725ae77Skettenis gdbarch_register_osabi_sniffer (enum bfd_architecture arch,
184b725ae77Skettenis                                 enum bfd_flavour flavour,
185b725ae77Skettenis 				enum gdb_osabi (*sniffer_fn)(bfd *))
186b725ae77Skettenis {
187b725ae77Skettenis   struct gdb_osabi_sniffer *sniffer;
188b725ae77Skettenis 
189b725ae77Skettenis   sniffer =
190b725ae77Skettenis     (struct gdb_osabi_sniffer *) xmalloc (sizeof (struct gdb_osabi_sniffer));
191b725ae77Skettenis   sniffer->arch = arch;
192b725ae77Skettenis   sniffer->flavour = flavour;
193b725ae77Skettenis   sniffer->sniffer = sniffer_fn;
194b725ae77Skettenis 
195b725ae77Skettenis   sniffer->next = gdb_osabi_sniffer_list;
196b725ae77Skettenis   gdb_osabi_sniffer_list = sniffer;
197b725ae77Skettenis }
198b725ae77Skettenis 
199b725ae77Skettenis 
200b725ae77Skettenis enum gdb_osabi
gdbarch_lookup_osabi(bfd * abfd)201b725ae77Skettenis gdbarch_lookup_osabi (bfd *abfd)
202b725ae77Skettenis {
203b725ae77Skettenis   struct gdb_osabi_sniffer *sniffer;
204b725ae77Skettenis   enum gdb_osabi osabi, match;
205b725ae77Skettenis   int match_specific;
206b725ae77Skettenis 
207b725ae77Skettenis   /* If we aren't in "auto" mode, return the specified OS ABI.  */
208b725ae77Skettenis   if (user_osabi_state == osabi_user)
209b725ae77Skettenis     return user_selected_osabi;
210b725ae77Skettenis 
211b725ae77Skettenis   /* If we don't have a binary, return the default OS ABI (if set) or
212b725ae77Skettenis      an inconclusive result (otherwise).  */
213b725ae77Skettenis   if (abfd == NULL)
214b725ae77Skettenis     {
215b725ae77Skettenis       if (GDB_OSABI_DEFAULT != GDB_OSABI_UNKNOWN)
216b725ae77Skettenis 	return GDB_OSABI_DEFAULT;
217b725ae77Skettenis       else
218b725ae77Skettenis 	return GDB_OSABI_UNINITIALIZED;
219b725ae77Skettenis     }
220b725ae77Skettenis 
221b725ae77Skettenis   match = GDB_OSABI_UNKNOWN;
222b725ae77Skettenis   match_specific = 0;
223b725ae77Skettenis 
224b725ae77Skettenis   for (sniffer = gdb_osabi_sniffer_list; sniffer != NULL;
225b725ae77Skettenis        sniffer = sniffer->next)
226b725ae77Skettenis     {
227b725ae77Skettenis       if ((sniffer->arch == bfd_arch_unknown /* wildcard */
228b725ae77Skettenis 	   || sniffer->arch == bfd_get_arch (abfd))
229b725ae77Skettenis 	  && sniffer->flavour == bfd_get_flavour (abfd))
230b725ae77Skettenis 	{
231b725ae77Skettenis 	  osabi = (*sniffer->sniffer) (abfd);
232b725ae77Skettenis 	  if (osabi < GDB_OSABI_UNKNOWN || osabi >= GDB_OSABI_INVALID)
233b725ae77Skettenis 	    {
234b725ae77Skettenis 	      internal_error
235b725ae77Skettenis 		(__FILE__, __LINE__,
236b725ae77Skettenis 		 "gdbarch_lookup_osabi: invalid OS ABI (%d) from sniffer "
237b725ae77Skettenis 		 "for architecture %s flavour %d",
238b725ae77Skettenis 		 (int) osabi,
239b725ae77Skettenis 		 bfd_printable_arch_mach (bfd_get_arch (abfd), 0),
240b725ae77Skettenis 		 (int) bfd_get_flavour (abfd));
241b725ae77Skettenis 	    }
242b725ae77Skettenis 	  else if (osabi != GDB_OSABI_UNKNOWN)
243b725ae77Skettenis 	    {
244b725ae77Skettenis 	      /* A specific sniffer always overrides a generic sniffer.
245b725ae77Skettenis 		 Croak on multiple match if the two matches are of the
246b725ae77Skettenis 		 same class.  If the user wishes to continue, we'll use
247b725ae77Skettenis 		 the first match.  */
248b725ae77Skettenis 	      if (match != GDB_OSABI_UNKNOWN)
249b725ae77Skettenis 		{
250b725ae77Skettenis 		  if ((match_specific && sniffer->arch != bfd_arch_unknown)
251b725ae77Skettenis 		   || (!match_specific && sniffer->arch == bfd_arch_unknown))
252b725ae77Skettenis 		    {
253b725ae77Skettenis 		      internal_error
254b725ae77Skettenis 		        (__FILE__, __LINE__,
255b725ae77Skettenis 		         "gdbarch_lookup_osabi: multiple %sspecific OS ABI "
256b725ae77Skettenis 			 "match for architecture %s flavour %d: first "
257b725ae77Skettenis 			 "match \"%s\", second match \"%s\"",
258b725ae77Skettenis 			 match_specific ? "" : "non-",
259b725ae77Skettenis 		         bfd_printable_arch_mach (bfd_get_arch (abfd), 0),
260b725ae77Skettenis 		         (int) bfd_get_flavour (abfd),
261b725ae77Skettenis 		         gdbarch_osabi_name (match),
262b725ae77Skettenis 		         gdbarch_osabi_name (osabi));
263b725ae77Skettenis 		    }
264b725ae77Skettenis 		  else if (sniffer->arch != bfd_arch_unknown)
265b725ae77Skettenis 		    {
266b725ae77Skettenis 		      match = osabi;
267b725ae77Skettenis 		      match_specific = 1;
268b725ae77Skettenis 		    }
269b725ae77Skettenis 		}
270b725ae77Skettenis 	      else
271b725ae77Skettenis 		{
272b725ae77Skettenis 		  match = osabi;
273b725ae77Skettenis 		  if (sniffer->arch != bfd_arch_unknown)
274b725ae77Skettenis 		    match_specific = 1;
275b725ae77Skettenis 		}
276b725ae77Skettenis 	    }
277b725ae77Skettenis 	}
278b725ae77Skettenis     }
279b725ae77Skettenis 
280b725ae77Skettenis   /* If we didn't find a match, but a default was specified at configure
281b725ae77Skettenis      time, return the default.  */
282b725ae77Skettenis   if (GDB_OSABI_DEFAULT != GDB_OSABI_UNKNOWN && match == GDB_OSABI_UNKNOWN)
283b725ae77Skettenis     return GDB_OSABI_DEFAULT;
284b725ae77Skettenis   else
285b725ae77Skettenis     return match;
286b725ae77Skettenis }
287b725ae77Skettenis 
288b725ae77Skettenis 
289b725ae77Skettenis /* Return non-zero if architecture A can run code written for
290b725ae77Skettenis    architecture B.  */
291b725ae77Skettenis static int
can_run_code_for(const struct bfd_arch_info * a,const struct bfd_arch_info * b)292b725ae77Skettenis can_run_code_for (const struct bfd_arch_info *a, const struct bfd_arch_info *b)
293b725ae77Skettenis {
294b725ae77Skettenis   /* BFD's 'A->compatible (A, B)' functions return zero if A and B are
295b725ae77Skettenis      incompatible.  But if they are compatible, it returns the 'more
296b725ae77Skettenis      featureful' of the two arches.  That is, if A can run code
297b725ae77Skettenis      written for B, but B can't run code written for A, then it'll
298b725ae77Skettenis      return A.
299b725ae77Skettenis 
300b725ae77Skettenis      struct bfd_arch_info objects are singletons: that is, there's
301b725ae77Skettenis      supposed to be exactly one instance for a given machine.  So you
302b725ae77Skettenis      can tell whether two are equivalent by comparing pointers.  */
303b725ae77Skettenis   return (a == b || a->compatible (a, b) == a);
304b725ae77Skettenis }
305b725ae77Skettenis 
306b725ae77Skettenis 
307b725ae77Skettenis void
gdbarch_init_osabi(struct gdbarch_info info,struct gdbarch * gdbarch)308b725ae77Skettenis gdbarch_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
309b725ae77Skettenis {
310b725ae77Skettenis   struct gdb_osabi_handler *handler;
311b725ae77Skettenis 
312b725ae77Skettenis   if (info.osabi == GDB_OSABI_UNKNOWN)
313b725ae77Skettenis     {
314b725ae77Skettenis       /* Don't complain about an unknown OSABI.  Assume the user knows
315b725ae77Skettenis          what they are doing.  */
316b725ae77Skettenis       return;
317b725ae77Skettenis     }
318b725ae77Skettenis 
319b725ae77Skettenis   for (handler = gdb_osabi_handler_list; handler != NULL;
320b725ae77Skettenis        handler = handler->next)
321b725ae77Skettenis     {
322b725ae77Skettenis       if (handler->osabi != info.osabi)
323b725ae77Skettenis 	continue;
324b725ae77Skettenis 
325b725ae77Skettenis       /* If the architecture described by ARCH_INFO can run code for
326b725ae77Skettenis          the architcture we registered the handler for, then the
327b725ae77Skettenis          handler is applicable.  Note, though, that if the handler is
328b725ae77Skettenis          for an architecture that is a superset of ARCH_INFO, we can't
329b725ae77Skettenis          use that --- it would be perfectly correct for it to install
330b725ae77Skettenis          gdbarch methods that refer to registers / instructions /
331b725ae77Skettenis          other facilities ARCH_INFO doesn't have.
332b725ae77Skettenis 
333b725ae77Skettenis          NOTE: kettenis/20021027: There may be more than one machine
334b725ae77Skettenis 	 type that is compatible with the desired machine type.  Right
335b725ae77Skettenis 	 now we simply return the first match, which is fine for now.
336b725ae77Skettenis 	 However, we might want to do something smarter in the future.  */
337b725ae77Skettenis       /* NOTE: cagney/2003-10-23: The code for "a can_run_code_for b"
338b725ae77Skettenis          is implemented using BFD's compatible method (a->compatible
339b725ae77Skettenis          (b) == a -- the lowest common denominator between a and b is
340b725ae77Skettenis          a).  That method's definition of compatible may not be as you
341b725ae77Skettenis          expect.  For instance the test "amd64 can run code for i386"
342b725ae77Skettenis          (or more generally "64-bit ISA can run code for the 32-bit
343b725ae77Skettenis          ISA").  BFD doesn't normally consider 32-bit and 64-bit
344b725ae77Skettenis          "compatible" so it doesn't succeed.  */
345b725ae77Skettenis       if (can_run_code_for (info.bfd_arch_info, handler->arch_info))
346b725ae77Skettenis 	{
347b725ae77Skettenis 	  (*handler->init_osabi) (info, gdbarch);
348b725ae77Skettenis 	  return;
349b725ae77Skettenis 	}
350b725ae77Skettenis     }
351b725ae77Skettenis 
352b725ae77Skettenis   warning
353b725ae77Skettenis     ("A handler for the OS ABI \"%s\" is not built into this configuration\n"
354b725ae77Skettenis      "of GDB.  Attempting to continue with the default %s settings.\n",
355b725ae77Skettenis      gdbarch_osabi_name (info.osabi),
356b725ae77Skettenis      info.bfd_arch_info->printable_name);
357b725ae77Skettenis }
358b725ae77Skettenis 
359b725ae77Skettenis /* Limit on the amount of data to be read.  */
360b725ae77Skettenis #define MAX_NOTESZ	128
361b725ae77Skettenis 
362b725ae77Skettenis /* Return non-zero if NOTE matches NAME, DESCSZ and TYPE.  */
363b725ae77Skettenis 
364b725ae77Skettenis static int
check_note(bfd * abfd,asection * sect,const char * note,const char * name,unsigned long descsz,unsigned long type)365b725ae77Skettenis check_note (bfd *abfd, asection *sect, const char *note,
366b725ae77Skettenis 	    const char *name, unsigned long descsz, unsigned long type)
367b725ae77Skettenis {
368b725ae77Skettenis   unsigned long notesz;
369b725ae77Skettenis 
370b725ae77Skettenis   /* Calculate the size of this note.  */
371b725ae77Skettenis   notesz = strlen (name) + 1;
372b725ae77Skettenis   notesz = ((notesz + 3) & ~3);
373b725ae77Skettenis   notesz += descsz;
374b725ae77Skettenis   notesz = ((notesz + 3) & ~3);
375b725ae77Skettenis 
376b725ae77Skettenis   /* If this assertion triggers, increase MAX_NOTESZ.  */
377b725ae77Skettenis   gdb_assert (notesz <= MAX_NOTESZ);
378b725ae77Skettenis 
379b725ae77Skettenis   /* Check whether SECT is big enough to comtain the complete note.  */
380b725ae77Skettenis   if (notesz > bfd_section_size (abfd, sect))
381b725ae77Skettenis     return 0;
382b725ae77Skettenis 
383b725ae77Skettenis   /* Check the note name.  */
384b725ae77Skettenis   if (bfd_h_get_32 (abfd, note) != (strlen (name) + 1)
385b725ae77Skettenis       || strcmp (note + 12, name) != 0)
386b725ae77Skettenis     return 0;
387b725ae77Skettenis 
388b725ae77Skettenis   /* Check the descriptor size.  */
389b725ae77Skettenis   if (bfd_h_get_32 (abfd, note + 4) != descsz)
390b725ae77Skettenis     return 0;
391b725ae77Skettenis 
392b725ae77Skettenis   /* Check the note type.  */
393b725ae77Skettenis   if (bfd_h_get_32 (abfd, note + 8) != type)
394b725ae77Skettenis     return 0;
395b725ae77Skettenis 
396b725ae77Skettenis   return 1;
397b725ae77Skettenis }
398b725ae77Skettenis 
399b725ae77Skettenis /* Generic sniffer for ELF flavoured files.  */
400b725ae77Skettenis 
401b725ae77Skettenis void
generic_elf_osabi_sniff_abi_tag_sections(bfd * abfd,asection * sect,void * obj)402b725ae77Skettenis generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
403b725ae77Skettenis {
404b725ae77Skettenis   enum gdb_osabi *osabi = obj;
405b725ae77Skettenis   const char *name;
406b725ae77Skettenis   unsigned int sectsize;
407b725ae77Skettenis   char *note;
408b725ae77Skettenis 
409b725ae77Skettenis   name = bfd_get_section_name (abfd, sect);
410b725ae77Skettenis   sectsize = bfd_section_size (abfd, sect);
411b725ae77Skettenis 
412b725ae77Skettenis   /* Limit the amount of data to read.  */
413b725ae77Skettenis   if (sectsize > MAX_NOTESZ)
414b725ae77Skettenis     sectsize = MAX_NOTESZ;
415b725ae77Skettenis 
416b725ae77Skettenis   note = alloca (sectsize);
417b725ae77Skettenis   bfd_get_section_contents (abfd, sect, note, 0, sectsize);
418b725ae77Skettenis 
419b725ae77Skettenis   /* .note.ABI-tag notes, used by GNU/Linux and FreeBSD.  */
420b725ae77Skettenis   if (strcmp (name, ".note.ABI-tag") == 0)
421b725ae77Skettenis     {
422b725ae77Skettenis       /* GNU.  */
423b725ae77Skettenis       if (check_note (abfd, sect, note, "GNU", 16, NT_GNU_ABI_TAG))
424b725ae77Skettenis 	{
425b725ae77Skettenis 	  unsigned int abi_tag = bfd_h_get_32 (abfd, note + 16);
426b725ae77Skettenis 
427b725ae77Skettenis 	  switch (abi_tag)
428b725ae77Skettenis 	    {
429b725ae77Skettenis 	    case GNU_ABI_TAG_LINUX:
430b725ae77Skettenis 	      *osabi = GDB_OSABI_LINUX;
431b725ae77Skettenis 	      break;
432b725ae77Skettenis 
433b725ae77Skettenis 	    case GNU_ABI_TAG_HURD:
434b725ae77Skettenis 	      *osabi = GDB_OSABI_HURD;
435b725ae77Skettenis 	      break;
436b725ae77Skettenis 
437b725ae77Skettenis 	    case GNU_ABI_TAG_SOLARIS:
438b725ae77Skettenis 	      *osabi = GDB_OSABI_SOLARIS;
439b725ae77Skettenis 	      break;
440b725ae77Skettenis 
441b725ae77Skettenis 	    case GNU_ABI_TAG_FREEBSD:
442b725ae77Skettenis 	      *osabi = GDB_OSABI_FREEBSD_ELF;
443b725ae77Skettenis 	      break;
444b725ae77Skettenis 
445b725ae77Skettenis 	    case GNU_ABI_TAG_NETBSD:
446b725ae77Skettenis 	      *osabi = GDB_OSABI_NETBSD_ELF;
447b725ae77Skettenis 	      break;
448b725ae77Skettenis 
449b725ae77Skettenis 	    default:
450b725ae77Skettenis 	      internal_error (__FILE__, __LINE__, "\
451b725ae77Skettenis generic_elf_osabi_sniff_abi_tag_sections: unknown OS number %d",
452b725ae77Skettenis 			      abi_tag);
453b725ae77Skettenis 	    }
454b725ae77Skettenis 	  return;
455b725ae77Skettenis 	}
456b725ae77Skettenis 
457b725ae77Skettenis       /* FreeBSD.  */
458b725ae77Skettenis       if (check_note (abfd, sect, note, "FreeBSD", 4, NT_FREEBSD_ABI_TAG))
459b725ae77Skettenis 	{
460b725ae77Skettenis 	  /* There is no need to check the version yet.  */
461b725ae77Skettenis 	  *osabi = GDB_OSABI_FREEBSD_ELF;
462b725ae77Skettenis 	  return;
463b725ae77Skettenis 	}
464b725ae77Skettenis 
465b725ae77Skettenis       return;
466b725ae77Skettenis     }
467b725ae77Skettenis 
468b725ae77Skettenis   /* .note.netbsd.ident notes, used by NetBSD.  */
469b725ae77Skettenis   if (strcmp (name, ".note.netbsd.ident") == 0
470b725ae77Skettenis       && check_note (abfd, sect, note, "NetBSD", 4, NT_NETBSD_IDENT))
471b725ae77Skettenis     {
472b725ae77Skettenis       /* There is no need to check the version yet.  */
473b725ae77Skettenis       *osabi = GDB_OSABI_NETBSD_ELF;
474b725ae77Skettenis       return;
475b725ae77Skettenis     }
476b725ae77Skettenis 
477b725ae77Skettenis   /* .note.openbsd.ident notes, used by OpenBSD.  */
478b725ae77Skettenis   if (strcmp (name, ".note.openbsd.ident") == 0
479b725ae77Skettenis       && check_note (abfd, sect, note, "OpenBSD", 4, NT_OPENBSD_IDENT))
480b725ae77Skettenis     {
481b725ae77Skettenis       /* There is no need to check the version yet.  */
482b725ae77Skettenis       *osabi = GDB_OSABI_OPENBSD_ELF;
483b725ae77Skettenis       return;
484b725ae77Skettenis     }
485b725ae77Skettenis 
486b725ae77Skettenis   /* .note.netbsdcore.procinfo notes, used by NetBSD.  */
487b725ae77Skettenis   if (strcmp (name, ".note.netbsdcore.procinfo") == 0)
488b725ae77Skettenis     {
489b725ae77Skettenis       *osabi = GDB_OSABI_NETBSD_ELF;
490b725ae77Skettenis       return;
491b725ae77Skettenis     }
492b725ae77Skettenis }
493b725ae77Skettenis 
494b725ae77Skettenis static enum gdb_osabi
generic_elf_osabi_sniffer(bfd * abfd)495b725ae77Skettenis generic_elf_osabi_sniffer (bfd *abfd)
496b725ae77Skettenis {
497b725ae77Skettenis   unsigned int elfosabi;
498b725ae77Skettenis   enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
499b725ae77Skettenis 
500b725ae77Skettenis   elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
501b725ae77Skettenis 
502b725ae77Skettenis   switch (elfosabi)
503b725ae77Skettenis     {
504b725ae77Skettenis     case ELFOSABI_NONE:
505*00c85667Skettenis       /* When the EI_OSABI field in the ELF header is ELFOSABI_NONE
506*00c85667Skettenis          (0), then the ELF structures in the file are conforming to
507*00c85667Skettenis          the base specification for that machine (there are no
508*00c85667Skettenis          OS-specific extensions).  In order to determine the real OS
509*00c85667Skettenis          in use we must look for OS-specific notes.  */
510b725ae77Skettenis       bfd_map_over_sections (abfd,
511b725ae77Skettenis 			     generic_elf_osabi_sniff_abi_tag_sections,
512b725ae77Skettenis 			     &osabi);
513b725ae77Skettenis       break;
514b725ae77Skettenis 
515b725ae77Skettenis     case ELFOSABI_FREEBSD:
516b725ae77Skettenis       osabi = GDB_OSABI_FREEBSD_ELF;
517b725ae77Skettenis       break;
518b725ae77Skettenis 
519b725ae77Skettenis     case ELFOSABI_NETBSD:
520b725ae77Skettenis       osabi = GDB_OSABI_NETBSD_ELF;
521b725ae77Skettenis       break;
522b725ae77Skettenis 
523b725ae77Skettenis     case ELFOSABI_LINUX:
524b725ae77Skettenis       osabi = GDB_OSABI_LINUX;
525b725ae77Skettenis       break;
526b725ae77Skettenis 
527b725ae77Skettenis     case ELFOSABI_HURD:
528b725ae77Skettenis       osabi = GDB_OSABI_HURD;
529b725ae77Skettenis       break;
530b725ae77Skettenis 
531b725ae77Skettenis     case ELFOSABI_SOLARIS:
532b725ae77Skettenis       osabi = GDB_OSABI_SOLARIS;
533b725ae77Skettenis       break;
534b725ae77Skettenis 
535b725ae77Skettenis     case ELFOSABI_HPUX:
536*00c85667Skettenis       /* For some reason the default value for the EI_OSABI field is
537*00c85667Skettenis          ELFOSABI_HPUX for all PA-RISC targets (with the exception of
538*00c85667Skettenis          GNU/Linux).  We use HP-UX ELF as the default, but let any
539*00c85667Skettenis          OS-specific notes override this.  */
540b725ae77Skettenis       osabi = GDB_OSABI_HPUX_ELF;
541*00c85667Skettenis       bfd_map_over_sections (abfd,
542*00c85667Skettenis 			     generic_elf_osabi_sniff_abi_tag_sections,
543*00c85667Skettenis 			     &osabi);
544b725ae77Skettenis       break;
545b725ae77Skettenis     }
546b725ae77Skettenis 
547b725ae77Skettenis   if (osabi == GDB_OSABI_UNKNOWN)
548b725ae77Skettenis     {
549b725ae77Skettenis       /* The FreeBSD folks have been naughty; they stored the string
550b725ae77Skettenis          "FreeBSD" in the padding of the e_ident field of the ELF
551b725ae77Skettenis          header to "brand" their ELF binaries in FreeBSD 3.x.  */
552b725ae77Skettenis       if (strcmp (&elf_elfheader (abfd)->e_ident[8], "FreeBSD") == 0)
553b725ae77Skettenis 	osabi = GDB_OSABI_FREEBSD_ELF;
554b725ae77Skettenis     }
555b725ae77Skettenis 
556b725ae77Skettenis   return osabi;
557b725ae77Skettenis }
558b725ae77Skettenis 
559b725ae77Skettenis static void
set_osabi(char * args,int from_tty,struct cmd_list_element * c)560b725ae77Skettenis set_osabi (char *args, int from_tty, struct cmd_list_element *c)
561b725ae77Skettenis {
562b725ae77Skettenis   struct gdbarch_info info;
563b725ae77Skettenis 
564b725ae77Skettenis   if (strcmp (set_osabi_string, "auto") == 0)
565b725ae77Skettenis     user_osabi_state = osabi_auto;
566b725ae77Skettenis   else if (strcmp (set_osabi_string, "default") == 0)
567b725ae77Skettenis     {
568b725ae77Skettenis       user_selected_osabi = GDB_OSABI_DEFAULT;
569b725ae77Skettenis       user_osabi_state = osabi_user;
570b725ae77Skettenis     }
571b725ae77Skettenis   else if (strcmp (set_osabi_string, "none") == 0)
572b725ae77Skettenis     {
573b725ae77Skettenis       user_selected_osabi = GDB_OSABI_UNKNOWN;
574b725ae77Skettenis       user_osabi_state = osabi_user;
575b725ae77Skettenis     }
576b725ae77Skettenis   else
577b725ae77Skettenis     {
578b725ae77Skettenis       int i;
579b725ae77Skettenis       for (i = 1; i < GDB_OSABI_INVALID; i++)
580b725ae77Skettenis 	if (strcmp (set_osabi_string, gdbarch_osabi_name (i)) == 0)
581b725ae77Skettenis 	  {
582b725ae77Skettenis 	    user_selected_osabi = i;
583b725ae77Skettenis 	    user_osabi_state = osabi_user;
584b725ae77Skettenis 	    break;
585b725ae77Skettenis 	  }
586b725ae77Skettenis       if (i == GDB_OSABI_INVALID)
587b725ae77Skettenis 	internal_error (__FILE__, __LINE__,
588b725ae77Skettenis 			"Invalid OS ABI \"%s\" passed to command handler.",
589b725ae77Skettenis 			set_osabi_string);
590b725ae77Skettenis     }
591b725ae77Skettenis 
592b725ae77Skettenis   /* NOTE: At some point (true multiple architectures) we'll need to be more
593b725ae77Skettenis      graceful here.  */
594b725ae77Skettenis   gdbarch_info_init (&info);
595b725ae77Skettenis   if (! gdbarch_update_p (info))
596b725ae77Skettenis     internal_error (__FILE__, __LINE__, "Updating OS ABI failed.");
597b725ae77Skettenis }
598b725ae77Skettenis 
599b725ae77Skettenis static void
show_osabi(char * args,int from_tty)600b725ae77Skettenis show_osabi (char *args, int from_tty)
601b725ae77Skettenis {
602b725ae77Skettenis   if (user_osabi_state == osabi_auto)
603b725ae77Skettenis     printf_filtered ("The current OS ABI is \"auto\" (currently \"%s\").\n",
604b725ae77Skettenis 		     gdbarch_osabi_name (gdbarch_osabi (current_gdbarch)));
605b725ae77Skettenis   else
606b725ae77Skettenis     printf_filtered ("The current OS ABI is \"%s\".\n",
607b725ae77Skettenis 		     gdbarch_osabi_name (user_selected_osabi));
608b725ae77Skettenis 
609b725ae77Skettenis   if (GDB_OSABI_DEFAULT != GDB_OSABI_UNKNOWN)
610b725ae77Skettenis     printf_filtered ("The default OS ABI is \"%s\".\n",
611b725ae77Skettenis 		     gdbarch_osabi_name (GDB_OSABI_DEFAULT));
612b725ae77Skettenis }
613b725ae77Skettenis 
614b725ae77Skettenis extern initialize_file_ftype _initialize_gdb_osabi; /* -Wmissing-prototype */
615b725ae77Skettenis 
616b725ae77Skettenis void
_initialize_gdb_osabi(void)617b725ae77Skettenis _initialize_gdb_osabi (void)
618b725ae77Skettenis {
619b725ae77Skettenis   struct cmd_list_element *c;
620b725ae77Skettenis 
621b725ae77Skettenis   if (strcmp (gdb_osabi_names[GDB_OSABI_INVALID], "<invalid>") != 0)
622b725ae77Skettenis     internal_error
623b725ae77Skettenis       (__FILE__, __LINE__,
624b725ae77Skettenis        "_initialize_gdb_osabi: gdb_osabi_names[] is inconsistent");
625b725ae77Skettenis 
626b725ae77Skettenis   /* Register a generic sniffer for ELF flavoured files.  */
627b725ae77Skettenis   gdbarch_register_osabi_sniffer (bfd_arch_unknown,
628b725ae77Skettenis 				  bfd_target_elf_flavour,
629b725ae77Skettenis 				  generic_elf_osabi_sniffer);
630b725ae77Skettenis 
631b725ae77Skettenis   /* Register the "set osabi" command.  */
632b725ae77Skettenis   c = add_set_enum_cmd ("osabi", class_support, gdb_osabi_available_names,
633b725ae77Skettenis 			&set_osabi_string, "Set OS ABI of target.", &setlist);
634b725ae77Skettenis 
635b725ae77Skettenis   set_cmd_sfunc (c, set_osabi);
636b725ae77Skettenis   add_cmd ("osabi", class_support, show_osabi, "Show OS/ABI of target.",
637b725ae77Skettenis 	   &showlist);
638b725ae77Skettenis   user_osabi_state = osabi_auto;
639b725ae77Skettenis }
640