void generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj) { enum gdb_osabi *osabi = obj; const char *name; unsigned int sectsize; char *note; name = bfd_get_section_name (abfd, sect); sectsize = bfd_section_size (abfd, sect); /* Limit the amount of data to read. */ if (sectsize > MAX_NOTESZ) sectsize = MAX_NOTESZ; /* We lazily read the section data here. Since we use BFD_DECOMPRESS, we can't use bfd_get_section_contents on a compressed section. But, since note sections are not compressed, deferring the reading until we recognize the section avoids any error. */ note = alloca (sectsize); /* .note.ABI-tag notes, used by GNU/Linux and FreeBSD. */ if (strcmp (name, ".note.ABI-tag") == 0) { /* GNU. */ if (check_note (abfd, sect, note, §size, "GNU", 16, NT_GNU_ABI_TAG)) { unsigned int abi_tag = bfd_h_get_32 (abfd, note + 16); switch (abi_tag) { case GNU_ABI_TAG_LINUX: *osabi = GDB_OSABI_LINUX; break; case GNU_ABI_TAG_HURD: *osabi = GDB_OSABI_HURD; break; case GNU_ABI_TAG_SOLARIS: *osabi = GDB_OSABI_SOLARIS; break; case GNU_ABI_TAG_FREEBSD: *osabi = GDB_OSABI_FREEBSD_ELF; break; case GNU_ABI_TAG_NETBSD: *osabi = GDB_OSABI_NETBSD_ELF; break; default: internal_error (__FILE__, __LINE__, _("generic_elf_osabi_sniff_abi_tag_sections: " "unknown OS number %d"), abi_tag); } return; } /* FreeBSD. */ if (check_note (abfd, sect, note, §size, "FreeBSD", 4, NT_FREEBSD_ABI_TAG)) { /* There is no need to check the version yet. */ *osabi = GDB_OSABI_FREEBSD_ELF; return; } 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)) { /* There is no need to check the version yet. */ *osabi = GDB_OSABI_NETBSD_ELF; return; } /* .note.openbsd.ident notes, used by OpenBSD. */ if (strcmp (name, ".note.openbsd.ident") == 0 && check_note (abfd, sect, note, §size, "OpenBSD", 4, NT_OPENBSD_IDENT)) { /* There is no need to check the version yet. */ *osabi = GDB_OSABI_OPENBSD_ELF; return; } /* .note.netbsdcore.procinfo notes, used by NetBSD. */ if (strcmp (name, ".note.netbsdcore.procinfo") == 0) { *osabi = GDB_OSABI_NETBSD_ELF; return; } }
void generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj) { enum gdb_osabi *osabi = obj; const char *name; unsigned int sectsize; char *note; name = bfd_get_section_name (abfd, sect); sectsize = bfd_section_size (abfd, sect); /* Limit the amount of data to read. */ if (sectsize > MAX_NOTESZ) sectsize = MAX_NOTESZ; note = alloca (sectsize); bfd_get_section_contents (abfd, sect, note, 0, sectsize); /* .note.ABI-tag notes, used by GNU/Linux and FreeBSD. */ if (strcmp (name, ".note.ABI-tag") == 0) { /* GNU. */ if (check_note (abfd, sect, note, "GNU", 16, NT_GNU_ABI_TAG)) { unsigned int abi_tag = bfd_h_get_32 (abfd, note + 16); switch (abi_tag) { case GNU_ABI_TAG_LINUX: *osabi = GDB_OSABI_LINUX; break; case GNU_ABI_TAG_HURD: *osabi = GDB_OSABI_HURD; break; case GNU_ABI_TAG_SOLARIS: *osabi = GDB_OSABI_SOLARIS; break; case GNU_ABI_TAG_FREEBSD: *osabi = GDB_OSABI_FREEBSD_ELF; break; case GNU_ABI_TAG_NETBSD: *osabi = GDB_OSABI_NETBSD_ELF; break; default: internal_error (__FILE__, __LINE__, _("generic_elf_osabi_sniff_abi_tag_sections: " "unknown OS number %d"), abi_tag); } return; } /* FreeBSD. */ if (check_note (abfd, sect, note, "FreeBSD", 4, NT_FREEBSD_ABI_TAG)) { /* There is no need to check the version yet. */ *osabi = GDB_OSABI_FREEBSD_ELF; return; } /* DragonFly. */ if (check_note (abfd, sect, note, "DragonFly", 4, NT_DRAGONFLY_ABI_TAG)) { /* There is no need to check the version yet. */ *osabi = GDB_OSABI_DRAGONFLY; return; } return; } /* .note.netbsd.ident notes, used by NetBSD. */ if (strcmp (name, ".note.netbsd.ident") == 0 && check_note (abfd, sect, note, "NetBSD", 4, NT_NETBSD_IDENT)) { /* There is no need to check the version yet. */ *osabi = GDB_OSABI_NETBSD_ELF; return; } /* .note.openbsd.ident notes, used by OpenBSD. */ if (strcmp (name, ".note.openbsd.ident") == 0 && check_note (abfd, sect, note, "OpenBSD", 4, NT_OPENBSD_IDENT)) { /* There is no need to check the version yet. */ *osabi = GDB_OSABI_OPENBSD_ELF; return; } /* .note.netbsdcore.procinfo notes, used by NetBSD. */ if (strcmp (name, ".note.netbsdcore.procinfo") == 0) { *osabi = GDB_OSABI_NETBSD_ELF; return; } }