From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id Se+DOkWasWrpuC4AWB0awg (envelope-from ) for ; Mon, 21 Sep 2026 16:57:41 -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=pC9gRQhV; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=62yYlwKh; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=xoNjq80f; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=muGkrHQ5; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id E8CE61E01F; Mon, 21 Sep 2026 16:57:41 -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 E9BEF1E01F for ; Mon, 21 Sep 2026 16:57:40 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7F8FF4B9DB55 for ; Mon, 21 Sep 2026 20:57:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7F8FF4B9DB55 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=pC9gRQhV; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=62yYlwKh; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=xoNjq80f; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=muGkrHQ5 Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2a07:de40:b251:101:10:150:64:2]) by sourceware.org (Postfix) with ESMTPS id 775F14BA9000 for ; Mon, 21 Sep 2026 20:56:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 775F14BA9000 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 775F14BA9000 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2a07:de40:b251:101:10:150:64:2 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790024176; cv=none; b=ZE/6096Ioi7GoccyzDUcIPzYsPA19NKt3Dl5tGddBlxqSq0qXVo2RKa5fIEVHTbGh0sZHeHXPgL9VZwUjxKoRuU2XnpiT40ntC69wtHe8CiWP4W8NFo1hUWD1e1bGti3Hnm1mgh6ffZdvoAC/pG3EdK9daf1S98qD71dUan38P0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790024176; c=relaxed/simple; bh=+Nz/eB0zEvZFJ5jcJgHFDWoxFU6cwA4BeQDpVYNZ1jI=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From: To:Subject:Date:Message-ID:MIME-Version; b=R19gxRHVXj0hrmiUubkJRvUEcQfl7RmqTEtX29YAHJvPloDug78R+5HAwtt/iVWi20J7uMWcrQvYmQpE5kMjipjiuCtTpAhIH6mSNjhbAUarF4Gprtq4uv/77+1cCLwC+ctSMPozZL6h5mXPUV8NArS6nshlcRPKF9flwPPh3M0= 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=pC9gRQhV; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=62yYlwKh; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=xoNjq80f; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=muGkrHQ5 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 775F14BA9000 Received: from imap1.dmz-prg2.suse.org (unknown [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-out2.suse.de (Postfix) with ESMTPS id 401C91FDA4 for ; Mon, 21 Sep 2026 20:56:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1790024171; 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=3uyaBX/uvaU6nLdVCUa0svemaPPCfoHfD+YoruXqcjY=; b=pC9gRQhVOY7eYqQw3Y6WTTC5OQLkAcevCcMySFaq14rtfSHQyRqhhkAHcHkl48usvDlN3k H8P12uzX/rx4IaIFvxjbn9bDz04hYZIDLx3ZVjhWEiritDOKpIThRLOGuWhU7JRmCiZiP+ 7ejTawCX8x1+W5kIcx3YbzNqjVGy6KY= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1790024171; 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=3uyaBX/uvaU6nLdVCUa0svemaPPCfoHfD+YoruXqcjY=; b=62yYlwKh6IMda+m9zSfzjp77vPTNGBKqzavEz9PYJxsRZHc2leQ7676SEaSAXBzY8Ro4oM 731StxWqrkPPRoAg== Authentication-Results: smtp-out2.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1790024167; 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=3uyaBX/uvaU6nLdVCUa0svemaPPCfoHfD+YoruXqcjY=; b=xoNjq80fQ/bEyF/9f3jgCZTELdbBDgSatZC7Rtb+pWxYxUSm9qKUkpuJpjNU5q/Kpz4iIK f2+eDSz4aFolDZZbZ+5tD6oi5clOCGjwh2FO49Vvs7tVgOEOaJ+8Ezy7W70S4npemGYLf5 jTxT517jYOIkNiLxJ0Dd0ID9vITyQD4= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1790024167; 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=3uyaBX/uvaU6nLdVCUa0svemaPPCfoHfD+YoruXqcjY=; b=muGkrHQ5p6CSiuHKzDqoVxmfZ92Yl6ctI1pguj/b3P9j+z866I0XRwrQJxMAgEm2BcRJtL wlmjzobEaVRnAgAQ== 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 EDB7F139EB for ; Mon, 21 Sep 2026 20:55:58 +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 7SRYDN6ZsWo9UQAAD6G6ig:T6 (envelope-from ) for ; Mon, 21 Sep 2026 20:55:58 +0000 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH v3 5/5] [gdb] Don't stop disassembly at section hole Date: Mon, 21 Sep 2026 22:55:57 +0200 Message-ID: <20260921205557.2706300-6-tdevries@suse.de> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260921205557.2706300-1-tdevries@suse.de> References: <20260921205557.2706300-1-tdevries@suse.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spamd-Result: default: False [-2.80 / 50.00]; BAYES_HAM(-3.00)[100.00%]; MID_CONTAINS_FROM(1.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; R_MISSING_CHARSET(0.50)[]; NEURAL_HAM_SHORT(-0.20)[-0.995]; MIME_GOOD(-0.10)[text/plain]; ARC_NA(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; RCVD_VIA_SMTP_AUTH(0.00)[]; MIME_TRACE(0.00)[0:+]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; PREVIOUSLY_DELIVERED(0.00)[gdb-patches@sourceware.org]; FROM_EQ_ENVFROM(0.00)[]; FROM_HAS_DN(0.00)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:mid,imap1.dmz-prg2.suse.org:helo]; RCVD_COUNT_TWO(0.00)[2]; TO_MATCH_ENVRCPT_ALL(0.00)[]; TO_DN_NONE(0.00)[]; RCVD_TLS_ALL(0.00)[] 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. Note that we don't run into this memory error with a live inferior, as demonstrated in the previous patch. 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. This also contains a small fix in tui_find_disassembly_address, to fix a regression in gdb.tui/tui-layout-asm-short-prog.exp. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34399 --- gdb/disasm.c | 55 ++++++++++++++++++++++++++++++++++++++++++-- gdb/disasm.h | 14 +++++++++++ gdb/tui/tui-disasm.c | 39 ++++++++++++++++++++----------- 3 files changed, 93 insertions(+), 15 deletions(-) diff --git a/gdb/disasm.c b/gdb/disasm.c index 9e8334b065e..f0c642b2367 100644 --- a/gdb/disasm.c +++ b/gdb/disasm.c @@ -1182,6 +1182,53 @@ gdb_disassembly_1 (struct gdbarch *gdbarch, struct ui_out *uiout, return num_displayed; } +/* See disasm.h. */ + +CORE_ADDR +disassemble_skip_sections (addrmap_mutable *map, CORE_ADDR pc, + struct obj_section *s, CORE_ADDR *range_low, + CORE_ADDR *range_high, int direction) +{ + if (s != nullptr) + return pc; + + struct obj_section *prev = nullptr, *next = nullptr; + CORE_ADDR prev_low, prev_high; + if (*range_low != 0) + prev + = (struct obj_section *)map->find (*range_low-1, &prev_low, &prev_high); + CORE_ADDR next_low, next_high; + if (*range_high != (CORE_ADDR)-1) + next + = (struct obj_section *)map->find (*range_high+1, &next_low, &next_high); + + bool section_hole + = prev != nullptr && next != nullptr && prev->objfile == next->objfile; + if (!section_hole) + return pc; + + if (target_has_registers ()) + { + /* Reading from the section hole doesn't trigger a memory error, so + don't skip it. */ + return pc; + } + + if (direction == 1) + { + *range_low = next_low; + *range_high = next_high; + return next_low; + } + else if (direction == -1) + { + *range_low = prev_low; + *range_high = prev_high; + return prev_high; + } + gdb_assert_not_reached (); +} + void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout, gdb_disassembly_flags flags, int how_many, @@ -1194,8 +1241,12 @@ 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 + = (struct obj_section *)map->find (low, &range_low, &range_high); + + low = disassemble_skip_sections (map.get (), low, s, &range_low, + &range_high); /* Don't disassemble past a section change. */ if (range_high != (CORE_ADDR)-1) diff --git a/gdb/disasm.h b/gdb/disasm.h index 57195564ca8..c73f15c204d 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,19 @@ struct disasm_insn unsigned int is_speculative:1; }; + +/* For an attempt to disassemble PC in section S (which may be nullptr) and + range [RANGE_LOW, RANGE_HIGH], skip over S if needed. + If so, return an updated PC and [RANGE_LOW, RANGE_HIGH]. + If DIRECTION == 1 disassemble forward, if DIRECTION == -1, disassemble + backward. */ + +extern CORE_ADDR disassemble_skip_sections (addrmap_mutable *map, CORE_ADDR pc, + struct obj_section *s, + CORE_ADDR *range_low, + CORE_ADDR *range_high, + int direction = 1); + extern void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout, gdb_disassembly_flags flags, int how_many, CORE_ADDR low, CORE_ADDR high); diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c index 26afc4bd978..2cfc9c9e838 100644 --- a/gdb/tui/tui-disasm.c +++ b/gdb/tui/tui-disasm.c @@ -179,8 +179,13 @@ 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); + + pc = disassemble_skip_sections (map.get (), pc, s, &range_low, + &range_high); + /* Don't disassemble past a section change. */ std::optional high_pc; @@ -206,7 +211,8 @@ 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) { @@ -214,9 +220,16 @@ tui_find_backward_disassembly_start_address (CORE_ADDR addr) return addr; } + CORE_ADDR range_low, range_high; + struct obj_section *s + = (struct obj_section *)map->find (addr - 1, &range_low, &range_high); + + addr = disassemble_skip_sections (map, addr - 1, s, &range_low, + &range_high, -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 (addr, nullptr, lookup_msym_prefer::TEXT, &msym_prev); if (msym.minsym != nullptr) @@ -224,13 +237,7 @@ tui_find_backward_disassembly_start_address (CORE_ADDR addr) else if (msym_prev.minsym != nullptr) return msym_prev.value_address (); - /* 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 @@ -290,16 +297,22 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from) different or not. */ CORE_ADDR prev_low; + std::unique_ptr map = section_addrmap (); + do { /* Find an address from which we can start disassembling. */ prev_low = new_low; - new_low = tui_find_backward_disassembly_start_address (new_low); + new_low = tui_find_backward_disassembly_start_address (map.get (), + new_low); /* Disassemble forward. */ next_addr = tui_disassemble (gdbarch, asm_lines, new_low, max_lines); if (asm_lines.empty ()) - break; + { + new_low = prev_low; + break; + } last_addr = asm_lines.back ().addr; /* If disassembling from the current value of NEW_LOW reached PC -- 2.51.0