OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [gdb/] [osabi.c] - Blame information for rev 841

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.