Message ID | 20241012024220.101084-1-kevinb@redhat.com |
---|---|
Headers |
Return-Path: <gdb-patches-bounces~patchwork=sourceware.org@sourceware.org> X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A2E14385AC3F for <patchwork@sourceware.org>; Sat, 12 Oct 2024 02:43:35 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id A67233858D26 for <gdb-patches@sourceware.org>; Sat, 12 Oct 2024 02:43:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A67233858D26 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A67233858D26 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1728700987; cv=none; b=uPCAAbik3OEUNqbKUNs5j7cKGWvKC0/cdZW9hIpQnn/7kx3ZbHiz5L2WKljS6bmDrC9hXoCiMQBlx7/LYmyzhwwpiXSFNVz6zFK7/yOGHYHPJi7KWppd+Trrp1Avkn0CmmQaNRjcmmDUVBYPZyjRFpkMg+hHOuslBNYaS0IPbRk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1728700987; c=relaxed/simple; bh=XOnOHLSqvqhXb6iPhFqrMI1JsXsdC95wSwgZz32scpA=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=iyuCbq2VXW7z37GFf1zP+lz5JcevETEEsPP2y3I+nfYmqGVuG2JqQ9zVKcAV0kFSf9O3SRiXNYsrP09qdhwHNjAwa7cBu9WHrMm5eeocQdFNNHuv02g8vwl2p0vG2t+XFHIVsEDIID295pmgmIUfFI0cL6adDM52+HidQwp+RgY= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1728700984; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=oP2cvBb8TBwTXJLIIBUSFeHJr69SEf7Rv9hk3caLb7o=; b=QJ4taf+TaA/cxesjEXL06WbfaYMwOtgiyyT3Nk4HQyty6CBpUt2v+UsvaUjX4QedR9HXe5 +Yj7nFzpNPTF/awAZCpiEK1UC5/u8Bqgcen5nXw753k7INnbL0tcVe7z2JRfv4mlIQXgVC g6d26FpmOa4Z/OS3hgvjxjPthSjSXQI= Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-42-o0fzjjGEPPOks5sa3skhpQ-1; Fri, 11 Oct 2024 22:43:02 -0400 X-MC-Unique: o0fzjjGEPPOks5sa3skhpQ-1 Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id E864219560AF for <gdb-patches@sourceware.org>; Sat, 12 Oct 2024 02:43:01 +0000 (UTC) Received: from f41-1.lan (unknown [10.22.64.14]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 1AACE19560AA; Sat, 12 Oct 2024 02:43:00 +0000 (UTC) From: Kevin Buettner <kevinb@redhat.com> To: gdb-patches@sourceware.org Cc: Kevin Buettner <kevinb@redhat.com> Subject: [PATCH v2 00/11] GDB-internal TLS support for Linux targets Date: Fri, 11 Oct 2024 19:32:41 -0700 Message-ID: <20241012024220.101084-1-kevinb@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, 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: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list <gdb-patches.sourceware.org> List-Unsubscribe: <https://sourceware.org/mailman/options/gdb-patches>, <mailto:gdb-patches-request@sourceware.org?subject=unsubscribe> List-Archive: <https://sourceware.org/pipermail/gdb-patches/> List-Post: <mailto:gdb-patches@sourceware.org> List-Help: <mailto:gdb-patches-request@sourceware.org?subject=help> List-Subscribe: <https://sourceware.org/mailman/listinfo/gdb-patches>, <mailto:gdb-patches-request@sourceware.org?subject=subscribe> Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org |
Series |
GDB-internal TLS support for Linux targets
|
|
Message
Kevin Buettner
Oct. 12, 2024, 2:32 a.m. UTC
This series of commits adds internal TLS lookup support to GDB for the following Linux target architectures: x86_64, aarch64, ppc64, s390x, and riscv. It does this by providing knowledge about how to translate link map addresses to module ids and how to traverse various TLS data structures. Translating link map addresses to module ids is tricky. In theory, this value is available in the link map data structure, but it's not part of the ABI. I ended up implementing two mechanisms for doing this mapping, one for MUSL, and one for GLIBC. For both of these, I think the method that I used is less fragile than attempting to use an offset to the module id field for a current versions of these libraries. Traversing TLS data structures starts with obtaining the value of the thread register (or registers for S390X), then finding the field containing the DTV (dynamic thread vector) address within the TCB (thread control block), then using the module id as an index into the DTV in order to obtain the TLS block. For some C libraries (MUSL, but only on certain architectures), a final adjustment may be needed to obtain the actual address of the TLS block. This patch set also shows how internal TLS support might be added for i386, however, due to problems with accessing the gsbase register, it doesn't work, so the commit which adds this potential support is then immediately deleted in the next commit. The point of doing this is so that it's available to anyone who wishes to work on i386 support. IMO, it's not worth doing without also doing corresponding ptrace work in the kernel. I think this would have been worth doing back in the i386 heyday, but is not worth doing now. The details for traversing the TLS data structures differ not only between architectures, but also depends upon the C library with which the executable being debugged has been linked. The internal TLS support in this series is known to work with GLIBC versions 2.27 thru 2.40.9000 and MUSL versions 1.1.24, 1.2.3 and 1.2.5. For MUSL, the support provided by this series provides new debugging functionality that didn't exist before - it will now be possible to examine TLS variables in programs linked against MUSL. (It didn't work before due to MUSL not implementing the libthread_db library.) I've done regression testing on recent Fedora versions for all five architectures. Bugs were found and fixed during that testing. Once that was done, I did even more testing, using a limited number of tests. These are the new tests that I've added, plus those tests with which regression testing identified some problems. The list is: TESTS="gdb.base/tls-dlobj.exp gdb.base/tls-nothreads.exp \ gdb.base/tls-multiobj.exp gdb.threads/tls.exp \ gdb.server/no-thread-db.exp" I tested using targets: unix, native-gdbserver, native-extended-gdbserver, and, for x86_64 targets: unix/-m32, native-gdbserver/-m32, and native-extended-gdbserver/-m32 I also tested with no CC_FOR_TARGET (which defaults to gcc), CC_FOR_TARGET=musl-gcc, and CC_FOR_TARGET=clang. On Fedora, using CC_FOR_TARGET=musl-gcc causes the program and libraries to be compiled with gcc, but linked against the MUSL C library. I didn't use this option on non-Fedora machines, though my Void linux testing tested using the MUSL library since that's what's installed in that test environment. I also ran additional tests using check-read1 for combos with no CC_FOR_TARGET. Using all sensible combinations of the above, I tested on 13 machines / 5 architectures: x86_64 / Fedora 28 / glibc-2.27 x86_64 / Fedora 34 / glibc-2.33 / musl-libc-1.2.3 x86_64 / Fedora 35 / glibc-2.34 / musl-libc-1.2.3 x86_64 / Fedora 40 / glibc-2.39 / musl-libc-1.2.5 x86_64 / Fedora 41 / glibc-2.40 / musl-libc-1.2.5 x86_64 / rawhide (fc42) / glibc-2.40.9000 / musl-libc-1.2.5 x86_64 / OpenSuse Leap 15.5 / glibc-2.31 / no musl x86_64 / Ubuntu 22.04 / glibc-2.35 / no musl x86_64 / void - 2024-03-14 / no glibc / musl 1.1.24 aarch64 / Fedora 40 / glibc-2.39 / musl-libc-1.2.5 riscv / Fedora 40 / glibc-2.39 / musl-libc-1.2.5 ppc64le / Fedora 41 / glibc-2.40 / musl-libc-1.2.5 s390x / Fedora 40 / glibc-2.39 / musl-libc-1.2.5 The point of testing old Fedora releases is to be able to test older glibc versions. In particular glibc-2.33 and earlier had pthread functionality split into libpthread.so while glibc-2.34 and later place it into libc proper. All of the testing went well except on riscv and s390x with CC_FOR_TARGET=clang. That's six test runs total, and they each show 799 FAILs. The test results shows that riscv mostly prints the wrong answer and that s390x shows output like "Cannot access memory at address 0x3fff8d494e8". But this happens regardless of whether internal TLS support is used or libthread_db support. I think it's likely that it's a clang bug which I can do nothing about (aside from filing a bug report). This v2 series will hopefully fix some problems in the gdb.base/tls-dlobj.exp test found by the Linaro regression tester, tweaks a comment in aarch64-linux-tdep.c, includes a discussion of what TLS is in the documentation patch, and renames the 'set force-internal-tls-address-lookup' to be a maintenance command. Thanks to Luis and Eli for their feedback on the v1 series. Thanks to Linaro, too, for regression tester feedback. Kevin Buettner (11): Don't attempt to find TLS address when target has no registers Allow TLS access to work in gdb.server/no-thread-db.exp Track and fetch TLS module ids for MUSL and GLIBC Implement internal TLS address lookup for Linux targets Internal TLS support for aarch64, x86_64, riscv, ppc64, and s390x Internal, but disabled, TLS support for i386 Delete disabled i386 internal TLS support New test - gdb.base/tls-nothreads.exp New test - gdb.base/tls-multiobj.exp New test - gdb.base/tls-dlobj.exp Add TLS NEWS entry and document 'set force-internal-tls-address-lookup' command gdb/NEWS | 20 ++ gdb/aarch64-linux-tdep.c | 55 ++++ gdb/amd64-linux-tdep.c | 37 +++ gdb/doc/gdb.texinfo | 50 +++ gdb/findvar.c | 7 +- gdb/linux-tdep.c | 211 ++++++++++++ gdb/linux-tdep.h | 36 +++ gdb/minsyms.c | 8 +- gdb/ppc-linux-tdep.c | 62 ++++ gdb/riscv-linux-tdep.c | 78 +++++ gdb/s390-linux-tdep.c | 43 +++ gdb/solib-svr4.c | 203 +++++++++++- gdb/solib-svr4.h | 12 + gdb/testsuite/gdb.base/tls-common.exp.tcl | 50 +++ gdb/testsuite/gdb.base/tls-dlobj-lib.c | 87 +++++ gdb/testsuite/gdb.base/tls-dlobj.c | 311 ++++++++++++++++++ gdb/testsuite/gdb.base/tls-dlobj.exp | 378 ++++++++++++++++++++++ gdb/testsuite/gdb.base/tls-multiobj.c | 89 +++++ gdb/testsuite/gdb.base/tls-multiobj.exp | 230 +++++++++++++ gdb/testsuite/gdb.base/tls-multiobj1.c | 26 ++ gdb/testsuite/gdb.base/tls-multiobj2.c | 26 ++ gdb/testsuite/gdb.base/tls-multiobj3.c | 26 ++ gdb/testsuite/gdb.base/tls-nothreads.c | 57 ++++ gdb/testsuite/gdb.base/tls-nothreads.exp | 248 ++++++++++++++ gdb/testsuite/gdb.server/no-thread-db.exp | 4 +- 25 files changed, 2347 insertions(+), 7 deletions(-) create mode 100644 gdb/testsuite/gdb.base/tls-common.exp.tcl create mode 100644 gdb/testsuite/gdb.base/tls-dlobj-lib.c create mode 100644 gdb/testsuite/gdb.base/tls-dlobj.c create mode 100644 gdb/testsuite/gdb.base/tls-dlobj.exp create mode 100644 gdb/testsuite/gdb.base/tls-multiobj.c create mode 100644 gdb/testsuite/gdb.base/tls-multiobj.exp create mode 100644 gdb/testsuite/gdb.base/tls-multiobj1.c create mode 100644 gdb/testsuite/gdb.base/tls-multiobj2.c create mode 100644 gdb/testsuite/gdb.base/tls-multiobj3.c create mode 100644 gdb/testsuite/gdb.base/tls-nothreads.c create mode 100644 gdb/testsuite/gdb.base/tls-nothreads.exp