| Message ID | 20241025033431.36274-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 C54B53858404 for <patchwork@sourceware.org>; Fri, 25 Oct 2024 03:35:40 +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 7CD363858D21 for <gdb-patches@sourceware.org>; Fri, 25 Oct 2024 03:35:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7CD363858D21 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 7CD363858D21 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=1729827303; cv=none; b=ITOxsqwtrAOt+pRwleDk36G1r/i0rxjtV/8sIHjFAexmHs2K9fZfrjgaKe0rs8Ny8QiJqTvL146xKjie1D/VuhzQRe1Hp5jmon95yaRHdrSZhdbawuqqQT1d6JF9X3S1pBaNC4OLHjHR4/kbMtPDsctM9QUHA8z1HVmSrz6vth0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1729827303; c=relaxed/simple; bh=wBNvyrYleKK8TRRVdSMyWP5TjS7fB/pqXkeM+v6/hYs=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=Yp5ed1R1i1eIR8FLalJAmEGCPn3LuWw55L1o3mk9Jl+nLxeDiTodrH+Eb5Bvsh474iHHESwDO+plgjWglooEuKKBzhVbgFQoFH+5nWgsMwHH0V/CKaNfv6D2/P+kQx7jo3/44S6nBp4HnwDQqdtbKTWEkUklot86DWtfBXjoxUI= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1729827301; 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=+Bj/kiiCVaxqkPFzDxq3F7Qd649KrXv7lnHjnXbX0jc=; b=JTZo1/h3xEmieecycYiRqXUG01zsqlaAwI91gAKlvBr5rKkTbDL8DUugYyAeQqhZyd/p6f uV8KBtxweFUZNTNilhaXaRZDHyR9eUagyp8eH7GNaEe9OQRPEYk2WK6zeJrKWZTndOPsCO ONSrwDvD9Y7pogoXYnxVUj9CWo8e/w4= Received: from mx-prod-mc-03.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-590-VEKG3FlaOj2szjdL4R-rng-1; Thu, 24 Oct 2024 23:34:59 -0400 X-MC-Unique: VEKG3FlaOj2szjdL4R-rng-1 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (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-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 1BA331956048 for <gdb-patches@sourceware.org>; Fri, 25 Oct 2024 03:34:59 +0000 (UTC) Received: from f41-1.lan (unknown [10.22.64.38]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 3DAB2300018D; Fri, 25 Oct 2024 03:34:58 +0000 (UTC) From: Kevin Buettner <kevinb@redhat.com> To: gdb-patches@sourceware.org Cc: Kevin Buettner <kevinb@redhat.com> Subject: [PATCH v3 00/11] GDB-internal TLS support for Linux targets Date: Thu, 24 Oct 2024 19:26:18 -0700 Message-ID: <20241025033431.36274-1-kevinb@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 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.9 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. 25, 2024, 2:26 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. When available, libthread_db support for TLS lookup is
still preferred/used since it should be more accurate. This means
that existing TLS support will still work as it did before - this new
TLS support will only be used when libthread_db TLS support is not
available. (Though it is possible to force internal TLS support to be
used via a new maintenance command).
Three of the commits in this series provide knowledge about how to
translate link map addresses to module ids and how to traverse various
TLS data structures. The latter problem is broken into two parts,
one which applies to all Linux architectures, and a second which
adds architecture specific knowledge about TLS data structures.
Translating link map addresses to module ids is tricky. In theory,
the module id 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 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 architectures, the
MUSL C library requires that a final adjustment be made 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 to
make it available in our git repo 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. That said,
should anyone wish to look into it, the commit showing how to do it
will be in our repo as well as on the mailing list.
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 include 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, I also tested with 32-bit variants:
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 show 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 or libthread_db support is used. I think it's
likely that it's a clang bug of which I can do nothing about (aside
from filing a bug report).
The v2 series fixed some problems in the gdb.base/tls-dlobj.exp test
found by the Linaro regression tester, tweaked a comment in
aarch64-linux-tdep.c, included a discussion of what TLS is in the
documentation patch, and renamed 'set force-internal-tls-address-lookup'
to be a maintenance command. Thanks to Luis and Eli for their
feedback on the v1 series. Thanks, too, to Linaro for regression
tester feedback.
This v3 series makes corrections to the documentation, as requested by
Eli.
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