From patchwork Fri Jan 20 10:54:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Bj=C3=B6rn_Sch=C3=A4pers?= X-Patchwork-Id: 46289 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp129344wrn; Fri, 20 Jan 2023 02:55:47 -0800 (PST) X-Google-Smtp-Source: AMrXdXvWBSHHFsPCEQ7M+Pa1LdH98mvV94Zo9QdGEZWgOcr3wKtjV0Ye1LugOKDWO1XLBfgSHAQA X-Received: by 2002:a05:6402:3214:b0:46f:68d0:76 with SMTP id g20-20020a056402321400b0046f68d00076mr18255970eda.34.1674212147704; Fri, 20 Jan 2023 02:55:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674212147; cv=none; d=google.com; s=arc-20160816; b=RKelYln5b0vgPSSc/+WpMFmEEmqHymQKN7KnuzLnXcASQEMaSyj+8iyWPm24A1dCyM roen/8Y5yYYANaC2fKKyfVH1QG5wZzQeGcwHxqW1GWbeMlMc+/hOErmclpXTnZI7OcS8 sedQin65B09P4itHcFWGsmiRSIG9hX1SHOJMiRqNSAiUXpdIjkupYJl/aQKcbLJdUHTw jr3OO/IYsKk4RRp+as4VESGUnlSyS06vwvx4PpcXH5x3Ws3mYoiD7p+QQ+UjQrrskNIK 4ZJUHyM85d3oapvNs3a8+AiwP5S1TLONgB3RKxpE0ZWt5EQEK4PZdcBJJjK7JnOzZBoG QoFg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:message-id:date:subject:to:from:dmarc-filter :delivered-to; bh=er0r9I0u/J6B+XILO0c/KtQbRacwkCtHK2QB1+ynBIQ=; b=iKx8Lqf9WGjF/wONCGDLqL/ALUH7mY8PL4XCL3ax76AS+RYJmdgW+JJDnJ+/xaHFMU a+zWyzmxtUDNPet4kjN1tCysE88jXkQqB7wcYZaXGzIfTmrzAmgMnoLdYJLDv2KB+oeP HSjZQRUaaxSa93s9WAA7Hb9BXWXDNDVE5R5O+GfVGtaIpihwZ6N7Dkt+qRUCBuOqzL7k 2VoQZccauGTl5LUHemkBREttpBUspFQ3LE1DmG9p+4w4u6JqYNWQmGgNy+hvZYHbReKA J6P1jLlWv+BYM8oASASQpYSPKKx0ON7FBb7EYDh0yOSJieS8DFtVABtqFZaHbRoUW2zF 4/MA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id o6-20020a056402444600b004829afcc563si39509251edb.404.2023.01.20.02.55.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Jan 2023 02:55:47 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 54307384F031 for ; Fri, 20 Jan 2023 10:54:49 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail.hazardy.de (mail.hazardy.de [78.94.181.132]) by sourceware.org (Postfix) with ESMTPS id 421EF3858C52; Fri, 20 Jan 2023 10:54:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 421EF3858C52 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=hazardy.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=hazardy.de Received: from NB-372.intranet.mimot.com (188-136-75-197-ftth-senden-dyn.heliweb.de [188.136.75.197]) by mail.hazardy.de (Postfix) with ESMTPSA id D4A22700276; Fri, 20 Jan 2023 11:54:13 +0100 (CET) From: =?utf-8?q?Bj=C3=B6rn_Sch=C3=A4pers?= To: gcc-patches@gcc.gnu.org, gcc@gcc.gnu.org Subject: [PATCH 1/4] libbacktrace: change all pc related variables to uintptr_t Date: Fri, 20 Jan 2023 11:54:06 +0100 Message-Id: <20230120105409.54949-1-gcc@hazardy.de> X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 X-Spam-Status: No, score=-13.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1755538676536135939?= X-GMAIL-MSGID: =?utf-8?q?1755538676536135939?= From: Björn Schäpers It's the right thing to do, since the PC shouldn't go out of the uintptr_t domain, and in backtrace_pcinfo the pc is uintptr_t. This is a preparation for a following patch. Tested on x86_64-linux and i686-w64-mingw32. -- >8 -- * dwarf.c: changed variables holding pc values from uint64_t to uintptr_t. Signed-off-by: Björn Schäpers Signed-off-by: Björn Schäpers Signed-off-by: Björn Schäpers --- libbacktrace/dwarf.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/libbacktrace/dwarf.c b/libbacktrace/dwarf.c index 45cc9e77e40..0707ccddd3e 100644 --- a/libbacktrace/dwarf.c +++ b/libbacktrace/dwarf.c @@ -274,8 +274,8 @@ struct function struct function_addrs { /* Range is LOW <= PC < HIGH. */ - uint64_t low; - uint64_t high; + uintptr_t low; + uintptr_t high; /* Function for this address range. */ struct function *function; }; @@ -356,8 +356,8 @@ struct unit struct unit_addrs { /* Range is LOW <= PC < HIGH. */ - uint64_t low; - uint64_t high; + uintptr_t low; + uintptr_t high; /* Compilation unit for this address range. */ struct unit *u; }; @@ -1094,7 +1094,7 @@ resolve_addr_index (const struct dwarf_sections *dwarf_sections, uint64_t addr_base, int addrsize, int is_bigendian, uint64_t addr_index, backtrace_error_callback error_callback, void *data, - uint64_t *address) + uintptr_t *address) { uint64_t offset; struct dwarf_buf addr_buf; @@ -1194,7 +1194,7 @@ function_addrs_search (const void *vkey, const void *ventry) static int add_unit_addr (struct backtrace_state *state, void *rdata, - uint64_t lowpc, uint64_t highpc, + uintptr_t lowpc, uintptr_t highpc, backtrace_error_callback error_callback, void *data, void *pvec) { @@ -1530,10 +1530,10 @@ lookup_abbrev (struct abbrevs *abbrevs, uint64_t code, lowpc/highpc is set or ranges is set. */ struct pcrange { - uint64_t lowpc; /* The low PC value. */ + uintptr_t lowpc; /* The low PC value. */ int have_lowpc; /* Whether a low PC value was found. */ int lowpc_is_addr_index; /* Whether lowpc is in .debug_addr. */ - uint64_t highpc; /* The high PC value. */ + uintptr_t highpc; /* The high PC value. */ int have_highpc; /* Whether a high PC value was found. */ int highpc_is_relative; /* Whether highpc is relative to lowpc. */ int highpc_is_addr_index; /* Whether highpc is in .debug_addr. */ @@ -1613,16 +1613,16 @@ add_low_high_range (struct backtrace_state *state, uintptr_t base_address, int is_bigendian, struct unit *u, const struct pcrange *pcrange, int (*add_range) (struct backtrace_state *state, - void *rdata, uint64_t lowpc, - uint64_t highpc, + void *rdata, uintptr_t lowpc, + uintptr_t highpc, backtrace_error_callback error_callback, void *data, void *vec), void *rdata, backtrace_error_callback error_callback, void *data, void *vec) { - uint64_t lowpc; - uint64_t highpc; + uintptr_t lowpc; + uintptr_t highpc; lowpc = pcrange->lowpc; if (pcrange->lowpc_is_addr_index) @@ -1663,7 +1663,7 @@ add_ranges_from_ranges ( struct unit *u, uint64_t base, const struct pcrange *pcrange, int (*add_range) (struct backtrace_state *state, void *rdata, - uint64_t lowpc, uint64_t highpc, + uintptr_t lowpc, uintptr_t highpc, backtrace_error_callback error_callback, void *data, void *vec), void *rdata, @@ -1727,10 +1727,10 @@ add_ranges_from_rnglists ( struct backtrace_state *state, const struct dwarf_sections *dwarf_sections, uintptr_t base_address, int is_bigendian, - struct unit *u, uint64_t base, + struct unit *u, uintptr_t base, const struct pcrange *pcrange, int (*add_range) (struct backtrace_state *state, void *rdata, - uint64_t lowpc, uint64_t highpc, + uintptr_t lowpc, uintptr_t highpc, backtrace_error_callback error_callback, void *data, void *vec), void *rdata, @@ -1796,8 +1796,8 @@ add_ranges_from_rnglists ( case DW_RLE_startx_endx: { uint64_t index; - uint64_t low; - uint64_t high; + uintptr_t low; + uintptr_t high; index = read_uleb128 (&rnglists_buf); if (!resolve_addr_index (dwarf_sections, u->addr_base, @@ -1819,8 +1819,8 @@ add_ranges_from_rnglists ( case DW_RLE_startx_length: { uint64_t index; - uint64_t low; - uint64_t length; + uintptr_t low; + uintptr_t length; index = read_uleb128 (&rnglists_buf); if (!resolve_addr_index (dwarf_sections, u->addr_base, @@ -1905,7 +1905,7 @@ add_ranges (struct backtrace_state *state, uintptr_t base_address, int is_bigendian, struct unit *u, uint64_t base, const struct pcrange *pcrange, int (*add_range) (struct backtrace_state *state, void *rdata, - uint64_t lowpc, uint64_t highpc, + uintptr_t lowpc, uintptr_t highpc, backtrace_error_callback error_callback, void *data, void *vec), void *rdata, @@ -3183,7 +3183,7 @@ read_referenced_name (struct dwarf_data *ddata, struct unit *u, static int add_function_range (struct backtrace_state *state, void *rdata, - uint64_t lowpc, uint64_t highpc, + uintptr_t lowpc, uintptr_t highpc, backtrace_error_callback error_callback, void *data, void *pvec) { @@ -3223,7 +3223,7 @@ add_function_range (struct backtrace_state *state, void *rdata, static int read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata, - struct unit *u, uint64_t base, struct dwarf_buf *unit_buf, + struct unit *u, uintptr_t base, struct dwarf_buf *unit_buf, const struct line_header *lhdr, backtrace_error_callback error_callback, void *data, struct function_vector *vec_function, From patchwork Fri Jan 20 10:54:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Bj=C3=B6rn_Sch=C3=A4pers?= X-Patchwork-Id: 46290 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp129415wrn; Fri, 20 Jan 2023 02:55:58 -0800 (PST) X-Google-Smtp-Source: AMrXdXte6wO8aGQ34nyEWCjkD4Z4hQJyzsXYJ3FuHSwk7Gq9HwTKaON/l8pexED52ZceVxu+JkGI X-Received: by 2002:a05:6402:d65:b0:45c:835b:ac4d with SMTP id ec37-20020a0564020d6500b0045c835bac4dmr15045574edb.8.1674212158794; Fri, 20 Jan 2023 02:55:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674212158; cv=none; d=google.com; s=arc-20160816; b=s0tK0DQnbVXoiL5J6wCC/eiZidiZoOvTA8VUB++voRSfJWkPzkUTnFrLgvyx7SCoIV ziU9aRGNap3AhMHQskD3hA6Gh1UzoUh9nG4KHdOZki76T7QHHRlE5Wudm1U8kxpECfYy BCWlyzR8OGh0JPf7M2F1o1vQwBMe26LllUH6hiwPa5IR9I2zhlTo8rlIGHRl+zw7IL/M 8FIEkRXXZjN8Ub0Ft2JbHgil/4a04tEGs1xyhMj2LeJrYMwHc8N98gJn2jcmuk3rDLSN L/l4muKfLimuTNH3WHD1KrVUqnt1zr0wKaiUWZlC3JvNvCrcwVGUELgh2J+XPp80nZaX oblg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dmarc-filter:delivered-to; bh=4M8ObylRJfGvNaemd4kyd0yRgikcz0LJno69sIT8KQI=; b=Pq9mxFKyjuvXgrUOE4U4DlMRE+Ga1OFkrRgfoPTNAS37BQbZwxmW6YhdDlmyoH///f Eyi9IWIwpWYYjATXJJakolNsE5lOAFCAXTG2WyLTCLg3ImI0D+rcPmDDb8aBeeLa1GMr y0+jHaS9A5jzqRhbN8eRzCoGHxEB4d9YRDL+Vvzp2Xl5PvtohJIB8ZPDOk9YO8ZuN7TU K/r9gcdG32tzVYfRsGsHDjpRgNAZhiQ4WrfZNd5wnFxD+eUb8MMlfTROzogtqv4D9Mn6 QL2FjKaIMhEFrr0XOazgv414F6GmUqVrQGFPwnWjsBWCH+llQLqs0UZ6b40xc2tmi/KO KcnQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id cs2-20020a0564020c4200b00499bebec458si35771044edb.299.2023.01.20.02.55.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Jan 2023 02:55:58 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 19D3D3881D02 for ; Fri, 20 Jan 2023 10:54:52 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail.hazardy.de (mail.hazardy.de [78.94.181.132]) by sourceware.org (Postfix) with ESMTPS id 769053858C62; Fri, 20 Jan 2023 10:54:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 769053858C62 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=hazardy.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=hazardy.de Received: from NB-372.intranet.mimot.com (188-136-75-197-ftth-senden-dyn.heliweb.de [188.136.75.197]) by mail.hazardy.de (Postfix) with ESMTPSA id 5D7D67004A0; Fri, 20 Jan 2023 11:54:18 +0100 (CET) From: =?utf-8?q?Bj=C3=B6rn_Sch=C3=A4pers?= To: gcc-patches@gcc.gnu.org, gcc@gcc.gnu.org Subject: [PATCH 3/4] libbacktrace: work with aslr on windows Date: Fri, 20 Jan 2023 11:54:08 +0100 Message-Id: <20230120105409.54949-3-gcc@hazardy.de> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230120105409.54949-1-gcc@hazardy.de> References: <20230120105409.54949-1-gcc@hazardy.de> MIME-Version: 1.0 X-Spam-Status: No, score=-13.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1755538688688184786?= X-GMAIL-MSGID: =?utf-8?q?1755538688688184786?= From: Björn Schäpers Any underflow which might happen, will be countered by an overflow in dwarf.c. Tested on x86_64-linux and i686-w64-mingw32. -- >8 -- Fixes https://github.com/ianlancetaylor/libbacktrace/issues/89 and https://github.com/ianlancetaylor/libbacktrace/issues/82. * pecoff.c (coff_add): Set the base_address of the module, to find the debug information on moved applications. Signed-off-by: Björn Schäpers Signed-off-by: Björn Schäpers --- libbacktrace/pecoff.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/libbacktrace/pecoff.c b/libbacktrace/pecoff.c index 87b3c0cc647..296f1357b5f 100644 --- a/libbacktrace/pecoff.c +++ b/libbacktrace/pecoff.c @@ -39,6 +39,18 @@ POSSIBILITY OF SUCH DAMAGE. */ #include "backtrace.h" #include "internal.h" +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_MEAN_AND_LEAN +#define WIN32_MEAN_AND_LEAN +#endif + +#ifndef NOMINMAX +#define NOMINMAX +#endif + +#include +#endif + /* Coff file header. */ typedef struct { @@ -610,6 +622,8 @@ coff_add (struct backtrace_state *state, int descriptor, int debug_view_valid; int is_64; uintptr_t image_base; + uintptr_t base_address = 0; + uintptr_t module_handle; struct dwarf_sections dwarf_sections; *found_sym = 0; @@ -856,7 +870,12 @@ coff_add (struct backtrace_state *state, int descriptor, + (sections[i].offset - min_offset)); } - if (!backtrace_dwarf_add (state, /* base_address */ 0, &dwarf_sections, +#ifdef HAVE_WINDOWS_H + module_handle = (uintptr_t) GetModuleHandleW (NULL); + base_address = module_handle - image_base; +#endif + + if (!backtrace_dwarf_add (state, base_address, &dwarf_sections, 0, /* FIXME: is_bigendian */ NULL, /* altlink */ error_callback, data, fileline_fn, From patchwork Thu Jan 4 22:33:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Bj=C3=B6rn_Sch=C3=A4pers?= X-Patchwork-Id: 185161 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp5906353dyb; Thu, 4 Jan 2024 14:35:35 -0800 (PST) X-Google-Smtp-Source: AGHT+IFvyno7pbGtzuMOnYNbqBdutglG3T0R+o9iL9ZJDGVWp6plhpZnD2dADatNy4oAFpDKh8dl X-Received: by 2002:ac8:5c8e:0:b0:429:725c:3cbd with SMTP id r14-20020ac85c8e000000b00429725c3cbdmr1213508qta.58.1704407734574; Thu, 04 Jan 2024 14:35:34 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1704407734; cv=pass; d=google.com; s=arc-20160816; b=O2+iSK0NUHuUPI0n038Bo4OPdposdBSNaCh2mYhQUeMrMd4WrJw/pU5swmAjto4juC AL9YuPduCSJ9uAJGJYE5VbGZKWBQT5Q+117ky46LYL0wzdgQnRCgORNnTDCclEoUMAD+ ZmW+iQP4uDlB5qTVE7x6K8gG3aK2EeY2kj2qGhUs9mH+PgKAcDE4M4jpbJx7tHmz9tYv sAb4X4mxrMDmP2+l+97yKI5X/7qiByOlk6PdfeOb2iqFEb2xMCcOqu9WIEM5rVhjZ5w5 tkqwEyZ3KwCPyx8PnQbRC1NkiiBj3pKVzXdFIrrv3vXEt7HjRMkl8f4S/KK/1FdhLtQO Jp/w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:in-reply-to:content-language :references:cc:to:from:subject:user-agent:mime-version:date :message-id:arc-filter:dmarc-filter:delivered-to; bh=NTCPc2RUnbopaLMbwFy0mbwWgjJwNtjr2vRELRNnIwk=; fh=ku3naI09dKPiEVJQBlu/0CiaR+ezlr0Spd+381fLih8=; b=sGHym6OpwRl+czt0LEjMoDcIKRAIy+VDdq8NR6HDHq4TxWXtQTIS8yRmX1KpPZLCPI IWfWW3hsnAGg8j3D7Vi2iZNcJ8RRxVSjASlj0oPTyJrdbf2OUcQc4dFsj7pF72V8fHxv /B3j4oVtdXFYEI7mOrxgTq8DUeaW0UCyoDm+Uigg73M7Vt9L9idyNma1939aEdsLNpOW HN6S3e7GHlQTdwGRyfYm9cqoOkMHWjjTLzqFTGAFKf0rokx2cr84nPRNBWR55CvpGfmU CGCWTO0K60K8CYKvSBW6jeRV+Z/KH3M+R057yNFw/95P/7X9sTsc2uBPKRxGbmRKudzF CWZw== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id u12-20020a05622a14cc00b004259cd2773asi498811qtx.94.2024.01.04.14.35.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Jan 2024 14:35:34 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4510C386F80F for ; Thu, 4 Jan 2024 22:35:34 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail.hazardy.de (mail.hazardy.de [78.94.181.132]) by sourceware.org (Postfix) with ESMTPS id 19E4A386F805; Thu, 4 Jan 2024 22:33:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 19E4A386F805 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=hazardy.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=hazardy.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 19E4A386F805 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=78.94.181.132 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704407627; cv=none; b=Oqg1aGsRFRtO0ab1WwOqrRcr+jp1iumUTmgX53CTBmnB+SGQNb9GoPRk4ylPsroHYcVr/5npfNDWSxwVNxX/z0PsvomDoPM82msH9mfKSUc77qjp3Fbjdetn0mbhUKlCHiBXt+XJxu7DBBkkAse/ZarK2t6nj4hWVk7zj7cFW8w= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704407627; c=relaxed/simple; bh=PqefOPPKMjGU4y8aO9QHEyimWFmlDPmlJMjylYTokaE=; h=Message-ID:Date:MIME-Version:Subject:From:To; b=DjPrvoLdzrhW+q1QECcpheN9VAW9agmO/A/aV85G2I8CN06w5YocxjDQZKmPVB1yM/p/2JqS/2u0n3oe64gucUEv8x2xoxRd/7S61OMTo+WHNorHdhjEAQsmL3iHFgn0IRPd2O95jQl/bvkfBHxITdwyC1FvzomHoTPEhjl9MAI= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from [10.0.1.129] (hades.hazardy.de [10.0.1.129]) by mail.hazardy.de (Postfix) with ESMTPSA id 99C737004AC; Thu, 4 Jan 2024 23:33:27 +0100 (CET) Message-ID: Date: Thu, 4 Jan 2024 23:33:28 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 5/4] libbacktrace: improve getting debug information for loaded dlls From: =?utf-8?q?Bj=C3=B6rn_Sch=C3=A4pers?= To: Ian Lance Taylor Cc: gcc-patches@gcc.gnu.org, gcc@gcc.gnu.org References: <20230120105409.54949-1-gcc@hazardy.de> <20230120105409.54949-4-gcc@hazardy.de> <0c08e584-499f-473f-8699-a41c6a967536@hazardy.de> Content-Language: de-DE, en-US In-Reply-To: <0c08e584-499f-473f-8699-a41c6a967536@hazardy.de> X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1787201044828734524 X-GMAIL-MSGID: 1787201044828734524 Am 03.01.2024 um 00:12 schrieb Björn Schäpers: > Am 30.11.2023 um 20:53 schrieb Ian Lance Taylor: >> On Fri, Jan 20, 2023 at 2:55 AM Björn Schäpers wrote: >>> >>> From: Björn Schäpers >>> >>> Fixes https://github.com/ianlancetaylor/libbacktrace/issues/53, except >>> that libraries loaded after the backtrace_initialize are not handled. >>> But as far as I can see that's the same for elf. >> >> Thanks, but I don't want a patch that loops using goto statements. >> Please rewrite to avoid that.  It may be simpler to call a function. >> >> Also starting with a module count of 1000 seems like a lot.  Do >> typical Windows programs load that many modules? >> >> Ian >> >> > > Rewritten using a function. > > If that is commited, could you attribute that commit to me (--author="Björn > Schäpers ")? > > Thanks and kind regards, > Björn. I noticed that under 64 bit libraries loaded with LoadLibrary were missing. EnumProcessModules stated the correct number of modules, but did not fill the the HMODULEs, but set them to 0. While trying to investigate I noticed if I do the very same thing from main (in C++) I even got fewer module HMODULEs. So I went a different way. This detects all libraries correctly, in 32 and 64 bit. The question is, if it should be a patch on top of the previous, or should they be merged, or even only this solution and drop the EnumProcessModules variant? Kind regards, Björn. From 784e01f1baf92c23c819aeb9e77010412023700f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Sch=C3=A4pers?= Date: Thu, 4 Jan 2024 22:02:03 +0100 Subject: [PATCH 2/2] libbacktrace: improve getting debug information for loaded dlls EnumProcessModules does not always result in all modules loaded, especially those that are loaded with LoadLibrary. libbacktrace/Changelog: * configure.ac: Checked for tlhelp32.h * configure: Regenerate. * config.h.in: Regenerate. * pecoff.c: Include if available. (backtrace_initialize): Use tlhelp32 api for a snapshot to detect loaded modules. --- libbacktrace/config.h.in | 3 + libbacktrace/configure | 185 ++++++++++++++++++++------------------ libbacktrace/configure.ac | 4 + libbacktrace/pecoff.c | 62 ++++++++++++- 4 files changed, 164 insertions(+), 90 deletions(-) diff --git a/libbacktrace/config.h.in b/libbacktrace/config.h.in index ee2616335c7..9b8ab88ab63 100644 --- a/libbacktrace/config.h.in +++ b/libbacktrace/config.h.in @@ -101,6 +101,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H +/* Define to 1 if you have the header file. */ +#undef HAVE_TLHELP32_H + /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H diff --git a/libbacktrace/configure b/libbacktrace/configure index 7ade966b54d..ca52ee3bafb 100755 --- a/libbacktrace/configure +++ b/libbacktrace/configure @@ -1866,7 +1866,7 @@ else #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. + which can conflict with char $2 (void); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ @@ -1884,7 +1884,7 @@ else #ifdef __cplusplus extern "C" #endif -char $2 (); +char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ @@ -1893,7 +1893,7 @@ choke me #endif int -main () +main (void) { return $2 (); ; @@ -1932,7 +1932,7 @@ else /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof ($2)) return 0; @@ -1945,7 +1945,7 @@ if ac_fn_c_try_compile "$LINENO"; then : /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof (($2))) return 0; @@ -1983,7 +1983,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; @@ -2000,7 +2000,7 @@ if ac_fn_c_try_compile "$LINENO"; then : /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; @@ -2027,7 +2027,7 @@ else /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; @@ -2044,7 +2044,7 @@ if ac_fn_c_try_compile "$LINENO"; then : /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; @@ -2079,7 +2079,7 @@ while test "x$ac_lo" != "x$ac_hi"; do /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; @@ -2104,12 +2104,12 @@ esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } +static long int longval (void) { return $2; } +static unsigned long int ulongval (void) { return $2; } #include #include int -main () +main (void) { FILE *f = fopen ("conftest.val", "w"); @@ -2170,7 +2170,7 @@ else /* end confdefs.h. */ $4 int -main () +main (void) { #ifndef $as_decl_name #ifdef __cplusplus @@ -3073,7 +3073,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -3213,7 +3213,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; @@ -3277,7 +3277,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -3328,7 +3328,7 @@ else /* end confdefs.h. */ int -main () +main (void) { #ifndef __GNUC__ choke me @@ -3369,7 +3369,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -3384,7 +3384,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -3400,7 +3400,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -3449,9 +3449,7 @@ struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; +static char *e (char **p, int i) { return p[i]; } @@ -3486,7 +3484,7 @@ int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, i int argc; char **argv; int -main () +main (void) { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; @@ -3544,7 +3542,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -3871,7 +3869,7 @@ else #include int -main () +main (void) { ; @@ -3941,7 +3939,7 @@ else #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int -main () +main (void) { int i; for (i = 0; i < 256; i++) @@ -4020,7 +4018,7 @@ else # define __EXTENSIONS__ 1 $ac_includes_default int -main () +main (void) { ; @@ -5002,7 +5000,7 @@ else /* end confdefs.h. */ int -main () +main (void) { #ifndef __GNUC__ choke me @@ -5043,7 +5041,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -5058,7 +5056,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -5074,7 +5072,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -5123,9 +5121,7 @@ struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; +static char *e (char **p, int i) { return p[i]; } @@ -5160,7 +5156,7 @@ int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, i int argc; char **argv; int -main () +main (void) { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; @@ -5218,7 +5214,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -7408,7 +7404,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu /* end confdefs.h. */ int -main () +main (void) { ; @@ -7994,7 +7990,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -9632,7 +9628,7 @@ _LT_EOF /* end confdefs.h. */ int -main () +main (void) { ; @@ -9672,7 +9668,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi /* end confdefs.h. */ int -main () +main (void) { ; @@ -10947,7 +10943,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -11388,9 +11384,9 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char dlopen (); +char dlopen (void); int -main () +main (void) { return dlopen (); ; @@ -11441,9 +11437,9 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char shl_load (); +char shl_load (void); int -main () +main (void) { return shl_load (); ; @@ -11484,9 +11480,9 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char dlopen (); +char dlopen (void); int -main () +main (void) { return dlopen (); ; @@ -11523,9 +11519,9 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char dlopen (); +char dlopen (void); int -main () +main (void) { return dlopen (); ; @@ -11562,9 +11558,9 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char dld_link (); +char dld_link (void); int -main () +main (void) { return dld_link (); ; @@ -11632,7 +11628,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11635 "configure" +#line 11631 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11738,7 +11734,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11741 "configure" +#line 11737 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12016,7 +12012,7 @@ else && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; @@ -12062,7 +12058,7 @@ else && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; @@ -12086,7 +12082,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; @@ -12131,7 +12127,7 @@ else && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; @@ -12155,7 +12151,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int -main () +main (void) { ; @@ -12228,7 +12224,7 @@ else /* end confdefs.h. */ static int f() { return 0; } int -main () +main (void) { return f(); ; @@ -12259,7 +12255,7 @@ else /* end confdefs.h. */ int -main () +main (void) { return 0; ; @@ -12312,7 +12308,7 @@ case "$host" in /* end confdefs.h. */ int -main () +main (void) { #if !defined(__SSE2__) @@ -12339,7 +12335,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { asm ("setssbsy"); ; @@ -12401,7 +12397,7 @@ else /* end confdefs.h. */ int -main () +main (void) { ; @@ -12490,7 +12486,7 @@ $as_echo_n "checking for _Unwind_GetIPInfo... " >&6; } struct _Unwind_Context *context; int ip_before_insn = 0; int -main () +main (void) { return _Unwind_GetIPInfo (context, &ip_before_insn); ; @@ -12554,7 +12550,7 @@ case "$host" in /* end confdefs.h. */ int -main () +main (void) { #if !defined(__SSE2__) @@ -12580,7 +12576,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { asm ("setssbsy"); ; @@ -12626,7 +12622,7 @@ if test x$may_have_cet = xyes; then /* end confdefs.h. */ int -main () +main (void) { return 0; ; @@ -12763,7 +12759,7 @@ else /* end confdefs.h. */ int i; int -main () +main (void) { __sync_bool_compare_and_swap (&i, i, i); __sync_lock_test_and_set (&i, 1); @@ -12805,7 +12801,7 @@ else /* end confdefs.h. */ int i; int -main () +main (void) { __atomic_load_n (&i, __ATOMIC_ACQUIRE); __atomic_store_n (&i, 1, __ATOMIC_RELEASE); @@ -12843,7 +12839,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int i; int -main () +main (void) { int j; ; @@ -13521,6 +13517,21 @@ fi done +for ac_header in tlhelp32.h +do : + ac_fn_c_check_header_compile "$LINENO" "tlhelp32.h" "ac_cv_header_tlhelp32_h" "#ifdef HAVE_WINDOWS_H +# include +#endif +" +if test "x$ac_cv_header_tlhelp32_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_TLHELP32_H 1 +_ACEOF + +fi + +done + # Check for the fcntl function. if test -n "${with_target_subdir}"; then @@ -13625,7 +13636,7 @@ else #include int -main () +main (void) { int mib0 = CTL_KERN; int mib1 = KERN_PROC; int mib2 = KERN_PROC_PATHNAME; ; @@ -13659,7 +13670,7 @@ else #include int -main () +main (void) { int mib0 = CTL_KERN; int mib1 = KERN_PROC_ARGS; int mib2 = KERN_PROC_PATHNAME; ; @@ -13715,9 +13726,9 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char clock_gettime (); +char clock_gettime (void); int -main () +main (void) { return clock_gettime (); ; @@ -13792,7 +13803,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int i; int -main () +main (void) { return 0; ; @@ -13835,9 +13846,9 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char compress (); +char compress (void); int -main () +main (void) { return compress (); ; @@ -13881,7 +13892,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -13919,7 +13930,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -13962,9 +13973,9 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char ZSTD_compress (); +char ZSTD_compress (void); int -main () +main (void) { return ZSTD_compress (); ; @@ -14008,7 +14019,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -14338,9 +14349,9 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #ifdef __cplusplus extern "C" #endif -char lzma_auto_decoder (); +char lzma_auto_decoder (void); int -main () +main (void) { return lzma_auto_decoder (); ; @@ -14385,7 +14396,7 @@ else /* end confdefs.h. */ int -main () +main (void) { return 0; ; diff --git a/libbacktrace/configure.ac b/libbacktrace/configure.ac index 0f61f2b28ab..b9a695ab402 100644 --- a/libbacktrace/configure.ac +++ b/libbacktrace/configure.ac @@ -380,6 +380,10 @@ if test "$have_loadquery" = "yes"; then fi AC_CHECK_HEADERS(windows.h) +AC_CHECK_HEADERS(tlhelp32.h, [], [], +[#ifdef HAVE_WINDOWS_H +# include +#endif]) # Check for the fcntl function. if test -n "${with_target_subdir}"; then diff --git a/libbacktrace/pecoff.c b/libbacktrace/pecoff.c index 64787a18411..647baa39640 100644 --- a/libbacktrace/pecoff.c +++ b/libbacktrace/pecoff.c @@ -50,6 +50,18 @@ POSSIBILITY OF SUCH DAMAGE. */ #include #include + +#ifdef HAVE_TLHELP32_H +#include + +#ifdef UNICODE +/* If UNICODE is defined, all the symbols are replaced by a macro to use the + wide variant. But we need the ansi variant, so undef the macros. */ +#undef MODULEENTRY32 +#undef Module32First +#undef Module32Next +#endif +#endif #endif /* Coff file header. */ @@ -900,7 +912,7 @@ coff_add (struct backtrace_state *state, int descriptor, return 0; } -#ifdef HAVE_WINDOWS_H +#if defined(HAVE_WINDOWS_H) && !defined(HAVE_TLHELP32_H) static void free_modules (struct backtrace_state *state, backtrace_error_callback error_callback, void *data, @@ -964,13 +976,19 @@ backtrace_initialize (struct backtrace_state *state, uintptr_t module_handle = 0; #ifdef HAVE_WINDOWS_H + fileline module_fileline_fn; + int module_found_sym; + +#ifdef HAVE_TLHELP32_H + HANDLE snapshot; +#else DWORD i; DWORD module_count = 100; DWORD bytes_allocated_for_modules = 0; HMODULE *modules = NULL; char module_name[MAX_PATH]; - int module_found_sym; - fileline module_fileline_fn; + +#endif module_handle = (uintptr_t) GetModuleHandle (NULL); #endif @@ -981,6 +999,43 @@ backtrace_initialize (struct backtrace_state *state, return 0; #ifdef HAVE_WINDOWS_H +#ifdef HAVE_TLHELP32_H + do + { + snapshot = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, 0); + } + while (snapshot == INVALID_HANDLE_VALUE + && GetLastError () == ERROR_BAD_LENGTH); + + if (snapshot != INVALID_HANDLE_VALUE) + { + MODULEENTRY32 entry; + BOOL ok; + entry.dwSize = sizeof(MODULEENTRY32); + + for (ok = Module32First (snapshot, &entry); ok; ok =Module32Next (snapshot, &entry)) + { + if (strcmp (filename, entry.szExePath) == 0) + continue; + + module_handle = (uintptr_t) entry.hModule; + if (module_handle == 0) + continue; + + descriptor = backtrace_open (entry.szExePath, error_callback, data, NULL); + if (descriptor < 0) + continue; + + coff_add (state, descriptor, error_callback, data, + &module_fileline_fn, &module_found_sym, &found_dwarf, + module_handle); + if (module_found_sym) + found_sym = 1; + } + + CloseHandle (snapshot); + } +#else get_all_modules (state, error_callback, data, &modules, &module_count, &bytes_allocated_for_modules); @@ -1009,6 +1064,7 @@ backtrace_initialize (struct backtrace_state *state, if (modules) free_modules (state, error_callback, data, &modules, bytes_allocated_for_modules); +#endif #endif if (!state->threaded)