From patchwork Mon Mar 5 08:53:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xavier Roirand X-Patchwork-Id: 26194 Received: (qmail 14857 invoked by alias); 5 Mar 2018 08:53:33 -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 14830 invoked by uid 89); 5 Mar 2018 08:53:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_NEUTRAL, TIME_LIMIT_EXCEEDED autolearn=unavailable version=3.3.2 spammy=Hx-languages-length:2844, HX-Received:10.28.66.65 X-HELO: mail-wm0-f44.google.com Received: from mail-wm0-f44.google.com (HELO mail-wm0-f44.google.com) (74.125.82.44) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 05 Mar 2018 08:53:22 +0000 Received: by mail-wm0-f44.google.com with SMTP id t74so14222860wme.3 for ; Mon, 05 Mar 2018 00:53:22 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=wjBr5Gobwvk5xXbgXtdg1NOuYsqBbRHOzCK2dCkSfnI=; b=nQtD0PU7ZesroaKamJPTnap/JcwD3zzuf14LkzRZSYuliO6liNdSpTSN6jsM84nUWo feZuRldljXSqiYC/JayoWPoAGchKMYRz9U0xHUfHIV7YVqeEgy6ZvlxhIywMuJG4MXHc iwilKH3+dW+Yr8hZ//4cViLXyzXnZ0VJ7pRpX36VamvWqnhTESNmXVblJt3OQF71hZOz 4QtVVV2g5nnGicYuO5T/yNvQMDlM22AFoftfTFRy3/TuC1gskCROdLzL2fIN4zWwyMA7 yN3YEEPbUW/rSk1QSb2ShPhsP0Fol57RAKZz+osRf8xB9uihO8qdfZY/rww3mCpwLVG3 riTQ== X-Gm-Message-State: AElRT7EnHpVZb7RglkDk8CbI33XGtTYubsg575KUz7KAKZ4jsDQhAGaP rPxAYITPiSirfGrPVj5Nsv/RfRlC X-Google-Smtp-Source: AG47ELuGXT9uQVVAspMkZRwPB8uClkgZ7kkt06Po6zGwDX4monrDNqMUtmKMQ/t0D6W11qViDxUhhg== X-Received: by 10.28.66.65 with SMTP id p62mr7140272wma.8.1520240000092; Mon, 05 Mar 2018 00:53:20 -0800 (PST) Received: from adacore.com (dhcp-guest.act-europe.fr. [194.98.77.127]) by smtp.gmail.com with ESMTPSA id a1sm10860186wra.41.2018.03.05.00.53.18 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 05 Mar 2018 00:53:19 -0800 (PST) Received: by adacore.com (sSMTP sendmail emulation); Mon, 05 Mar 2018 09:53:17 +0100 From: Xavier Roirand To: gdb-patches@sourceware.org Cc: brobecker@adacore.com, tgingold@free.fr, Xavier Roirand Subject: [RFA/Darwin] Fix section relocation addresses when base address is not 0. Date: Mon, 5 Mar 2018 09:53:14 +0100 Message-Id: <1520239994-15165-1-git-send-email-roirand@adacore.com> X-IsSubscribed: yes When using "info sharedlibrary" on Darwin, the start & end addresses may be wrong if the shared objects relocation address is not 0 because section relocation adresses does not take in account base address when this one is different from 0. This patch fixes it. gdb/ChangeLog: * solib-darwin.c (struct lm_info): Add lm_base and base_set fields. (darwin_current_sos): Add detail in comment. Set addr_low. (darwin_relocate_section_addresses): Use base address to relocate a section. --- ChangeLog | 5 +++++ gdb/solib-darwin.c | 25 +++++++++++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 03e1852114..5c749fb887 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2018-03-02 Tristan Gingold + + * Fix solib addr_low & addr_high addresses when base + address is not 0. + 2018-02-13 Maciej W. Rozycki * configure.ac (noconfigdirs): Add `ld'. diff --git a/gdb/solib-darwin.c b/gdb/solib-darwin.c index cf15148c36..1b43da88b4 100644 --- a/gdb/solib-darwin.c +++ b/gdb/solib-darwin.c @@ -157,6 +157,10 @@ struct lm_info_darwin : public lm_info_base { /* The target location of lm. */ CORE_ADDR lm_addr = 0; + + /* Dylib base address. */ + CORE_ADDR lm_base; + unsigned char base_set; }; /* Lookup the value for a specific symbol. */ @@ -273,7 +277,7 @@ darwin_current_sos (void) load_addr = extract_typed_address (buf, ptr_type); path_addr = extract_typed_address (buf + ptr_len, ptr_type); - /* Read Mach-O header from memory. */ + /* Read Mach-O header from memory (except the reserved field). */ if (target_read_memory (load_addr, (gdb_byte *) &hdr, sizeof (hdr) - 4)) break; /* Discard wrong magic numbers. Shouldn't happen. */ @@ -303,6 +307,8 @@ darwin_current_sos (void) newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; strcpy (newobj->so_original_name, newobj->so_name); xfree (file_path); + newobj->addr_low = load_addr; + newobj->addr_high = load_addr; li->lm_addr = load_addr; if (head == NULL) @@ -592,16 +598,19 @@ darwin_relocate_section_addresses (struct so_list *so, { lm_info_darwin *li = (lm_info_darwin *) so->lm_info; - sec->addr += li->lm_addr; - sec->endaddr += li->lm_addr; + /* Read base address. */ + if (!li->base_set) + { + li->lm_base = bfd_mach_o_get_base_address (so->abfd); + li->base_set = 1; + } + + /* Relocate section. */ + sec->addr += li->lm_addr - li->lm_base; + sec->endaddr += li->lm_addr - li->lm_base; /* Best effort to set addr_high/addr_low. This is used only by 'info sharedlibary'. */ - if (so->addr_high == 0) - { - so->addr_low = sec->addr; - so->addr_high = sec->endaddr; - } if (sec->endaddr > so->addr_high) so->addr_high = sec->endaddr; if (sec->addr < so->addr_low)