Received: by 2002:ab2:6857:0:b0:1ef:ffd0:ce49 with SMTP id l23csp2560209lqp; Mon, 25 Mar 2024 02:37:01 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCWz+Sw6QVnvYWRexfeelPzZf2+AfxC2bbDHailGibgV/XmZzBZMAzzHc02dsThZwhMeXS3xDkGzJrXEo1s3XZSfN8bfowffdtRflZgX2Q== X-Google-Smtp-Source: AGHT+IEcaOVYyG7/JZnCMOhd35pSOhV9cir7zhnAuUKMwRm+3HaFtcRWLA2SOz/m1bz/LCnc5h+X X-Received: by 2002:a05:620a:5a54:b0:78a:1585:5c75 with SMTP id wx20-20020a05620a5a5400b0078a15855c75mr7100572qkn.57.1711359421228; Mon, 25 Mar 2024 02:37:01 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711359421; cv=pass; d=google.com; s=arc-20160816; b=bJwZPK3iwad4EjUOpcJNHccn7MpzuRRHSVfXLcWU2RQb86El6s5jsECIBPeHIzqoFg xu5q18skjGfBTMpocuJjubYv/fSSHO3idZPgQkiCrRKEyrOHJ0N0Sy9YiSSpOMs2FDm6 MaN7wOVw2VZOyT0U5phs1eHZXh4oexuL0C9qLaf/8IPFFyL2mTUJrJSwqTtDFq0Nb2ZB SqSNJLtuQqG0c0csYlpAlhEpI5+22STfOMrBkdhDhly389l2dV/mMYWI/kOeCUGWzZdQ +BMn4rLY6ZR3D8daHY/nuSGOErFew/26h0sqyCTRsVpqoHIaEdku2AXQO81/e2evSIVf nr5w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=MJ2JRx5VRw9ZrOgmokqhiM4IhRlHQI8tK9tBa/IJxr8=; fh=o+TPYCDt40u1AhKD1jdLzzTUsEowa2DDKnmvr+X1Ymw=; b=nDQiOWf2s10WUwF3XpULCLTYBxTWxQBoOJ2M/rzoEyvCPGyUlhpyLP4PWmxImwHKI8 f7tiYaUaHKC4ROuzLeYNHH8OIKGK38Ab3wF+K6TQAtjqrO+DeL8PyN2e4GFWMPr/7HTa 4OgfhhIXNRWKKReVkuRlrKvvLlsTePtbXxzYUkXzy+vsNb2FED1HKS1w4T/aDFwQ5+qN T7s8S5enXDE6NMjBMRrqBRjjL8766tLQ9yQQDiCwH/TbpV55QRMuPLjgf1G5qD5tfusm fjKaPSG53xmobt4NjuZTcXEbkQ/qsorQUrELSrT1qJgIv+uPdzO7iNvov8HMawZ4CF65 hOkw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=C+UfblO8; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-115865-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-115865-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id xz19-20020a05620a5e1300b0078a531ed264si2409992qkn.23.2024.03.25.02.37.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Mar 2024 02:37:01 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-115865-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=C+UfblO8; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-115865-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-115865-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id CDFEB1C236C8 for ; Mon, 25 Mar 2024 09:37:00 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BB3B31591E6; Mon, 25 Mar 2024 03:02:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="C+UfblO8" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B274B146007; Sun, 24 Mar 2024 23:14:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711322062; cv=none; b=IUoxoL7G5A1GHt+jbeR3oxRaWthlT6awG+fBrTVYAzjvardPRQ6oeL1raQwZi8JmBIecbmyKO3tKsrLuyA3rru+BdVC4d5z9RQAQTbnT2np+xCecoRIRxWiGItzj43ZySWL7TQWBoimIc/QpxXwdPklZczIjsB0bhsqk5hOtHHI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711322062; c=relaxed/simple; bh=IKfUU9OC5bJVKbMInNWVqAMAlZzw+DIycbNZ2pOCyqc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=palS5FMo0FHPgw66aqRdnLW09wMHA9dCRu6AJuFELRUQPApvSdKClRiUC/D0Mx7JLpinWXNXDKQwQ9lJWsC98x+VfvfWN4hfumndYB1Kl9R7GvaVOPXF62Nyubb79CF9S+SXWPxfvnhfQiNAbw/K9VjnKbC5uWLMRBK8BnAcHkU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=C+UfblO8; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id A5ABFC43390; Sun, 24 Mar 2024 23:14:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1711322061; bh=IKfUU9OC5bJVKbMInNWVqAMAlZzw+DIycbNZ2pOCyqc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=C+UfblO8cMWeqtx14rvkSZfueaqH4+IyUkq33NeDocOLJZn9qAbHIkOn68Okg8ghs Z1SRhkRAGJ1EZbE90ne+sRJwRKWt7qjEuiaCW4LiIzN3i+SKKu43ZgYpwkI6Rsct9x azbrTJEq+UTV+oMn62rqYuCLSI6qxTF/Jogz6UJ9zcWCzxXaLJe3/pyqKo4swwvAxJ 2j4b2sjQUd3s5Ds6stJYb7/KfUL45Ws/fcT2x7yCugLDr0NdmRrRv8McySvnaFpWPa oAHqxlwKMuQwivKksfOCDSdc9o4Znee0i+IxNWvcIe/OpgQnuKOiLkFPRT09sJGCCl Tc52rFWwwho+Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Viktor Malik , Andrii Nakryiko , Sasha Levin Subject: [PATCH 6.1 134/451] tools/resolve_btfids: Fix cross-compilation to non-host endianness Date: Sun, 24 Mar 2024 19:06:50 -0400 Message-ID: <20240324231207.1351418-135-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240324231207.1351418-1-sashal@kernel.org> References: <20240324231207.1351418-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit From: Viktor Malik [ Upstream commit 903fad4394666bc23975c93fb58f137ce64b5192 ] The .BTF_ids section is pre-filled with zeroed BTF ID entries during the build and afterwards patched by resolve_btfids with correct values. Since resolve_btfids always writes in host-native endianness, it relies on libelf to do the translation when the target ELF is cross-compiled to a different endianness (this was introduced in commit 61e8aeda9398 ("bpf: Fix libelf endian handling in resolv_btfids")). Unfortunately, the translation will corrupt the flags fields of SET8 entries because these were written during vmlinux compilation and are in the correct endianness already. This will lead to numerous selftests failures such as: $ sudo ./test_verifier 502 502 #502/p sleepable fentry accept FAIL Failed to load prog 'Invalid argument'! bpf_fentry_test1 is not sleepable verification time 34 usec stack depth 0 processed 0 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0 Summary: 0 PASSED, 0 SKIPPED, 1 FAILED Since it's not possible to instruct libelf to translate just certain values, let's manually bswap the flags (both global and entry flags) in resolve_btfids when needed, so that libelf then translates everything correctly. Fixes: ef2c6f370a63 ("tools/resolve_btfids: Add support for 8-byte BTF sets") Signed-off-by: Viktor Malik Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/7b6bff690919555574ce0f13d2a5996cacf7bf69.1707223196.git.vmalik@redhat.com Signed-off-by: Sasha Levin --- tools/bpf/resolve_btfids/main.c | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tools/bpf/resolve_btfids/main.c b/tools/bpf/resolve_btfids/main.c index cd42977c6a1f4..ef0764d6891e4 100644 --- a/tools/bpf/resolve_btfids/main.c +++ b/tools/bpf/resolve_btfids/main.c @@ -90,6 +90,14 @@ #define ADDR_CNT 100 +#if __BYTE_ORDER == __LITTLE_ENDIAN +# define ELFDATANATIVE ELFDATA2LSB +#elif __BYTE_ORDER == __BIG_ENDIAN +# define ELFDATANATIVE ELFDATA2MSB +#else +# error "Unknown machine endianness!" +#endif + struct btf_id { struct rb_node rb_node; char *name; @@ -117,6 +125,7 @@ struct object { int idlist_shndx; size_t strtabidx; unsigned long idlist_addr; + int encoding; } efile; struct rb_root sets; @@ -320,6 +329,7 @@ static int elf_collect(struct object *obj) { Elf_Scn *scn = NULL; size_t shdrstrndx; + GElf_Ehdr ehdr; int idx = 0; Elf *elf; int fd; @@ -351,6 +361,13 @@ static int elf_collect(struct object *obj) return -1; } + if (gelf_getehdr(obj->efile.elf, &ehdr) == NULL) { + pr_err("FAILED cannot get ELF header: %s\n", + elf_errmsg(-1)); + return -1; + } + obj->efile.encoding = ehdr.e_ident[EI_DATA]; + /* * Scan all the elf sections and look for save data * from .BTF_ids section and symbols. @@ -681,6 +698,24 @@ static int sets_patch(struct object *obj) */ BUILD_BUG_ON(set8->pairs != &set8->pairs[0].id); qsort(set8->pairs, set8->cnt, sizeof(set8->pairs[0]), cmp_id); + + /* + * When ELF endianness does not match endianness of the + * host, libelf will do the translation when updating + * the ELF. This, however, corrupts SET8 flags which are + * already in the target endianness. So, let's bswap + * them to the host endianness and libelf will then + * correctly translate everything. + */ + if (obj->efile.encoding != ELFDATANATIVE) { + int i; + + set8->flags = bswap_32(set8->flags); + for (i = 0; i < set8->cnt; i++) { + set8->pairs[i].flags = + bswap_32(set8->pairs[i].flags); + } + } } pr_debug("sorting addr %5lu: cnt %6d [%s]\n", -- 2.43.0