1 /* OS ABI variant handling for GDB.
3 Copyright (C) 2001-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
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
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
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.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 #include "arch-utils.h"
23 #include "cli/cli-cmds.h"
30 #ifndef GDB_OSABI_DEFAULT
31 #define GDB_OSABI_DEFAULT GDB_OSABI_UNKNOWN
34 /* State for the "set osabi" command. */
35 static enum { osabi_auto
, osabi_default
, osabi_user
} user_osabi_state
;
36 static enum gdb_osabi user_selected_osabi
;
37 static const char *gdb_osabi_available_names
[GDB_OSABI_INVALID
+ 3] = {
43 static const char *set_osabi_string
;
45 /* Handler for a given architecture/OS ABI pair. There should be only
46 one handler for a given OS ABI each architecture family. */
47 struct gdb_osabi_handler
49 struct gdb_osabi_handler
*next
;
50 const struct bfd_arch_info
*arch_info
;
52 void (*init_osabi
)(struct gdbarch_info
, struct gdbarch
*);
55 static struct gdb_osabi_handler
*gdb_osabi_handler_list
;
58 gdbarch_register_osabi (enum bfd_architecture arch
, unsigned long machine
,
60 void (*init_osabi
)(struct gdbarch_info
,
63 struct gdb_osabi_handler
**handler_p
;
64 const struct bfd_arch_info
*arch_info
= bfd_lookup_arch (arch
, machine
);
65 const char **name_ptr
;
67 /* Registering an OS ABI handler for "unknown" is not allowed. */
68 if (osabi
== GDB_OSABI_UNKNOWN
)
71 (_("gdbarch_register_osabi: An attempt to register a handler for "
72 "OS ABI \"%s\" for architecture %s was made. The handler will "
74 gdbarch_osabi_name (osabi
),
75 bfd_printable_arch_mach (arch
, machine
));
79 gdb_assert (arch_info
);
81 for (handler_p
= &gdb_osabi_handler_list
; *handler_p
!= NULL
;
82 handler_p
= &(*handler_p
)->next
)
84 if ((*handler_p
)->arch_info
== arch_info
85 && (*handler_p
)->osabi
== osabi
)
88 (_("gdbarch_register_osabi: A handler for OS ABI \"%s\" "
89 "has already been registered for architecture %s"),
90 gdbarch_osabi_name (osabi
),
91 arch_info
->printable_name
);
92 /* If user wants to continue, override previous definition. */
93 (*handler_p
)->init_osabi
= init_osabi
;
98 (*handler_p
) = XNEW (struct gdb_osabi_handler
);
99 (*handler_p
)->next
= NULL
;
100 (*handler_p
)->arch_info
= arch_info
;
101 (*handler_p
)->osabi
= osabi
;
102 (*handler_p
)->init_osabi
= init_osabi
;
104 /* Add this OS ABI to the list of enum values for "set osabi", if it isn't
106 for (name_ptr
= gdb_osabi_available_names
; *name_ptr
; name_ptr
++)
108 if (*name_ptr
== gdbarch_osabi_name (osabi
))
111 *name_ptr
++ = gdbarch_osabi_name (osabi
);
116 /* Sniffer to find the OS ABI for a given file's architecture and flavour.
117 It is legal to have multiple sniffers for each arch/flavour pair, to
118 disambiguate one OS's a.out from another, for example. The first sniffer
119 to return something other than GDB_OSABI_UNKNOWN wins, so a sniffer should
120 be careful to claim a file only if it knows for sure what it is. */
121 struct gdb_osabi_sniffer
123 struct gdb_osabi_sniffer
*next
;
124 enum bfd_architecture arch
; /* bfd_arch_unknown == wildcard */
125 enum bfd_flavour flavour
;
126 enum gdb_osabi (*sniffer
)(bfd
*);
129 static struct gdb_osabi_sniffer
*gdb_osabi_sniffer_list
;
132 gdbarch_register_osabi_sniffer (enum bfd_architecture arch
,
133 enum bfd_flavour flavour
,
134 enum gdb_osabi (*sniffer_fn
)(bfd
*))
136 struct gdb_osabi_sniffer
*sniffer
;
138 sniffer
= XNEW (struct gdb_osabi_sniffer
);
139 sniffer
->arch
= arch
;
140 sniffer
->flavour
= flavour
;
141 sniffer
->sniffer
= sniffer_fn
;
143 sniffer
->next
= gdb_osabi_sniffer_list
;
144 gdb_osabi_sniffer_list
= sniffer
;
149 gdbarch_lookup_osabi (bfd
*abfd
)
151 struct gdb_osabi_sniffer
*sniffer
;
152 enum gdb_osabi osabi
, match
;
155 /* If we aren't in "auto" mode, return the specified OS ABI. */
156 if (user_osabi_state
== osabi_user
)
157 return user_selected_osabi
;
159 /* If we don't have a binary, just return unknown. The caller may
160 have other sources the OSABI can be extracted from, e.g., the
161 target description. */
163 return GDB_OSABI_UNKNOWN
;
165 match
= GDB_OSABI_UNKNOWN
;
168 for (sniffer
= gdb_osabi_sniffer_list
; sniffer
!= NULL
;
169 sniffer
= sniffer
->next
)
171 if ((sniffer
->arch
== bfd_arch_unknown
/* wildcard */
172 || sniffer
->arch
== bfd_get_arch (abfd
))
173 && sniffer
->flavour
== bfd_get_flavour (abfd
))
175 osabi
= (*sniffer
->sniffer
) (abfd
);
176 if (osabi
< GDB_OSABI_UNKNOWN
|| osabi
>= GDB_OSABI_INVALID
)
179 (_("gdbarch_lookup_osabi: invalid OS ABI (%d) from sniffer "
180 "for architecture %s flavour %d"),
182 bfd_printable_arch_mach (bfd_get_arch (abfd
), 0),
183 (int) bfd_get_flavour (abfd
));
185 else if (osabi
!= GDB_OSABI_UNKNOWN
)
187 /* A specific sniffer always overrides a generic sniffer.
188 Croak on multiple match if the two matches are of the
189 same class. If the user wishes to continue, we'll use
191 if (match
!= GDB_OSABI_UNKNOWN
)
193 if ((match_specific
&& sniffer
->arch
!= bfd_arch_unknown
)
194 || (!match_specific
&& sniffer
->arch
== bfd_arch_unknown
))
197 (_("gdbarch_lookup_osabi: multiple %sspecific OS ABI "
198 "match for architecture %s flavour %d: first "
199 "match \"%s\", second match \"%s\""),
200 match_specific
? "" : "non-",
201 bfd_printable_arch_mach (bfd_get_arch (abfd
), 0),
202 (int) bfd_get_flavour (abfd
),
203 gdbarch_osabi_name (match
),
204 gdbarch_osabi_name (osabi
));
206 else if (sniffer
->arch
!= bfd_arch_unknown
)
215 if (sniffer
->arch
!= bfd_arch_unknown
)
226 /* Return non-zero if architecture A can run code written for
229 can_run_code_for (const struct bfd_arch_info
*a
, const struct bfd_arch_info
*b
)
231 /* BFD's 'A->compatible (A, B)' functions return zero if A and B are
232 incompatible. But if they are compatible, it returns the 'more
233 featureful' of the two arches. That is, if A can run code
234 written for B, but B can't run code written for A, then it'll
237 struct bfd_arch_info objects are singletons: that is, there's
238 supposed to be exactly one instance for a given machine. So you
239 can tell whether two are equivalent by comparing pointers. */
240 return (a
== b
|| a
->compatible (a
, b
) == a
);
243 /* Return OS ABI handler for INFO. */
245 static struct gdb_osabi_handler
*
246 gdbarch_osabi_handler (struct gdbarch_info info
)
248 struct gdb_osabi_handler
*handler
;
250 gdb_assert (info
.osabi
!= GDB_OSABI_UNKNOWN
);
252 for (handler
= gdb_osabi_handler_list
; handler
!= NULL
;
253 handler
= handler
->next
)
255 if (handler
->osabi
!= info
.osabi
)
258 /* If the architecture described by ARCH_INFO can run code for
259 the architecture we registered the handler for, then the
260 handler is applicable. Note, though, that if the handler is
261 for an architecture that is a superset of ARCH_INFO, we can't
262 use that --- it would be perfectly correct for it to install
263 gdbarch methods that refer to registers / instructions /
264 other facilities ARCH_INFO doesn't have.
266 NOTE: kettenis/20021027: There may be more than one machine
267 type that is compatible with the desired machine type. Right
268 now we simply return the first match, which is fine for now.
269 However, we might want to do something smarter in the future. */
270 /* NOTE: cagney/2003-10-23: The code for "a can_run_code_for b"
271 is implemented using BFD's compatible method (a->compatible
272 (b) == a -- the lowest common denominator between a and b is
273 a). That method's definition of compatible may not be as you
274 expect. For instance the test "amd64 can run code for i386"
275 (or more generally "64-bit ISA can run code for the 32-bit
276 ISA"). BFD doesn't normally consider 32-bit and 64-bit
277 "compatible" so it doesn't succeed. */
278 if (can_run_code_for (info
.bfd_arch_info
, handler
->arch_info
))
288 has_gdb_osabi_handler (struct gdbarch_info info
)
290 return gdbarch_osabi_handler (info
) != nullptr;
294 gdbarch_init_osabi (struct gdbarch_info info
, struct gdbarch
*gdbarch
)
296 struct gdb_osabi_handler
*handler
;
298 gdb_assert (info
.osabi
!= GDB_OSABI_UNKNOWN
);
299 handler
= gdbarch_osabi_handler (info
);
301 if (handler
!= nullptr)
303 (*handler
->init_osabi
) (info
, gdbarch
);
307 if (info
.osabi
== GDB_OSABI_NONE
)
309 /* Don't complain about no OSABI. Assume the user knows
310 what they are doing. */
315 ("A handler for the OS ABI \"%s\" is not built into this configuration\n"
316 "of GDB. Attempting to continue with the default %s settings.\n",
317 gdbarch_osabi_name (info
.osabi
),
318 info
.bfd_arch_info
->printable_name
);
321 /* Limit on the amount of data to be read. */
322 #define MAX_NOTESZ 128
324 /* Return non-zero if NOTE matches NAME, DESCSZ and TYPE. If
325 *SECTSIZE is non-zero, then this reads that many bytes from
326 the start of the section and clears *SECTSIZE. */
329 check_note (bfd
*abfd
, asection
*sect
, char *note
, unsigned int *sectsize
,
330 const char *name
, unsigned long descsz
, unsigned long type
)
332 unsigned long notesz
;
336 if (!bfd_get_section_contents (abfd
, sect
, note
, 0, *sectsize
))
341 /* Calculate the size of this note. */
342 notesz
= strlen (name
) + 1;
343 notesz
= ((notesz
+ 3) & ~3);
345 notesz
= ((notesz
+ 3) & ~3);
347 /* If this assertion triggers, increase MAX_NOTESZ. */
348 gdb_assert (notesz
<= MAX_NOTESZ
);
350 /* Check whether SECT is big enough to contain the complete note. */
351 if (notesz
> bfd_section_size (sect
))
354 /* Check the note name. */
355 if (bfd_h_get_32 (abfd
, note
) != (strlen (name
) + 1)
356 || strcmp (note
+ 12, name
) != 0)
359 /* Check the descriptor size. */
360 if (bfd_h_get_32 (abfd
, note
+ 4) != descsz
)
363 /* Check the note type. */
364 if (bfd_h_get_32 (abfd
, note
+ 8) != type
)
370 /* Generic sniffer for ELF flavoured files. */
373 generic_elf_osabi_sniff_abi_tag_sections (bfd
*abfd
, asection
*sect
,
374 enum gdb_osabi
*osabi
)
377 unsigned int sectsize
;
379 name
= bfd_section_name (sect
);
380 sectsize
= bfd_section_size (sect
);
382 /* Limit the amount of data to read. */
383 if (sectsize
> MAX_NOTESZ
)
384 sectsize
= MAX_NOTESZ
;
386 /* We lazily read the section data here. Since we use
387 BFD_DECOMPRESS, we can't use bfd_get_section_contents on a
388 compressed section. But, since note sections are not compressed,
389 deferring the reading until we recognize the section avoids any
391 char note
[MAX_NOTESZ
];
393 /* .note.ABI-tag notes, used by GNU/Linux and FreeBSD. */
394 if (strcmp (name
, ".note.ABI-tag") == 0)
397 if (check_note (abfd
, sect
, note
, §size
, "GNU", 16, NT_GNU_ABI_TAG
))
399 unsigned int abi_tag
= bfd_h_get_32 (abfd
, note
+ 16);
403 case GNU_ABI_TAG_LINUX
:
404 *osabi
= GDB_OSABI_LINUX
;
407 case GNU_ABI_TAG_HURD
:
408 *osabi
= GDB_OSABI_HURD
;
411 case GNU_ABI_TAG_SOLARIS
:
412 *osabi
= GDB_OSABI_SOLARIS
;
415 case GNU_ABI_TAG_FREEBSD
:
416 *osabi
= GDB_OSABI_FREEBSD
;
419 case GNU_ABI_TAG_NETBSD
:
420 *osabi
= GDB_OSABI_NETBSD
;
424 warning (_("GNU ABI tag value %u unrecognized."), abi_tag
);
431 if (check_note (abfd
, sect
, note
, §size
, "FreeBSD", 4,
434 /* There is no need to check the version yet. */
435 *osabi
= GDB_OSABI_FREEBSD
;
442 /* .note.netbsd.ident notes, used by NetBSD. */
443 if (strcmp (name
, ".note.netbsd.ident") == 0
444 && check_note (abfd
, sect
, note
, §size
, "NetBSD", 4, NT_NETBSD_IDENT
))
446 /* There is no need to check the version yet. */
447 *osabi
= GDB_OSABI_NETBSD
;
451 /* .note.openbsd.ident notes, used by OpenBSD. */
452 if (strcmp (name
, ".note.openbsd.ident") == 0
453 && check_note (abfd
, sect
, note
, §size
, "OpenBSD", 4,
456 /* There is no need to check the version yet. */
457 *osabi
= GDB_OSABI_OPENBSD
;
461 /* .note.netbsdcore.procinfo notes, used by NetBSD. */
462 if (strcmp (name
, ".note.netbsdcore.procinfo") == 0)
464 *osabi
= GDB_OSABI_NETBSD
;
469 static enum gdb_osabi
470 generic_elf_osabi_sniffer (bfd
*abfd
)
472 unsigned int elfosabi
;
473 enum gdb_osabi osabi
= GDB_OSABI_UNKNOWN
;
475 elfosabi
= elf_elfheader (abfd
)->e_ident
[EI_OSABI
];
482 /* When the EI_OSABI field in the ELF header is ELFOSABI_NONE
483 (0), then the ELF structures in the file are conforming to
484 the base specification for that machine (there are no
485 OS-specific extensions). In order to determine the real OS
486 in use, we must look for OS-specific notes.
488 The same applies for ELFOSABI_GNU: this can mean GNU/Hurd,
489 GNU/Linux, and possibly more. */
491 /* And likewise ELFOSABI_HPUX. For some reason the default
492 value for the EI_OSABI field is ELFOSABI_HPUX for all PA-RISC
493 targets (with the exception of GNU/Linux). */
494 for (asection
*sect
: gdb_bfd_sections (abfd
))
495 generic_elf_osabi_sniff_abi_tag_sections (abfd
, sect
, &osabi
);
498 case ELFOSABI_FREEBSD
:
499 osabi
= GDB_OSABI_FREEBSD
;
502 case ELFOSABI_NETBSD
:
503 osabi
= GDB_OSABI_NETBSD
;
506 case ELFOSABI_SOLARIS
:
507 osabi
= GDB_OSABI_SOLARIS
;
510 case ELFOSABI_OPENVMS
:
511 osabi
= GDB_OSABI_OPENVMS
;
515 if (osabi
== GDB_OSABI_UNKNOWN
)
517 /* The FreeBSD folks have been naughty; they stored the string
518 "FreeBSD" in the padding of the e_ident field of the ELF
519 header to "brand" their ELF binaries in FreeBSD 3.x. */
520 if (memcmp (&elf_elfheader (abfd
)->e_ident
[8],
521 "FreeBSD", sizeof ("FreeBSD")) == 0)
522 osabi
= GDB_OSABI_FREEBSD
;
531 gdbarch_osabi_enum_name (enum gdb_osabi osabi
)
535 #define GDB_OSABI_DEF_FIRST(Enum, Name, Regex) \
536 case GDB_OSABI_ ## Enum: \
537 return "GDB_OSABI_" #Enum;
539 #define GDB_OSABI_DEF(Enum, Name, Regex) \
540 case GDB_OSABI_ ## Enum: \
541 return "GDB_OSABI_" #Enum;
543 #define GDB_OSABI_DEF_LAST(Enum, Name, Regex) \
544 case GDB_OSABI_ ## Enum: \
545 return "GDB_OSABI_" #Enum;
547 #include "gdbsupport/osabi.def"
549 #undef GDB_OSABI_DEF_LAST
551 #undef GDB_OSABI_DEF_FIRST
554 gdb_assert_not_reached ();
558 set_osabi (const char *args
, int from_tty
, struct cmd_list_element
*c
)
560 if (strcmp (set_osabi_string
, "auto") == 0)
561 user_osabi_state
= osabi_auto
;
562 else if (strcmp (set_osabi_string
, "default") == 0)
564 user_selected_osabi
= GDB_OSABI_DEFAULT
;
565 user_osabi_state
= osabi_user
;
571 for (i
= 1; i
< GDB_OSABI_INVALID
; i
++)
573 enum gdb_osabi osabi
= (enum gdb_osabi
) i
;
575 if (strcmp (set_osabi_string
, gdbarch_osabi_name (osabi
)) == 0)
577 user_selected_osabi
= osabi
;
578 user_osabi_state
= osabi_user
;
582 if (i
== GDB_OSABI_INVALID
)
583 internal_error (_("Invalid OS ABI \"%s\" passed to command handler."),
587 /* NOTE: At some point (true multiple architectures) we'll need to be more
590 if (!gdbarch_update_p (current_inferior (), info
))
591 internal_error (_("Updating OS ABI failed."));
595 show_osabi (struct ui_file
*file
, int from_tty
, struct cmd_list_element
*c
,
598 if (user_osabi_state
== osabi_auto
)
600 _("The current OS ABI is \"auto\" "
601 "(currently \"%s\").\n"),
602 gdbarch_osabi_name (gdbarch_osabi (get_current_arch ())));
604 gdb_printf (file
, _("The current OS ABI is \"%s\".\n"),
605 gdbarch_osabi_name (user_selected_osabi
));
607 if (GDB_OSABI_DEFAULT
!= GDB_OSABI_UNKNOWN
)
608 gdb_printf (file
, _("The default OS ABI is \"%s\".\n"),
609 gdbarch_osabi_name (GDB_OSABI_DEFAULT
));
612 void _initialize_gdb_osabi ();
614 _initialize_gdb_osabi ()
616 /* Register a generic sniffer for ELF flavoured files. */
617 gdbarch_register_osabi_sniffer (bfd_arch_unknown
,
618 bfd_target_elf_flavour
,
619 generic_elf_osabi_sniffer
);
621 /* Register the "set osabi" command. */
622 user_osabi_state
= osabi_auto
;
623 set_osabi_string
= gdb_osabi_available_names
[0];
624 gdb_assert (strcmp (set_osabi_string
, "auto") == 0);
625 add_setshow_enum_cmd ("osabi", class_support
, gdb_osabi_available_names
,
627 _("Set OS ABI of target."),
628 _("Show OS ABI of target."),
629 NULL
, set_osabi
, show_osabi
,
630 &setlist
, &showlist
);