From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id eRTJDkoUxmo0NA0AWB0awg (envelope-from ) for ; Wed, 07 Oct 2026 05:43:38 -0400 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=VNhcx4L/; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=y7+f1LEl; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=MhjhwI1f; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=JoFrS8zP; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 36AE71E04F; Wed, 07 Oct 2026 05:43:38 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 531901E051 for ; Wed, 07 Oct 2026 05:43:35 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 663854BA2E12 for ; Wed, 7 Oct 2026 09:43:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 663854BA2E12 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=VNhcx4L/; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=y7+f1LEl; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=MhjhwI1f; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=JoFrS8zP Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2a07:de40:b251:101:10:150:64:1]) by sourceware.org (Postfix) with ESMTPS id 258864BA2E18 for ; Wed, 7 Oct 2026 09:41:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 258864BA2E18 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 258864BA2E18 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2a07:de40:b251:101:10:150:64:1 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1791366064; cv=none; b=Mi+Fxxyb+Myy4+HEvQsxD0GPAFeVWWsBUbMGvzElXT4wTliT1+oHnkbe5YsIY3i3Dj0HRz4afpnWMO/9OSCHUi2CDlhRzOgj/dd19RA0m/nB5s2tVlDr84UjGHkn8PUMhM2GwYqbvWngV0TCS3S0kIBV8i/+UTLTfMlovLJV3k8= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1791366064; c=relaxed/simple; bh=W2sbPqPdCyJZRDnMHJDsS2BwUbh9TGAR1DlccsMJybQ=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From: To:Subject:Date:Message-ID:MIME-Version; b=Sx47xMpJ9BYTNOFRZmI4Yx64ZGJAgVrYjxrgvDeilKLMpSFVxDtf3W/vk672A565rqd7G9gRysWqJZMAWp6M+d5rRJt+aaahg3ep5FBtM62tLPZsn9QolT8/oyL3dz2it/ZbPLS5h6GicCXfimBSLLL828lYB2fFb3RnSIYMq/s= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=VNhcx4L/; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=y7+f1LEl; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=MhjhwI1f; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=JoFrS8zP DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 258864BA2E18 Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [IPv6:2a07:de40:b281:104:10:150:64:97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id F182321DF3 for ; Wed, 7 Oct 2026 09:41:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1791366063; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W3toWPeLxn58N+pfQ/Yzz5HVDQbFgfEaKVzBeLKZ28g=; b=VNhcx4L/Z0saD3FoueuBhg5vjqTxdbLnEIi3TBcAy6wlL8HhnYRp4MxsaLXZF8AoNzf9Jj znZ3PWMZLixCZhf4So0z6wb2tsX7+JbL3fczTzsT6vhT1OWCMBegYJ8qD/9CK19HJQGRfU wXy0YUJBfLgZ7HMJn4oX0KsD44wX7BA= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1791366063; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W3toWPeLxn58N+pfQ/Yzz5HVDQbFgfEaKVzBeLKZ28g=; b=y7+f1LElOeseLf1FaSPeHo3D/8F0w06MC3gPSIM0+CDOQF6CQKBqLFw8ZlC6TqqD//XZes sMqJ0TnuTFh+VRBg== Authentication-Results: smtp-out1.suse.de; dkim=pass header.d=suse.de header.s=susede2_rsa header.b=MhjhwI1f; dkim=pass header.d=suse.de header.s=susede2_ed25519 header.b=JoFrS8zP DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1791366062; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W3toWPeLxn58N+pfQ/Yzz5HVDQbFgfEaKVzBeLKZ28g=; b=MhjhwI1fqp0g8tuQm32AfNJGE+EQuR2+k+FzcrL3kxIe/uH5/qi2ALPvYneH6YrdG9JmVz epI8U7251lI/33EzgW8qAEa8rkwhb8C5nXE78hoEy4i9SD3z+dQXeLUWoWkdVddqvw5y6J 3lQqiED30VkhlZbZ5NOZeQCyRj9J3EY= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1791366062; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W3toWPeLxn58N+pfQ/Yzz5HVDQbFgfEaKVzBeLKZ28g=; b=JoFrS8zPc0R/fuDK90vc5HptRkh7A3ajE0MKc1FtzMtwrI2kJshyrWO9tmjXAncEShs9cA j5H4pbziPT0J2aBA== Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id A808213B9D for ; Wed, 7 Oct 2026 09:40:59 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id JEXHFKoTxmo3EwAAD6G6ig:T11 (envelope-from ) for ; Wed, 07 Oct 2026 09:40:59 +0000 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH v4 10/11] [gdb] Don't stop disassembly at section hole Date: Wed, 7 Oct 2026 11:40:56 +0200 Message-ID: <20261007094057.1811886-11-tdevries@suse.de> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20261007094057.1811886-1-tdevries@suse.de> References: <20261007094057.1811886-1-tdevries@suse.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspamd2.dmz-prg2.suse.org X-Spamd-Result: default: False [-3.01 / 50.00]; BAYES_HAM(-3.00)[100.00%]; NEURAL_HAM_LONG(-1.00)[-1.000]; MID_CONTAINS_FROM(1.00)[]; R_MISSING_CHARSET(0.50)[]; R_DKIM_ALLOW(-0.20)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; MX_GOOD(-0.01)[]; RBL_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[2a07:de40:b281:104:10:150:64:97:from]; RCVD_VIA_SMTP_AUTH(0.00)[]; RCVD_COUNT_TWO(0.00)[2]; ARC_NA(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; FROM_HAS_DN(0.00)[]; MIME_TRACE(0.00)[0:+]; FROM_EQ_ENVFROM(0.00)[]; RECEIVED_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[2a07:de40:b281:106:10:150:64:167:received]; DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:dkim,imap1.dmz-prg2.suse.org:helo,imap1.dmz-prg2.suse.org:rdns]; TO_MATCH_ENVRCPT_ALL(0.00)[]; TO_DN_NONE(0.00)[]; RCVD_TLS_ALL(0.00)[]; PREVIOUSLY_DELIVERED(0.00)[gdb-patches@sourceware.org]; DNSWL_BLOCKED(0.00)[2a07:de40:b281:106:10:150:64:167:received]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; DKIM_TRACE(0.00)[suse.de:+] X-Rspamd-Action: no action X-Rspamd-Queue-Id: F182321DF3 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org Consider the following session: ... $ gdb -q -batch a.out -ex "disassemble _init,0x0000000000401030" Dump of assembler code from 0x401000 to 0x401030: ... 0x000000000040101a <_init+26>: ret 0x000000000040101b: Cannot access memory at address 0x40101b ... If we disassemble with objdump instead, we get: ... Disassembly of section .init: 0000000000401000 <_init>: ... 40101a: c3 ret Disassembly of section .plt: 0000000000401020 : 401020: ff 35 ca 2f 00 00 push 0x2fca(%rip) 401026: ff 25 cc 2f 00 00 jmp *0x2fcc(%rip) 40102c: 0f 1f 40 00 nopl 0x0(%rax) ... The disassembling stops at the section hole, when running into a memory error. Fix this by if necessary skipping over the section hole. This also fixes the paradoxical situation reported in PR34399 where it's possible to scroll forward into a section hole, but not back out of it. Without the "Fix buglet in tui_find_disassembly_address" patch in this series, this patch regresses as follows: ... FAIL: gdb.tui/tui-layout-asm-short-prog.exp: check first line is back ... Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34399 --- gdb/disasm.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- gdb/disasm.h | 8 ++++++++ gdb/tui/tui-disasm.c | 42 ++++++++++++++++++++++++++++++++---------- 3 files changed, 82 insertions(+), 12 deletions(-) diff --git a/gdb/disasm.c b/gdb/disasm.c index 23d0c880777..e847e3ee0ff 100644 --- a/gdb/disasm.c +++ b/gdb/disasm.c @@ -1185,6 +1185,37 @@ gdb_disassembly_1 (struct gdbarch *gdbarch, struct ui_out *uiout, /* See disasm.h. */ +bool +disassemble_section_p (addrmap_mutable &map, + struct obj_section *s, CORE_ADDR range_low, + CORE_ADDR range_high) +{ + if (s == nullptr) + { + struct obj_section *prev = (range_low == 0 + ? nullptr + : (obj_section *)map.find (range_low - 1)); + struct obj_section *next = (range_high == (CORE_ADDR)-1 + ? nullptr + : (obj_section *)map.find (range_high + 1)); + bool section_hole + = (prev != nullptr && next != nullptr + && prev->objfile == next->objfile); + if (section_hole) + { + /* Don't disassemble if it would trigger a memory error. */ + return target_has_registers (); + } + + /* Random memory not in a section; might contain JIT-ed instructions. */ + return true; + } + + return true; +} + +/* See disasm.h. */ + int gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout, gdb_disassembly_flags flags, int how_many, @@ -1197,8 +1228,17 @@ gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout, { CORE_ADDR tmp_high = high; - CORE_ADDR range_high; - map->find (low, nullptr, &range_high); + CORE_ADDR range_low, range_high; + struct obj_section *s + = (obj_section *)map->find (low, &range_low, &range_high); + if (!disassemble_section_p (*map, s, range_low, range_high)) + { + if (range_high == (CORE_ADDR)-1) + break; + + low = range_high + 1; + continue; + } /* Don't disassemble past a section change. */ if (range_high != (CORE_ADDR)-1) diff --git a/gdb/disasm.h b/gdb/disasm.h index 9109dbf0a79..0366de8f673 100644 --- a/gdb/disasm.h +++ b/gdb/disasm.h @@ -26,6 +26,7 @@ struct gdbarch; struct ui_out; struct ui_file; +struct addrmap_mutable; /* A wrapper around a disassemble_info and a gdbarch. This is the core set of data that all disassembler sub-classes will need. This class @@ -323,6 +324,13 @@ struct disasm_insn unsigned int is_speculative:1; }; +/* Return true if memory in [RANGE_LOW, RANGE_HIGH] should be disassembled. + S is either the corresponding section, or nullptr if the range doesn't + match a section. */ + +extern bool disassemble_section_p (addrmap_mutable &map, struct obj_section *s, + CORE_ADDR range_low, CORE_ADDR range_high); + /* Print at most HOW_MANY instructions of the instruction stream at [LOW, HIGH) on UIOUT using FLAGS. Return the number of the instructions printed. */ diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c index ba11b8e8188..09136b6fc60 100644 --- a/gdb/tui/tui-disasm.c +++ b/gdb/tui/tui-disasm.c @@ -179,8 +179,17 @@ tui_disassemble (struct gdbarch *gdbarch, while (count > 0) { - CORE_ADDR range_high; - map.find (pc, nullptr, &range_high); + CORE_ADDR range_low, range_high; + struct obj_section *s + = (struct obj_section *)map.find (pc, &range_low, &range_high); + if (!disassemble_section_p (map, s, range_low, range_high)) + { + if (range_high == (CORE_ADDR)-1) + break; + + pc = range_high + 1; + continue; + } /* Don't disassemble past a section change. */ std::optional high_pc; @@ -206,17 +215,34 @@ tui_disassemble (struct gdbarch *gdbarch, addresses, or the start of a section. */ static CORE_ADDR -tui_find_backward_disassembly_start_address (CORE_ADDR addr) +tui_find_backward_disassembly_start_address (addrmap_mutable &map, CORE_ADDR addr) { if (addr == 0) { /* We cannot go backwards from zero. */ return addr; } + CORE_ADDR search_addr = addr - 1; + + struct obj_section *s = nullptr; + CORE_ADDR range_low, range_high; + while (true) + { + s = (struct obj_section *)map.find (search_addr, &range_low, + &range_high); + + if (disassemble_section_p (map, s, range_low, range_high)) + break; + + if (range_low == 0) + return addr; + + search_addr = range_low - 1; + } bound_minimal_symbol msym_prev; bound_minimal_symbol msym - = lookup_minimal_symbol_by_pc_section (addr - 1, nullptr, + = lookup_minimal_symbol_by_pc_section (search_addr, nullptr, lookup_msym_prefer::TEXT, &msym_prev); if (msym.minsym != nullptr) @@ -226,11 +252,7 @@ tui_find_backward_disassembly_start_address (CORE_ADDR addr) /* Find the first section with start address before ADDR, and use its start address. */ - struct obj_section *section = find_pc_section (addr - 1); - if (section != NULL) - return section->addr (); - - return addr; + return range_low; } /* Find the disassembly address that corresponds to FROM lines above @@ -292,7 +314,7 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from) CORE_ADDR prev_low = new_low; /* Find an address from which we can start disassembling. */ - new_low = tui_find_backward_disassembly_start_address (new_low); + new_low = tui_find_backward_disassembly_start_address (*map, new_low); if (new_low == prev_low) break; -- 2.51.0