From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id kIhqIIIGhGo9ei4AWB0awg (envelope-from ) for ; Tue, 18 Aug 2026 03:15:14 -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=Q6KzeyPQ; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=cmaI46bd; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=kwhyy59s; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=EspZML2S; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 6225A1E166; Tue, 18 Aug 2026 03:15:14 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.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 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 CC54C1E033 for ; Tue, 18 Aug 2026 03:15:11 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 405704BA2E23 for ; Tue, 18 Aug 2026 07:15:11 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 405704BA2E23 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=Q6KzeyPQ; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=cmaI46bd; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=kwhyy59s; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=EspZML2S 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 68EF84BA2E13 for ; Tue, 18 Aug 2026 07:14:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 68EF84BA2E13 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 68EF84BA2E13 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=1787037285; cv=none; b=t+2TiMmX7krwHxcqLx7svpLPpkHO4QoIS69TSXA/xbvW/LfI8BSvy/1RoZJe66IdGP39gk3CK2KJeYcsdiGBgUVAUsJCF39HGRFogKPi9CEHmp8YA7XT13f2G/xkHc8cdo3YKIZtH0T47I3ZoYHB0XL1sPSogKLQgFWWYFYBo/g= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1787037285; c=relaxed/simple; bh=ur//n5Use+wmfXCJTLoxpWA8i5brSCmHNtIOz4wEI9c=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From: To:Subject:Date:Message-ID:MIME-Version; b=EZbXlh3W8rbi1c1/z5z0x55S+mmigEFo4LG1Eaidl2Z8GmoA981rA6dskD02UGjXrze0L8gEX13Nf4801duyp7joxQL71jvuCZjVdn4K86kCrO8SrHZnnmrRAWheXmiGaQFwVkXuFn4L1N1cVhlxX/jvD8g/qaDVK2CXuK+7YDs= 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=Q6KzeyPQ; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=cmaI46bd; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=kwhyy59s; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=EspZML2S DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 68EF84BA2E13 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-out1.suse.de (Postfix) with ESMTPS id 40B408440B for ; Tue, 18 Aug 2026 07:14:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1787037279; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=ZZnw0oo9PamRu8EpFRs/ad4nPNUx9C/sRhhmwcfuFJM=; b=Q6KzeyPQCzWRsNLa79qPtJAooTDJKMFSdjmfl5K77MmKxU1Du4MmfyuoFUp7DeeUYxNdW3 rNikrPLDojA+5oV45JMBXRh1lD1ajcEUBFTVJo+V1v3RCW03NHNL8G8QFDYTC2xTvduano TZ0qrmvMfk6vgKg2GKNehE5gFmjcLIY= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1787037279; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=ZZnw0oo9PamRu8EpFRs/ad4nPNUx9C/sRhhmwcfuFJM=; b=cmaI46bdLQJWJ25r1Q5BxZCLoFKIL7nGls075hMMNSnsHs3vcApMHiRdQQhTpPDN2IuMxD GxLuhycoEt9QN3Ag== Authentication-Results: smtp-out1.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1787037275; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=ZZnw0oo9PamRu8EpFRs/ad4nPNUx9C/sRhhmwcfuFJM=; b=kwhyy59sviEUU83qAnr7y3mB16AhcyOw9eRgL4zSYd80Bgl63C2HglYj+TBUCdvLOE3Z3C 38qlEjM4xG2WIEKyXcQDNhAXNE35sdnr/aPY7g0UHWvN+b7UjotSkJJwEaALQLBKg+hG3E dwiOcpDOjfAdGLE+rGSekrocwMVgra0= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1787037275; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=ZZnw0oo9PamRu8EpFRs/ad4nPNUx9C/sRhhmwcfuFJM=; b=EspZML2SrxDkPIuVm9B/Fks9F5zwOb+xxtKa9s0AAJf/qWOkc5IIokVwHorcNlvYwzuOOf eeAVaoBkLEqEFxDg== 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 2BD0622BA for ; Tue, 18 Aug 2026 07:14:35 +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 Q+l6CVsGhGpTTQAAD6G6ig (envelope-from ) for ; Tue, 18 Aug 2026 07:14:35 +0000 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [RFC] [gdb] Work around zero l_addr/l_ld Date: Tue, 18 Aug 2026 09:14:34 +0200 Message-ID: <20260818071434.2121734-1-tdevries@suse.de> X-Mailer: git-send-email 2.51.0 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)[-1.000]; 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)[ld.so:url,lm.data:url,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 On ppc64le-linux (AlmaLinux 9.8), I run into: ... FAIL: gdb.mi/mi-dlmopen.exp: still-in-use fields were all correct ... While investigating this, I stumbled on this warning emitted during the calculation of allow_dlmopen_tests: ... (gdb) run ^M Starting program: allow_dlmopen_tests.x ^M [Thread debugging using libthread_db enabled]^M Using host libthread_db library "/lib64/libthread_db.so.1".^M warning: .dynamic section for "/lib64/ld64.so.2" is not at the expected \ address (wrong library or version mismatch?)^M dlmopen debug supported.^M ... The warning is mentioned in this glibc commit 88361b408b: ... elf: Copy l_addr/l_ld when adding ld.so to a new namespace When add ld.so to a new namespace, we don't actually load ld.so. We create a new link map and refers the real one for almost everything. Copy l_addr and l_ld from the real ld.so link map to avoid GDB warning: warning: .dynamic section for ".../elf/ld-linux-x86-64.so.2" is not at \ the expected address (wrong library or version mismatch?) when handling shared library loaded by dlmopen. ... So, AFAICT the setup is: - the glibc package is based on v2.34 - it contains a backport of commit a93d9e03a3 ("Extend struct r_debug to support multiple namespaces [BZ #15971]") - it doesn't contain a backport of commit 88361b408b ("elf: Copy l_addr/l_ld when adding ld.so to a new namespace") - both commits are part of v2.35 What happens is: - when probing for l_addr and l_ld in svr4_solib_ops::read_lm_info, both get the value 0 - in svr4_solib_ops::lm_addr_check, the 0 value propagates to l_dynaddr, and "l_addr = l_dynaddr - dynaddr" then underflows, and things go downhill from there, resulting in the warning and eventually the FAIL. Fix this by replicating the missing glibc commit in svr4_solib_ops::read_lm_info. I've enabled the fix only for the configuration I can test, for all others I disabled it using "lmo.l_real_offset = -1". This is an RFC. My question is: is the added complexity worth the trouble for what looks like a cornercase? [ FTR, in an earlier attempt I proposed to deal with the FAIL using an xfail [1]. ] Tested on ppc64le-linux and x86_64-linux. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33662 [1] https://sourceware.org/pipermail/gdb-patches/2026-July/229073.html --- gdb/mips-fbsd-tdep.c | 1 + gdb/mips-netbsd-tdep.c | 1 + gdb/solib-svr4-linux.c | 6 ++-- gdb/solib-svr4.c | 67 +++++++++++++++++++++++++++++++----------- gdb/solib-svr4.h | 4 +++ 5 files changed, 60 insertions(+), 19 deletions(-) diff --git a/gdb/mips-fbsd-tdep.c b/gdb/mips-fbsd-tdep.c index ecad943e8fa..65278937415 100644 --- a/gdb/mips-fbsd-tdep.c +++ b/gdb/mips-fbsd-tdep.c @@ -571,6 +571,7 @@ mips_fbsd_lp64_solib_ops::fetch_link_map_offsets () const lmo.l_ld_offset = 24; lmo.l_next_offset = 32; lmo.l_prev_offset = 40; + lmo.l_real_offset = -1; } return lmp; diff --git a/gdb/mips-netbsd-tdep.c b/gdb/mips-netbsd-tdep.c index a5bcde20e46..79b1a3cedee 100644 --- a/gdb/mips-netbsd-tdep.c +++ b/gdb/mips-netbsd-tdep.c @@ -333,6 +333,7 @@ mips_nbsd_ilp32_svr4_solib_ops::fetch_link_map_offsets () const lmo.l_ld_offset = 12; lmo.l_next_offset = 16; lmo.l_prev_offset = 20; + lmo.l_real_offset = -1; } return lmp; diff --git a/gdb/solib-svr4-linux.c b/gdb/solib-svr4-linux.c index 2d36adcca73..e67f3036df7 100644 --- a/gdb/solib-svr4-linux.c +++ b/gdb/solib-svr4-linux.c @@ -53,6 +53,7 @@ linux_ilp32_svr4_solib_ops::fetch_link_map_offsets () const lmo.l_ld_offset = 8; lmo.l_next_offset = 12; lmo.l_prev_offset = 16; + lmo.l_real_offset = -1; } return lmp; @@ -85,13 +86,14 @@ linux_lp64_svr4_solib_ops::fetch_link_map_offsets () const lmo.r_ldsomap_offset = -1; lmo.r_next_offset = 40; - /* Everything we need is in the first 40 bytes. */ - lmo.link_map_size = 40; + /* Everything we need is in the first 48 bytes. */ + lmo.link_map_size = 48; lmo.l_addr_offset = 0; lmo.l_name_offset = 8; lmo.l_ld_offset = 16; lmo.l_next_offset = 24; lmo.l_prev_offset = 32; + lmo.l_real_offset = 40; } return lmp; diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 8e3de4d3ea1..02a20f000d4 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -189,27 +189,58 @@ svr4_solib_ops::read_lm_info (CORE_ADDR lm_addr, CORE_ADDR debug_base) const gdb::byte_vector lm (lmo->link_map_size); if (target_read_memory (lm_addr, lm.data (), lmo->link_map_size) != 0) - warning (_("Error reading shared library list entry at %s"), - paddress (current_inferior ()->arch (), lm_addr)); - else { - type *ptr_type - = builtin_type (current_inferior ()->arch ())->builtin_data_ptr; + warning (_("Error reading shared library list entry at %s"), + paddress (current_inferior ()->arch (), lm_addr)); + return lm_info; + } + + type *ptr_type + = builtin_type (current_inferior ()->arch ())->builtin_data_ptr; + + lm_info = std::make_unique (debug_base); + lm_info->lm_addr = lm_addr; - lm_info = std::make_unique (debug_base); - lm_info->lm_addr = lm_addr; - - lm_info->l_addr_inferior = extract_typed_address (&lm[lmo->l_addr_offset], - ptr_type); - lm_info->l_ld = extract_typed_address (&lm[lmo->l_ld_offset], ptr_type); - lm_info->l_next = extract_typed_address (&lm[lmo->l_next_offset], - ptr_type); - lm_info->l_prev = extract_typed_address (&lm[lmo->l_prev_offset], - ptr_type); - lm_info->l_name = extract_typed_address (&lm[lmo->l_name_offset], - ptr_type); + lm_info->l_addr_inferior + = extract_typed_address (&lm[lmo->l_addr_offset], ptr_type); + lm_info->l_ld = extract_typed_address (&lm[lmo->l_ld_offset], ptr_type); + lm_info->l_next = extract_typed_address (&lm[lmo->l_next_offset], ptr_type); + lm_info->l_prev = extract_typed_address (&lm[lmo->l_prev_offset], ptr_type); + lm_info->l_name = extract_typed_address (&lm[lmo->l_name_offset], ptr_type); + + if (lmo->l_real_offset == -1) + return lm_info; + CORE_ADDR l_real = extract_typed_address (&lm[lmo->l_real_offset], ptr_type); + + if (l_real == lm_addr) + return lm_info; + + /* We have l_real != lm_addr, so l_real points to the link map of ld.so. */ + + if (!(lm_info->l_addr_inferior == 0 && lm_info->l_ld == 0)) + return lm_info; + + /* We have l_addr_inferior == 0 and l_ld == 0. This can happen with a glibc + that: + - has commit a93d9e03a3 ("Extend struct r_debug to support multiple + namespaces [BZ #15971]"), but + - misses commit 88361b408b ("elf: Copy l_addr/l_ld when adding ld.so to a + new namespace"). + This seems to be the case at least for the alma linux 9.8 BaseOS version, + which uses glibc v2.34 and backports only the first commit. + Fix / work around this here by replicating the copy of ld_addr/l_ld. */ + + if (target_read_memory (l_real, lm.data (), lmo->link_map_size) != 0) + { + warning (_("Error reading shared library list entry at %s"), + paddress (current_inferior ()->arch (), l_real)); + return lm_info; } + lm_info->l_addr_inferior = extract_typed_address (&lm[lmo->l_addr_offset], + ptr_type); + lm_info->l_ld = extract_typed_address (&lm[lmo->l_ld_offset], ptr_type); + return lm_info; } @@ -3537,6 +3568,7 @@ ilp32_svr4_solib_ops::fetch_link_map_offsets () const lmo.l_ld_offset = 8; lmo.l_next_offset = 12; lmo.l_prev_offset = 16; + lmo.l_real_offset = -1; } return lmp; @@ -3586,6 +3618,7 @@ lp64_svr4_solib_ops::fetch_link_map_offsets () const lmo.l_ld_offset = 16; lmo.l_next_offset = 24; lmo.l_prev_offset = 32; + lmo.l_real_offset = -1; } return lmp; diff --git a/gdb/solib-svr4.h b/gdb/solib-svr4.h index 3078a092778..83d65842faa 100644 --- a/gdb/solib-svr4.h +++ b/gdb/solib-svr4.h @@ -207,6 +207,10 @@ struct link_map_offsets /* Offset to l_name field in struct link_map. */ int l_name_offset; + + /* Offset to l_real field in struct link_map. Available since glibc + version v2.3.4. */ + int l_real_offset; }; /* Set the gdbarch methods for SVR4 systems. */ base-commit: e189bfd9b492a0361a37858b9a4709a52a92c803 -- 2.51.0