From patchwork Wed Oct 21 13:34:05 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksandar Ristovski X-Patchwork-Id: 9288 Received: (qmail 42119 invoked by alias); 21 Oct 2015 13:34:13 -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 41721 invoked by uid 89); 21 Oct 2015 13:34:12 -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 13:34:08 +0000 Received: from mhs101cnc.rim.net ([10.65.141.79]) by mhs211cnc-app.rim.net with ESMTP; 21 Oct 2015 09:34:06 -0400 Received: from unknown (HELO [10.222.109.89]) ([10.65.140.254]) by mhs101cnc.rim.net with ESMTP; 21 Oct 2015 13:34:06 +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> Newsgroups: gmane.comp.gdb.patches From: Aleksandar Ristovski Message-ID: <5627944D.3050900@qnx.com> Date: Wed, 21 Oct 2015 09:34:05 -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: <56275FB2.3050509@redhat.com> On 15-10-21 05:49 AM, Pedro Alves wrote: ... >> + char *note; // buffer holding the section contents > > Please use /**/ format for comments, and write full sentences - start > with uppercase, period at end. Usually that leads to putting the comment > above, e.g.: > > + /* Buffer holding the section contents. */ > + char *note; Done. > >> + unsigned int namelen; >> + const char *name; >> + >> + sectname = bfd_get_section_name (abfd, sect); >> + sectsize = bfd_section_size (abfd, sect); >> + >> + /* TODO: limit the note size here, for now limit is 128 bytes >> + (enough to check the name and type). */ > > This reads like limiting is left to do, but then it does > implement a limit. So this TODO comment is confusing. Comment removed. > > You should also make sure the section is the at least > the minimum size you expect though. Done. ... >> + { >> + note = alloca (sectsize); > > For C++, write: > > note = (char *) alloca (sectsize); Used XNEWVEC/XDELETEVEC instead. > > >> + bfd_get_section_contents (abfd, sect, note, 0, sectsize); >> + namelen = (unsigned int) bfd_h_get_32 (abfd, note); >> + name = note + 12; >> + >> + if (namelen > 0 >> + && (0 == strcmp (name, QNX_NOTE_NAME))) >> + *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO; >> + } >> +} >> + >> enum gdb_osabi >> nto_elf_osabi_sniffer (bfd *abfd) >> { >> - if (nto_is_nto_target) >> + enum gdb_osabi osabi = GDB_OSABI_UNKNOWN; >> + >> + bfd_map_over_sections (abfd, >> + nto_sniff_abi_note_section, >> + &osabi); >> + >> + if (osabi == GDB_OSABI_UNKNOWN && nto_is_nto_target) >> return nto_is_nto_target (abfd); > > ... > nto_is_nto_target = procfs_is_nto_target; > ... > > static enum gdb_osabi > procfs_is_nto_target (bfd *abfd) > { > return GDB_OSABI_QNXNTO; > } > > So that basically could be rewritten as: > > if (osabi == GDB_OSABI_UNKNOWN && nto_is_nto_target) > return GDB_OSABI_QNXNTO; > > > But, do we still need this nto_is_nto_target hack here? > Now with proper sniffing, can't we just remove it altogether? Removed. Rely on new sniffing only, no hard coded fallback. > >> - return GDB_OSABI_UNKNOWN; >> + return osabi; >> } >> >> static const char *nto_thread_state_str[] = >> > > > Thanks, > Pedro Alves > > New version of the patch attached. Thank you, Aleksandar Ristovski From 6df97e71696e47d85000413bf4a97cf5d43b11f1 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..4e0cc84 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; + + 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) + { + 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); + name = note + sizeof_Elf_Nhdr; + if (sectsize < namelen + sizeof_Elf_Nhdr + || namelen > sizeof (QNX_NOTE_NAME) + 1) + { + /* Can not be QNX note. */ + XDELETEVEC (note); + return; + } + + if (namelen > 0 && 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