PR gdb/18464: Do not crash on unrecognized GNU .note.ABI-tag values
Diagnosis of unexpected input (in this case, in an executable file) should not crash as if it were a bug in GDB. gdb/ PR gdb/18464 * osabi.c (generic_elf_osabi_sniff_abi_tag_sections): Use warning rather than internal_error for an unrecognized value.
This commit is contained in:
parent
14ae95f220
commit
c8f6c93cb2
@ -1,3 +1,9 @@
|
||||
2015-05-29 Roland McGrath <mcgrathr@google.com>
|
||||
|
||||
PR gdb/18464
|
||||
* osabi.c (generic_elf_osabi_sniff_abi_tag_sections): Use warning
|
||||
rather than internal_error for an unrecognized value.
|
||||
|
||||
2015-05-29 Max Filippov <jcmvbkbc@gmail.com>
|
||||
|
||||
* xtensa-tdep.c (xtensa_pseudo_register_read)
|
||||
@ -646,7 +652,7 @@
|
||||
linux_enable_event_reporting.
|
||||
(_initialize_linux_nat): Delete call to
|
||||
linux_ptrace_set_additional_flags.
|
||||
* nat/linux-ptrace.c (current_ptrace_options): Rename to
|
||||
* nat/linux-ptrace.c (current_ptrace_options): Rename to
|
||||
supported_ptrace_options.
|
||||
(additional_flags): Delete variable.
|
||||
(linux_check_ptrace_features): Use supported_ptrace_options.
|
||||
@ -654,7 +660,7 @@
|
||||
Likewise, and remove additional_flags check.
|
||||
(linux_enable_event_reporting): Change 'attached' argument to
|
||||
'options'. Use supported_ptrace_options.
|
||||
(ptrace_supports_feature): Change comment. Use
|
||||
(ptrace_supports_feature): Change comment. Use
|
||||
supported_ptrace_options.
|
||||
(linux_ptrace_set_additional_flags): Delete function.
|
||||
* nat/linux-ptrace.h (linux_ptrace_set_additional_flags):
|
||||
|
82
gdb/osabi.c
82
gdb/osabi.c
@ -134,7 +134,7 @@ osabi_from_tdesc_string (const char *name)
|
||||
|
||||
/* Handler for a given architecture/OS ABI pair. There should be only
|
||||
one handler for a given OS ABI each architecture family. */
|
||||
struct gdb_osabi_handler
|
||||
struct gdb_osabi_handler
|
||||
{
|
||||
struct gdb_osabi_handler *next;
|
||||
const struct bfd_arch_info *arch_info;
|
||||
@ -147,7 +147,7 @@ static struct gdb_osabi_handler *gdb_osabi_handler_list;
|
||||
void
|
||||
gdbarch_register_osabi (enum bfd_architecture arch, unsigned long machine,
|
||||
enum gdb_osabi osabi,
|
||||
void (*init_osabi)(struct gdbarch_info,
|
||||
void (*init_osabi)(struct gdbarch_info,
|
||||
struct gdbarch *))
|
||||
{
|
||||
struct gdb_osabi_handler **handler_p;
|
||||
@ -160,7 +160,7 @@ gdbarch_register_osabi (enum bfd_architecture arch, unsigned long machine,
|
||||
internal_error
|
||||
(__FILE__, __LINE__,
|
||||
_("gdbarch_register_osabi: An attempt to register a handler for "
|
||||
"OS ABI \"%s\" for architecture %s was made. The handler will "
|
||||
"OS ABI \"%s\" for architecture %s was made. The handler will "
|
||||
"not be registered"),
|
||||
gdbarch_osabi_name (osabi),
|
||||
bfd_printable_arch_mach (arch, machine));
|
||||
@ -223,7 +223,7 @@ static struct gdb_osabi_sniffer *gdb_osabi_sniffer_list;
|
||||
|
||||
void
|
||||
gdbarch_register_osabi_sniffer (enum bfd_architecture arch,
|
||||
enum bfd_flavour flavour,
|
||||
enum bfd_flavour flavour,
|
||||
enum gdb_osabi (*sniffer_fn)(bfd *))
|
||||
{
|
||||
struct gdb_osabi_sniffer *sniffer;
|
||||
@ -253,7 +253,7 @@ gdbarch_lookup_osabi (bfd *abfd)
|
||||
/* If we don't have a binary, just return unknown. The caller may
|
||||
have other sources the OSABI can be extracted from, e.g., the
|
||||
target description. */
|
||||
if (abfd == NULL)
|
||||
if (abfd == NULL)
|
||||
return GDB_OSABI_UNKNOWN;
|
||||
|
||||
match = GDB_OSABI_UNKNOWN;
|
||||
@ -289,15 +289,15 @@ gdbarch_lookup_osabi (bfd *abfd)
|
||||
|| (!match_specific && sniffer->arch == bfd_arch_unknown))
|
||||
{
|
||||
internal_error
|
||||
(__FILE__, __LINE__,
|
||||
_("gdbarch_lookup_osabi: multiple %sspecific OS ABI "
|
||||
(__FILE__, __LINE__,
|
||||
_("gdbarch_lookup_osabi: multiple %sspecific OS ABI "
|
||||
"match for architecture %s flavour %d: first "
|
||||
"match \"%s\", second match \"%s\""),
|
||||
match_specific ? "" : "non-",
|
||||
bfd_printable_arch_mach (bfd_get_arch (abfd), 0),
|
||||
(int) bfd_get_flavour (abfd),
|
||||
gdbarch_osabi_name (match),
|
||||
gdbarch_osabi_name (osabi));
|
||||
bfd_printable_arch_mach (bfd_get_arch (abfd), 0),
|
||||
(int) bfd_get_flavour (abfd),
|
||||
gdbarch_osabi_name (match),
|
||||
gdbarch_osabi_name (osabi));
|
||||
}
|
||||
else if (sniffer->arch != bfd_arch_unknown)
|
||||
{
|
||||
@ -345,7 +345,7 @@ gdbarch_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
if (info.osabi == GDB_OSABI_UNKNOWN)
|
||||
{
|
||||
/* Don't complain about an unknown OSABI. Assume the user knows
|
||||
what they are doing. */
|
||||
what they are doing. */
|
||||
return;
|
||||
}
|
||||
|
||||
@ -356,25 +356,25 @@ gdbarch_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
continue;
|
||||
|
||||
/* If the architecture described by ARCH_INFO can run code for
|
||||
the architcture we registered the handler for, then the
|
||||
handler is applicable. Note, though, that if the handler is
|
||||
for an architecture that is a superset of ARCH_INFO, we can't
|
||||
use that --- it would be perfectly correct for it to install
|
||||
gdbarch methods that refer to registers / instructions /
|
||||
other facilities ARCH_INFO doesn't have.
|
||||
the architcture we registered the handler for, then the
|
||||
handler is applicable. Note, though, that if the handler is
|
||||
for an architecture that is a superset of ARCH_INFO, we can't
|
||||
use that --- it would be perfectly correct for it to install
|
||||
gdbarch methods that refer to registers / instructions /
|
||||
other facilities ARCH_INFO doesn't have.
|
||||
|
||||
NOTE: kettenis/20021027: There may be more than one machine
|
||||
NOTE: kettenis/20021027: There may be more than one machine
|
||||
type that is compatible with the desired machine type. Right
|
||||
now we simply return the first match, which is fine for now.
|
||||
However, we might want to do something smarter in the future. */
|
||||
/* NOTE: cagney/2003-10-23: The code for "a can_run_code_for b"
|
||||
is implemented using BFD's compatible method (a->compatible
|
||||
(b) == a -- the lowest common denominator between a and b is
|
||||
a). That method's definition of compatible may not be as you
|
||||
expect. For instance the test "amd64 can run code for i386"
|
||||
(or more generally "64-bit ISA can run code for the 32-bit
|
||||
ISA"). BFD doesn't normally consider 32-bit and 64-bit
|
||||
"compatible" so it doesn't succeed. */
|
||||
is implemented using BFD's compatible method (a->compatible
|
||||
(b) == a -- the lowest common denominator between a and b is
|
||||
a). That method's definition of compatible may not be as you
|
||||
expect. For instance the test "amd64 can run code for i386"
|
||||
(or more generally "64-bit ISA can run code for the 32-bit
|
||||
ISA"). BFD doesn't normally consider 32-bit and 64-bit
|
||||
"compatible" so it doesn't succeed. */
|
||||
if (can_run_code_for (info.bfd_arch_info, handler->arch_info))
|
||||
{
|
||||
(*handler->init_osabi) (info, gdbarch);
|
||||
@ -493,10 +493,8 @@ generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
|
||||
break;
|
||||
|
||||
default:
|
||||
internal_error (__FILE__, __LINE__,
|
||||
_("generic_elf_osabi_sniff_abi_tag_sections: "
|
||||
"unknown OS number %d"),
|
||||
abi_tag);
|
||||
warning (_("GNU ABI tag value %u unrecognized."), abi_tag);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -512,7 +510,7 @@ generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* .note.netbsd.ident notes, used by NetBSD. */
|
||||
if (strcmp (name, ".note.netbsd.ident") == 0
|
||||
&& check_note (abfd, sect, note, §size, "NetBSD", 4, NT_NETBSD_IDENT))
|
||||
@ -553,13 +551,13 @@ generic_elf_osabi_sniffer (bfd *abfd)
|
||||
case ELFOSABI_NONE:
|
||||
case ELFOSABI_GNU:
|
||||
/* When the EI_OSABI field in the ELF header is ELFOSABI_NONE
|
||||
(0), then the ELF structures in the file are conforming to
|
||||
the base specification for that machine (there are no
|
||||
OS-specific extensions). In order to determine the real OS
|
||||
in use, we must look for OS-specific notes.
|
||||
(0), then the ELF structures in the file are conforming to
|
||||
the base specification for that machine (there are no
|
||||
OS-specific extensions). In order to determine the real OS
|
||||
in use, we must look for OS-specific notes.
|
||||
|
||||
The same applies for ELFOSABI_GNU: this can mean GNU/Hurd,
|
||||
GNU/Linux, and possibly more. */
|
||||
The same applies for ELFOSABI_GNU: this can mean GNU/Hurd,
|
||||
GNU/Linux, and possibly more. */
|
||||
bfd_map_over_sections (abfd,
|
||||
generic_elf_osabi_sniff_abi_tag_sections,
|
||||
&osabi);
|
||||
@ -579,9 +577,9 @@ generic_elf_osabi_sniffer (bfd *abfd)
|
||||
|
||||
case ELFOSABI_HPUX:
|
||||
/* For some reason the default value for the EI_OSABI field is
|
||||
ELFOSABI_HPUX for all PA-RISC targets (with the exception of
|
||||
GNU/Linux). We use HP-UX ELF as the default, but let any
|
||||
OS-specific notes override this. */
|
||||
ELFOSABI_HPUX for all PA-RISC targets (with the exception of
|
||||
GNU/Linux). We use HP-UX ELF as the default, but let any
|
||||
OS-specific notes override this. */
|
||||
osabi = GDB_OSABI_HPUX_ELF;
|
||||
bfd_map_over_sections (abfd,
|
||||
generic_elf_osabi_sniff_abi_tag_sections,
|
||||
@ -596,8 +594,8 @@ generic_elf_osabi_sniffer (bfd *abfd)
|
||||
if (osabi == GDB_OSABI_UNKNOWN)
|
||||
{
|
||||
/* The FreeBSD folks have been naughty; they stored the string
|
||||
"FreeBSD" in the padding of the e_ident field of the ELF
|
||||
header to "brand" their ELF binaries in FreeBSD 3.x. */
|
||||
"FreeBSD" in the padding of the e_ident field of the ELF
|
||||
header to "brand" their ELF binaries in FreeBSD 3.x. */
|
||||
if (memcmp (&elf_elfheader (abfd)->e_ident[8],
|
||||
"FreeBSD", sizeof ("FreeBSD")) == 0)
|
||||
osabi = GDB_OSABI_FREEBSD_ELF;
|
||||
|
Loading…
x
Reference in New Issue
Block a user