From patchwork Wed Oct 21 14:19:37 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksandar Ristovski X-Patchwork-Id: 9290 Received: (qmail 121660 invoked by alias); 21 Oct 2015 14:19:42 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 120415 invoked by uid 89); 21 Oct 2015 14:19:41 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_SOFTFAIL autolearn=no version=3.3.2 X-HELO: smtp-a01.blackberry.com Received: from smtp-a01.blackberry.com (HELO smtp-a01.blackberry.com) (208.65.78.90) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 21 Oct 2015 14:19:39 +0000 Received: from mhs102cnc.rim.net ([10.65.141.76]) by mhs210cnc-app.rim.net with ESMTP; 21 Oct 2015 10:19:38 -0400 Received: from unknown (HELO [10.222.109.89]) ([10.65.140.253]) by mhs102cnc.rim.net with ESMTP; 21 Oct 2015 14:19:38 +0000 Subject: Re: [PATCH 2/2] [nto] Improve ABI sniffing. To: Pedro Alves , gdb-patches@sourceware.org References: <5621218D.6070801@redhat.com> <1445364649-12175-1-git-send-email-aristovski@qnx.com> <1445364649-12175-3-git-send-email-aristovski@qnx.com> <56275FB2.3050509@redhat.com> <5627944D.3050900@qnx.com> <56279777.5060807@redhat.com> Newsgroups: gmane.comp.gdb.patches From: Aleksandar Ristovski Message-ID: <56279EF9.2020200@qnx.com> Date: Wed, 21 Oct 2015 10:19:37 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: <56279777.5060807@redhat.com> [repeat e-mail to include mailing list] On 15-10-21 09:47 AM, Pedro Alves wrote: > On 10/21/2015 02:34 PM, Aleksandar Ristovski wrote: > >> +static void >> +nto_sniff_abi_note_section (bfd *abfd, asection *sect, void *obj) >> +{ >> + const char *sectname; >> + unsigned int sectsize; >> + /* Buffer holding the section contents. */ >> + char *note; >> + unsigned int namelen; >> + const char *name; >> + >> + sectname = bfd_get_section_name (abfd, sect); >> + sectsize = bfd_section_size (abfd, sect); >> + >> + if (sectsize > 128) >> + sectsize = 128; >> + >> + if (sectname != NULL && strstr (sectname, QNX_INFO_SECT_NAME) != NULL) >> + *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO; >> + >> + if (sectname != NULL && strstr (sectname, "note") != NULL) > > This can be "else if". Ok. > >> + { >> + const unsigned sizeof_Elf_Nhdr = 12; >> + >> + note = XNEWVEC (char, sectsize); >> + bfd_get_section_contents (abfd, sect, note, 0, sectsize); >> + namelen = (unsigned int) bfd_h_get_32 (abfd, note); > > You also need to check that the section's size > is enough to contain 'namelen', _before_ extracting it, otherwise > you may be reading garbage. > Done. > >> + name = note + sizeof_Elf_Nhdr; >> + if (sectsize < namelen + sizeof_Elf_Nhdr > >> + || namelen > sizeof (QNX_NOTE_NAME) + 1) Removed "+ 1" here. >> + { >> + /* Can not be QNX note. */ >> + XDELETEVEC (note); >> + return; > > Thanks, > Pedro Alves > > And compare to exact expected length of the qnx name. + if (namelen == sizeof (QNX_NOTE_NAME) + && 0 == strcmp (name, QNX_NOTE_NAME)) Attached the latest version. Thanks, Aleksandar Ristovski From 5b3605345909dccecaeded1c48a1844ec192fa0d Mon Sep 17 00:00:00 2001 From: Aleksandar Ristovski Date: Wed, 21 Oct 2015 09:29:54 -0400 Subject: [PATCH 2/2] [nto] Improve ABI sniffing. Use qnx specific notes to figure out the OS. gdb/ChangeLog: * gdb/nto-tdep.c (QNX_NOTE_NAME, QNX_INFO_SECT_NAME): New defines. (nto_sniff_abi_note_section): New function. (nto_elf_osabi_sniffer): Use new function to recognize nto specific binary. --- gdb/nto-tdep.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/gdb/nto-tdep.c b/gdb/nto-tdep.c index e50d302..cc3e94e 100644 --- a/gdb/nto-tdep.c +++ b/gdb/nto-tdep.c @@ -32,6 +32,9 @@ #include "gdbcore.h" #include "objfiles.h" +#define QNX_NOTE_NAME "QNX" +#define QNX_INFO_SECT_NAME "QNX_info" + #ifdef __CYGWIN__ #include #endif @@ -332,12 +335,58 @@ nto_dummy_supply_regset (struct regcache *regcache, char *regs) /* Do nothing. */ } +static void +nto_sniff_abi_note_section (bfd *abfd, asection *sect, void *obj) +{ + const char *sectname; + unsigned int sectsize; + /* Buffer holding the section contents. */ + char *note; + unsigned int namelen; + const char *name; + const unsigned sizeof_Elf_Nhdr = 12; + + sectname = bfd_get_section_name (abfd, sect); + sectsize = bfd_section_size (abfd, sect); + + if (sectsize > 128) + sectsize = 128; + + if (sectname != NULL && strstr (sectname, QNX_INFO_SECT_NAME) != NULL) + *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO; + else if (sectname != NULL && strstr (sectname, "note") != NULL + && sectsize > sizeof_Elf_Nhdr) + { + note = XNEWVEC (char, sectsize); + bfd_get_section_contents (abfd, sect, note, 0, sectsize); + namelen = (unsigned int) bfd_h_get_32 (abfd, note); + name = note + sizeof_Elf_Nhdr; + if (sectsize < namelen + sizeof_Elf_Nhdr + || namelen > sizeof (QNX_NOTE_NAME)) + { + /* Can not be QNX note. */ + XDELETEVEC (note); + return; + } + + if (namelen == sizeof (QNX_NOTE_NAME) + && 0 == strcmp (name, QNX_NOTE_NAME)) + *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO; + + XDELETEVEC (note); + } +} + enum gdb_osabi nto_elf_osabi_sniffer (bfd *abfd) { - if (nto_is_nto_target) - return nto_is_nto_target (abfd); - return GDB_OSABI_UNKNOWN; + enum gdb_osabi osabi = GDB_OSABI_UNKNOWN; + + bfd_map_over_sections (abfd, + nto_sniff_abi_note_section, + &osabi); + + return osabi; } static const char *nto_thread_state_str[] = -- 1.9.1