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