From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1979 invoked by alias); 28 Sep 2018 13:31:27 -0000 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 Received: (qmail 1933 invoked by uid 89); 28 Sep 2018 13:31:20 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.7 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=unloaded, H*Ad:D*ca, Temporary, roirand X-HELO: smtp.eu.adacore.com Received: from mel.act-europe.fr (HELO smtp.eu.adacore.com) (194.98.77.210) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 28 Sep 2018 13:31:17 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 8EC2F815A8; Fri, 28 Sep 2018 15:31:15 +0200 (CEST) Received: from smtp.eu.adacore.com ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ON7eYt0i5Chx; Fri, 28 Sep 2018 15:31:15 +0200 (CEST) Received: from Xaviers-MacBook-Pro.local (unknown [10.10.8.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.eu.adacore.com (Postfix) with ESMTPSA id D303981382; Fri, 28 Sep 2018 15:31:14 +0200 (CEST) Subject: Re: [RFA 2/5] Darwin: Handle unrelocated dyld. To: gdb-patches@sourceware.org References: <1534932677-9496-1-git-send-email-roirand@adacore.com> <1534932677-9496-3-git-send-email-roirand@adacore.com> <18e995c1bee8c82df212dd431136d259@polymtl.ca> <87lg7ysdpb.fsf@tromey.com> <20180919134057.GN19172@adacore.com> <87fty5r1ud.fsf@tromey.com> <8f17f90607d350f19c4a36346c4e1acb@polymtl.ca> <87worhpadh.fsf@tromey.com> From: Xavier Roirand Cc: Tom Tromey , Simon Marchi Message-ID: <56c8bd92-fce6-cea9-7f32-136e2d6feef9@adacore.com> Date: Fri, 28 Sep 2018 13:31:00 -0000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <87worhpadh.fsf@tromey.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2018-09/txt/msg00894.txt.bz2 Hello, Thanks Tom and Simon for all the work you've done on this patch. I was quite busy last week and did not follow this thread. Le 9/19/18 à 9:15 PM, Tom Tromey a écrit : >>>>>> "Simon" == Simon Marchi writes: > > Simon> I would vote for only checking in the code you know is necessary for > Simon> now, otherwise it will just be more confusing in the future, trying to > Simon> figure out what is needed and what isn't. > > Here is a more minimal version of the patch. This one seems to work for > me on High Sierra. I tried running a "hello world" program -- this > previously failed, but now works. It's good enough that I could run > gdb.cp/*.exp -- lots of fails but no crashes or mystery problems. > > Tom > > commit 114a1aae792443d72f1438dbc979b42a39c5b780 > Author: Xavier Roirand > Date: Wed Aug 22 12:11:14 2018 +0200 > > Darwin: Handle unrelocated dyld. > > On Darwin, debugging an helloworld program with GDB does > not work and ends with: > > (gdb) set startup-with-shell off > (gdb) start > Temporary breakpoint 1 at 0x100000fb4: file /tmp/helloworld.c, line 1. > Starting program: /private/tmp/helloworld > [New Thread 0x2703 of process 18906] > [New Thread 0x2603 of process 18906] > > [1]+ Stopped ./gdb/gdb /tmp/helloworld > > When debugging with lldb, instead of having the STOP signal, we can > see that a breakpoint is not set to a proper location: > > Warning: > Cannot insert breakpoint -1. > Cannot access memory at address 0xf726 > > Command aborted. > > The inserted breakpoint is the one used when GDB has to stop the target > when a shared library is loaded or unloaded. The notifier address used > for adding the breakpoint is wrong thus the above failure. > This notifier address is an offset relative to dyld base address, so > the value calculation has to be updated to reflect this. > > This was tested on High Sierra by trying to run a simple "hello world" > program. > > gdb/ChangeLog: > > * solib-darwin.c (darwin_get_dyld_bfd): New function. > (darwin_solib_get_all_image_info_addr_at_init): Update call. > (darwin_handle_solib_event): New function. > (darwin_solib_create_inferior_hook): Handle unrelocated dyld. > > Change-Id: I7dde5008c9158f17b78dc89bd7f4bd8a12d4a6e1 > > diff --git a/gdb/ChangeLog b/gdb/ChangeLog > index 328d48eeeb9..804aaf78e91 100644 > --- a/gdb/ChangeLog > +++ b/gdb/ChangeLog > @@ -1,3 +1,9 @@ > +2018-09-18 Xavier Roirand > + > + * solib-darwin.c (darwin_get_dyld_bfd): New function. > + (darwin_solib_get_all_image_info_addr_at_init): Update call. > + (darwin_solib_create_inferior_hook): Handle unrelocated dyld. > + > 2018-09-18 Tom Tromey > > * compile/compile-object-load.c (struct > diff --git a/gdb/solib-darwin.c b/gdb/solib-darwin.c > index ed8e0c13365..1877ec0839d 100644 > --- a/gdb/solib-darwin.c > +++ b/gdb/solib-darwin.c > @@ -429,23 +429,21 @@ gdb_bfd_mach_o_fat_extract (bfd *abfd, bfd_format format, > return gdb_bfd_ref_ptr (result); > } > > -/* Extract dyld_all_image_addr when the process was just created, assuming the > - current PC is at the entry of the dynamic linker. */ > +/* Return the BFD for the program interpreter. */ > > -static void > -darwin_solib_get_all_image_info_addr_at_init (struct darwin_info *info) > +static gdb_bfd_ref_ptr > +darwin_get_dyld_bfd () > { > char *interp_name; > - CORE_ADDR load_addr = 0; > > /* This method doesn't work with an attached process. */ > if (current_inferior ()->attach_flag) > - return; > + return NULL; > > /* Find the program interpreter. */ > interp_name = find_program_interpreter (); > if (!interp_name) > - return; > + return NULL; > > /* Create a bfd for the interpreter. */ > gdb_bfd_ref_ptr dyld_bfd (gdb_bfd_open (interp_name, gnutarget, -1)); > @@ -459,6 +457,18 @@ darwin_solib_get_all_image_info_addr_at_init (struct darwin_info *info) > else > dyld_bfd.release (); > } > + return dyld_bfd; > +} > + > +/* Extract dyld_all_image_addr when the process was just created, assuming the > + current PC is at the entry of the dynamic linker. */ > + > +static void > +darwin_solib_get_all_image_info_addr_at_init (struct darwin_info *info) > +{ > + CORE_ADDR load_addr = 0; > + gdb_bfd_ref_ptr dyld_bfd (darwin_get_dyld_bfd ()); > + > if (dyld_bfd == NULL) > return; > > @@ -528,10 +538,6 @@ darwin_solib_create_inferior_hook (int from_tty) > return; > } > > - /* Add the breakpoint which is hit by dyld when the list of solib is > - modified. */ > - create_solib_event_breakpoint (target_gdbarch (), info->all_image.notifier); > - > if (info->all_image.count != 0) > { > /* Possible relocate the main executable (PIE). */ > @@ -558,6 +564,49 @@ darwin_solib_create_inferior_hook (int from_tty) > if (vmaddr != load_addr) > objfile_rebase (symfile_objfile, load_addr - vmaddr); > } > + > + /* Set solib notifier (to reload list of shared libraries). */ > + CORE_ADDR notifier = info->all_image.notifier; > + > + if (info->all_image.count == 0) > + { > + /* Dyld hasn't yet relocated itself, so the notifier address may > + be incorrect (as it has to be relocated). */ > + CORE_ADDR start = bfd_get_start_address (exec_bfd); > + if (start == 0) > + notifier = 0; > + else > + { > + gdb_bfd_ref_ptr dyld_bfd (darwin_get_dyld_bfd ()); > + if (dyld_bfd != NULL) > + { > + CORE_ADDR dyld_bfd_start_address; > + CORE_ADDR dyld_relocated_base_address; > + CORE_ADDR pc; > + > + dyld_bfd_start_address = bfd_get_start_address (dyld_bfd.get()); > + > + /* We find the dynamic linker's base address by examining > + the current pc (which should point at the entry point > + for the dynamic linker) and subtracting the offset of > + the entry point. */ > + > + pc = regcache_read_pc (get_current_regcache ()); > + dyld_relocated_base_address = pc - dyld_bfd_start_address; > + > + /* We get the proper notifier relocated address by > + adding the dyld relocated base address to the current > + notifier offset value. */ > + > + notifier += dyld_relocated_base_address; > + } > + } > + } > + > + /* Add the breakpoint which is hit by dyld when the list of solib is > + modified. */ > + if (notifier != 0) > + create_solib_event_breakpoint (target_gdbarch (), notifier); > } > > static void >