From patchwork Fri Jul 21 22:33:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 124159 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9010:0:b0:3e4:2afc:c1 with SMTP id l16csp539829vqg; Fri, 21 Jul 2023 17:19:57 -0700 (PDT) X-Google-Smtp-Source: APBJJlHPhfgbLb59qG9HYcVJ/tn37HqF6OvYXsO9C65VR36D2lXs4GdngMMS7GQIovhr2rTYaTaU X-Received: by 2002:a17:906:2212:b0:98d:63c5:d132 with SMTP id s18-20020a170906221200b0098d63c5d132mr2884426ejs.72.1689985197644; Fri, 21 Jul 2023 17:19:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689985197; cv=none; d=google.com; s=arc-20160816; b=QVUDtNErRBg37RuwPjcst4UeQssm2qQkGLiwevGkP5c25Few2lVJRcg3nRukl18Cuz /gPjWsOwRC78al32JexUK7h0kCrGgzkrQoK0nOo1KwdNqVLR5fUM74BT7S0GfTWPoqYr 0u1qCTo3bMyggQ6VNiocjleDOQFpFIUf7SmRyHer/ufAmr6BeKT78w+kQj287CSBkiDe deMO4/echtCiJX7/i60BQL6M4OChRzZ1UtXoVpJlcoRXNc0pwhsbRydj6U7bKII5Bq0P 5hWtXDrLFa2kRYme5eb36YdcjtWroh/AEzTIItWRlu1JWgDF5zke4kur98j4peW3e6xE KinA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:mime-version:date :reply-to:dkim-signature; bh=USyIrgY7glI2I6Y1FEnoLFsj21yaEAeGNlnCwa16vxU=; fh=/arQ18khYFx5O2MpYLIljRz8i8trTguTwNxDsivkGMs=; b=lSVYJ8rnZwDCin0m/43SinHXYjVJlllOPSgwnYua69ggETq/orEdllENtC8bSJleV8 ey1XzQ5wzUUVJNQxgCeTw3lZ5dQNxzQTsHtDQLH7wN4wZ/0CxcTWIP3gyBY+9OAu/gjX FDDOQ0blneMGw+eJtM9fIIAkv9IZ1MmBVf3wmDakZeTROkBfg94X4ofno/AHnjy9u4Y+ Q4LCmu/GblNn5xHrtM4s1hzxd1bpHtACKVPvvCTg4/M5R1phy7LOLrhKjbDhrYEhIPxc +dOzQn0av5btEBhibcPJEFUiNkDLX9jHt0Hpld6cpuzPdaA2Wp9bVcbGvPNauNgyZqGC RrIQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20221208 header.b=ck1pTWUb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l17-20020a1709065a9100b00992f45c9350si2764378ejq.1018.2023.07.21.17.19.34; Fri, 21 Jul 2023 17:19:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20221208 header.b=ck1pTWUb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229576AbjGUWd6 (ORCPT + 99 others); Fri, 21 Jul 2023 18:33:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40128 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229846AbjGUWd4 (ORCPT ); Fri, 21 Jul 2023 18:33:56 -0400 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 943C43580 for ; Fri, 21 Jul 2023 15:33:55 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-5704995f964so25571157b3.2 for ; Fri, 21 Jul 2023 15:33:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689978835; x=1690583635; h=cc:to:from:subject:message-id:mime-version:date:reply-to:from:to:cc :subject:date:message-id:reply-to; bh=USyIrgY7glI2I6Y1FEnoLFsj21yaEAeGNlnCwa16vxU=; b=ck1pTWUbkvhYUxYB5e3viKVyP78tg8VHF5sR2juNPhLSnFq0EFHX1xxLtMdZ+DlJHv 53/ZCwbpK6IoS+/Gxs3zFHg/n/JJ+ZBUR/hLZDr7H+g4ZbMdK2oYX44p9KWLXISfiszC D2Ctel3HzQBxkhJy0RmGB4dvaF40UH2HQq3B6wEV3oddZVylMso+Y87Zf4PFRd891SKy 3KNFLw1jukABNrr0YMUU09sAsKYBtlDBZKlWrVXDI9KK6tbdrmTpH0vQPklpryYRKLLY 2i6keBlqyy/wOYi6IYGOQ65X03CutWtBYcMPgafqDrRpI3xA7Jni8BLbJDCOC5Tn/DGj B05w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689978835; x=1690583635; h=cc:to:from:subject:message-id:mime-version:date:reply-to :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=USyIrgY7glI2I6Y1FEnoLFsj21yaEAeGNlnCwa16vxU=; b=hx+bxl0BR3yTLbJXQj73W9c42tOkA/S9QKWZ5DmwEKtZRmPgavhVB8xZt1XbhF4wMz N1pBagmE6b9DyO68VNGVi3QEl0znIsiXWhaL7h70WMOXZdg4gbzWsg6o6Euzu/UydlYK JDqf512G1CXCSPo91bjV+iANZ5F1k3QBDMK/Zyl6h0fdgYVqEZptVwMRpl9MdMiVSq/X GhSpGRjDtsQssTa/XJqJj47MYTf1S1diLZiULZ61GDBGKIliNxIPCr3lzkAnw7io3hP3 W6xbup5Ux3qReSX82OY1lMSgGQsJdBHfDfkj7V/tDkpoDWQNkzSRWj4GTkNaUflkEhhS MAdg== X-Gm-Message-State: ABy/qLYfFvPci5paQ4V0uHS916UrlUqiYp0q1WyaN/Rb2ZfadLfaGH2q uZ7CNaiW8ZaIOahhaZEi1Do3akrvZ6k= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:6902:24a:b0:cea:fb07:7629 with SMTP id k10-20020a056902024a00b00ceafb077629mr22897ybs.10.1689978834851; Fri, 21 Jul 2023 15:33:54 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 21 Jul 2023 15:33:52 -0700 Mime-Version: 1.0 X-Mailer: git-send-email 2.41.0.487.g6d72f3e995-goog Message-ID: <20230721223352.2333911-1-seanjc@google.com> Subject: [PATCH] selftests/rseq: Play nice with binaries statically linked against glibc 2.35+ From: Sean Christopherson To: Mathieu Desnoyers , Peter Zijlstra , "Paul E. McKenney" , Boqun Feng Cc: linux-kernel@vger.kernel.org, Aaron Lewis , kvm@vger.kernel.org, Sean Christopherson X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1772077919047470013 X-GMAIL-MSGID: 1772077919047470013 To allow running rseq and KVM's rseq selftests as statically linked binaries, initialize the various "trampoline" pointers to point directly at the expect glibc symbols, and skip the dlysm() lookups if the rseq size is non-zero, i.e. the binary is statically linked *and* the libc registered its own rseq. Define weak versions of the symbols so as not to break linking against libc versions that don't support rseq in any capacity. The KVM selftests in particular are often statically linked so that they can be run on targets with very limited runtime environments, i.e. test machines. Fixes: 233e667e1ae3 ("selftests/rseq: Uplift rseq selftests for compatibility with glibc-2.35") Cc: Aaron Lewis Cc: kvm@vger.kernel.org Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson Reviewed-by: Mathieu Desnoyers --- Note, this is very much the result of throwing noodles until something stuck, it seems like there's gotta be a less awful way to handle this :-( I Cc'd stable@ because I know I'm not the only person that runs statically linked KVM selftests, and figuring all this out was quite painful. tools/testing/selftests/rseq/rseq.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) base-commit: 88bb466c9dec4f70d682cf38c685324e7b1b3d60 diff --git a/tools/testing/selftests/rseq/rseq.c b/tools/testing/selftests/rseq/rseq.c index 4e4aa006004c..a723da253244 100644 --- a/tools/testing/selftests/rseq/rseq.c +++ b/tools/testing/selftests/rseq/rseq.c @@ -34,9 +34,17 @@ #include "../kselftest.h" #include "rseq.h" -static const ptrdiff_t *libc_rseq_offset_p; -static const unsigned int *libc_rseq_size_p; -static const unsigned int *libc_rseq_flags_p; +/* + * Define weak versions to play nice with binaries that are statically linked + * against a libc that doesn't support registering its own rseq. + */ +__weak ptrdiff_t __rseq_offset; +__weak unsigned int __rseq_size; +__weak unsigned int __rseq_flags; + +static const ptrdiff_t *libc_rseq_offset_p = &__rseq_offset; +static const unsigned int *libc_rseq_size_p = &__rseq_size; +static const unsigned int *libc_rseq_flags_p = &__rseq_flags; /* Offset from the thread pointer to the rseq area. */ ptrdiff_t rseq_offset; @@ -155,9 +163,17 @@ unsigned int get_rseq_feature_size(void) static __attribute__((constructor)) void rseq_init(void) { - libc_rseq_offset_p = dlsym(RTLD_NEXT, "__rseq_offset"); - libc_rseq_size_p = dlsym(RTLD_NEXT, "__rseq_size"); - libc_rseq_flags_p = dlsym(RTLD_NEXT, "__rseq_flags"); + /* + * If the libc's registered rseq size isn't already valid, it may be + * because the binary is dynamically linked and not necessarily due to + * libc not having registered a restartable sequence. Try to find the + * symbols if that's the case. + */ + if (!*libc_rseq_size_p) { + libc_rseq_offset_p = dlsym(RTLD_NEXT, "__rseq_offset"); + libc_rseq_size_p = dlsym(RTLD_NEXT, "__rseq_size"); + libc_rseq_flags_p = dlsym(RTLD_NEXT, "__rseq_flags"); + } if (libc_rseq_size_p && libc_rseq_offset_p && libc_rseq_flags_p && *libc_rseq_size_p != 0) { /* rseq registration owned by glibc */