From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1080 invoked by alias); 8 Feb 2012 20:50:24 -0000 Received: (qmail 1059 invoked by uid 22791); 8 Feb 2012 20:50:21 -0000 X-SWARE-Spam-Status: No, hits=-6.6 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 08 Feb 2012 20:50:00 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q18Ko0FA008241 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 8 Feb 2012 15:50:00 -0500 Received: from host2.jankratochvil.net (ovpn-116-26.ams2.redhat.com [10.36.116.26]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q18Kntp8009764 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Wed, 8 Feb 2012 15:49:58 -0500 Date: Wed, 08 Feb 2012 20:50:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Subject: [patch] Fix crash on `info files' with gdbserver Message-ID: <20120208204955.GA28565@host2.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-02/txt/msg00113.txt.bz2 Hi, while playing with gdbserver GDB just crashed for me. The problem is exec_ops get pushed to the target stack for the loaded shared libraries despite exec_bfd remains NULL which is not expected by exec.c. Breakpoint 1, add_target_sections (sections=0x21372e0, sections_end=0x2137580) at exec.c:471 471 push_target (&exec_ops); (gdb) bt #0 add_target_sections (sections=0x21372e0, sections_end=0x2137580) at exec.c:471 #1 in solib_map_sections (so=0x21cd6f0) at solib.c:507 #2 in update_solib_list (from_tty=1, target=0x1d8fee0) at solib.c:804 #3 in solib_add (pattern=0x0, from_tty=1, target=0x1d8fee0, readsyms=1) at solib.c:889 #4 in enable_break (info=0x210f000, from_tty=1) at solib-svr4.c:1624 #5 in svr4_solib_create_inferior_hook (from_tty=1) at solib-svr4.c:2234 #6 in solib_create_inferior_hook (from_tty=1) at solib.c:1172 #7 in reload_shared_libraries (ignored=0x0, from_tty=1, e=0x1fc5cd0) at solib.c:1308 So it is questionable whether to keep exec_ops unpushed or whether to handle NULL exec_bfd there. I chose the latter. The set_section_command part has no code change effect, just there was a bug. No regressions on {x86_64,x86_64-m32,i686}-fedorarawhide-linux-gnu and with non-extended gdbserver. I will check it in. Thanks, Jan gdb/ 2012-02-08 Jan Kratochvil Fix crash on loaded shlibs without loaded exec_bfd. * exec.c (exec_files_info): Do not crash on NULL EXEC_BFD. (set_section_command): Replace exec_bfd by p->bfd. gdb/testsuite/ 2012-02-08 Jan Kratochvil * gdb.server/server-exec-info.exp: New file. --- a/gdb/exec.c +++ b/gdb/exec.c @@ -761,7 +761,10 @@ print_section_info (struct target_section_table *t, bfd *abfd) static void exec_files_info (struct target_ops *t) { - print_section_info (current_target_sections, exec_bfd); + if (exec_bfd) + print_section_info (current_target_sections, exec_bfd); + else + puts_filtered (_("\t\n")); if (vmap) { @@ -813,9 +816,9 @@ set_section_command (char *args, int from_tty) table = current_target_sections; for (p = table->sections; p < table->sections_end; p++) { - if (!strncmp (secname, bfd_section_name (exec_bfd, + if (!strncmp (secname, bfd_section_name (p->bfd, p->the_bfd_section), seclen) - && bfd_section_name (exec_bfd, p->the_bfd_section)[seclen] == '\0') + && bfd_section_name (p->bfd, p->the_bfd_section)[seclen] == '\0') { offset = secaddr - p->addr; p->addr += offset; --- /dev/null +++ b/gdb/testsuite/gdb.server/server-exec-info.exp @@ -0,0 +1,29 @@ +# Copyright (C) 2012 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib gdbserver-support.exp + +set testfile "no-execfile-info" +set srcfile "server.c" +#if { [build_executable ${testfile}.exp ${testfile} ${srcfile}] == -1} { +if [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] { + return -1 +} + +gdb_test "file" ".*" "file" \ + {Discard symbol table from `.*'\? \(y or n\) } "y" +gdbserver_run "" +gdb_test "set sysroot remote:" +gdb_test "info files" "\r\nLocal exec file:\r\n\t"