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