From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by sourceware.org (Postfix) with ESMTPS id 81F0C3858D28 for ; Wed, 7 Sep 2022 23:40:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 81F0C3858D28 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=oracle.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 287LJUYo017866 for ; Wed, 7 Sep 2022 23:40:53 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : content-type : mime-version; s=corp-2022-7-12; bh=D3WX0oxdMLixGDFWebShAw8bOCvuSUGrBneypnpqXKI=; b=h1rRjch47btvPXR+JZcgTqFO1yXV8MXnUMcerJP/+kV6XBRxeqNvZjggls0VM0bYqQV/ 2YsiaL6bGEqxvBK3hMik9H0opxFttuT33N1CK96Xlhu5ohheg65u928zhmrjFTUIZLwZ ePOMtuBMF9BTqzMq5lmYRSZdVSIkCuIr0b3HERSHxHlChNV5ZQutTGTyM7CWD2nzMUty 3YU1dmF9N49f0IwdbTd1FyL0l2dm8ooS31sxOqIVO1oTQNvuUbLpRUA0HM43DyG1lDJt epBhtkOJ87RVeuGQrXkM4yRPmwVWhCdrjOtk357EmDc13j/SFdr5cZltv5wHuViWg4GB bA== Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3jbwh1jbua-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 07 Sep 2022 23:40:53 +0000 Received: from pps.filterd (phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 287NaFKX033223 for ; Wed, 7 Sep 2022 23:40:52 GMT Received: from nam02-bn1-obe.outbound.protection.outlook.com (mail-bn1nam07lp2049.outbound.protection.outlook.com [104.47.51.49]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3jbwc4e9bm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 07 Sep 2022 23:40:52 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=JZofiI6X2K4OZqN+2Ihk0MXS859/firQzKNk9wi+iuxPJ5euFaNe0L/YSqr4UXW6AoOJ4GFyCYoEetjQxdhRpNhJZEgi277aXGWQCyuiyf27vjUayaMSx5ASz9oMH9pn8vGhBHWY9I81GO2lDoWyh1BXkqSOPHrHcmVz1P7WLxtPi0LjRHMATZQRaRLbhutsuAuh9qfaR0ljKLzlytzIftL4YcddzNNDiDTi2+rtniMZt2NrlWDTfYhnW/Xj+C/Ao4h27vqm0xoHUiRKNDzr1RPkKjfAL+E+ReWbKdzn1tZxKa2oso6BXaN6IkHjggtIEbYJNbRmw4oRcsdddOUJDw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=D3WX0oxdMLixGDFWebShAw8bOCvuSUGrBneypnpqXKI=; b=Jhn3bQ8hT/Q1Wr9zNwyVhK4Osp/MlPyH5Z6qz5H3WE39VIPep6XYg6ysU0+fhcrMovbypBcFhqXRwAfy0ox2HLIfOjDE5FyD7o1uSdeqhxo4drE+8GiPLF0uuO0/MU9tR2bsYSpBXSPW8yy7e26SE6F+vani96kZKaJjMQ9FPHab0D55jK6eC7kRydf7K6Xdli1RWWs65dKYSuiq6Ese6uxwZCG1mxIMwGlbV6aH4BF7sR1tdR0b6ztcjGD1HcbwJLeNHKOKSIc6OjgyewoBlT+ALF1796NZogQYZMjfp2UgWTucX2isVxKerDe2JIcbtmHptpSLkv+Uboyxsn70MA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=D3WX0oxdMLixGDFWebShAw8bOCvuSUGrBneypnpqXKI=; b=w7+5LinfaNrd6BpRmG5AzJaD69/DLaKxn1yAi0JnbGVrCkigU0WP7nqTAr30zLSCOCM6X2ZtIrNFEosF0uxEVbwv6nDk3mmcwiN1YwwSXzgnlJtL9ewTBefVh4ldl3TT9R9XKcEaOvQy+lE6m4B2zFh99c15nbg72BDHdbGez3M= Received: from MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) by PH0PR10MB4645.namprd10.prod.outlook.com (2603:10b6:510:31::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5588.18; Wed, 7 Sep 2022 23:40:49 +0000 Received: from MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::18e8:e5f2:59a9:1ff5]) by MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::18e8:e5f2:59a9:1ff5%2]) with mapi id 15.20.5612.014; Wed, 7 Sep 2022 23:40:49 +0000 From: "Guillermo E. Martinez" To: libabigail@sourceware.org Cc: "Guillermo E. Martinez" Subject: [PATCHv v2] ctf-reader: Lookup debug info for symbols in a non default archive member Date: Wed, 7 Sep 2022 18:40:42 -0500 Message-Id: <20220907234042.1610173-1-guillermo.e.martinez@oracle.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220831151603.915945-1-guillermo.e.martinez@oracle.com> References: <20220831151603.915945-1-guillermo.e.martinez@oracle.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: SA9PR13CA0036.namprd13.prod.outlook.com (2603:10b6:806:22::11) To MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWHPR10MB1407:EE_|PH0PR10MB4645:EE_ X-MS-Office365-Filtering-Correlation-Id: f1191b18-dff4-4549-51bc-08da912a6413 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: v9ZNE4mp4wQ4Awd4l2nbYOh51PPA502/t3VVejP6wGodLnLr+mJIgEI8LA8NZhX3Klky4CXwlaLeNQAEC71fVU8B/TR13xt3R9kZp5DoBX3zgZATb+S1YHGfQAOY4Ah+a/xlfpBSnQeFmnu0/ZNEuiFmBYQg8McYrLsgX+0HsFVzGhlv3QCzwXpZgR1EbAW8xdKHbGNp9oIakdj1BQPCAr1m8o17UfiL6Hr6UW47TdNCviBfz/VHTWtxSva7DWTwTIeG2W4wIsslNi1r5LiJABAsF3RsY1yWkR6xAkldR+jJtA01QD9+JfrXV4KAgUJ+tTCLkFrChYTDwe+jUhNPaOv4JbL0y+OJv2PCeUDrSX034a5no37SeNs/SWS8BBRJ10hu/jC67m14QFBRfyhbYPfsOd+BMKxlJuicVxMkC7nv2DqFdCX3lYHYcPU+AjDuMXNrUOY80mQ+k48LXVEmZBc6SEg9tQpV2Ei0cDZO2QsM+0SHu1GpPoFpKOxyEW/M5fiNScLMM7ElxocwG0h3VyneMnAUORHWMvFDtz95v6InfzQeCt3HSrttQAlkj20Ai8xAhRLaWu7pc/AwI//S2kVAGZxu+GlY/V6gfWkmvTUClCHtxsLMaShG6ytqVc+72xG6WcXjJLCSmZ1ILC4rYD7pz7nwjT/32NSCBLbU07plwctglp+FDMIoqu28H9gD9w+Z0aq0QIVgCE1XBeTTxg== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MWHPR10MB1407.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(396003)(136003)(346002)(39860400002)(376002)(366004)(107886003)(83380400001)(316002)(66946007)(36756003)(66556008)(6486002)(478600001)(6916009)(66476007)(8676002)(4326008)(6506007)(86362001)(103116003)(186003)(6666004)(2906002)(41300700001)(5660300002)(6512007)(38100700002)(8936002)(2616005)(1076003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?PwcN5RXwxzAXk/bywhgv0x12R5wMivxXerRKhbB611NB5xG7UVTerA79IiXR?= =?us-ascii?Q?S56COGFJnccw7xyI+fFdqA30M2KeH776G/NBGF9L/KmnkApA4o7yw8SQfjRm?= =?us-ascii?Q?SXILS2E/2Y43TpmrEA58J/xJD3bBToh2ufYxKYG4dkYQOBL1NXXNForD1FZ9?= =?us-ascii?Q?T7kuEhQeRfe5Rrqg8dxgCCpYVIns62pTUdDAaw/iJBp39DzrdEOegnfbMlhF?= =?us-ascii?Q?Fql0L7KwBOVRcvhciXXaFcOmhpaknkP7VVJJAIx5B5jpXValVQMYVcksBbl4?= =?us-ascii?Q?VWmPCmTCy2yTyLE4MoVyUe+XKb9v8+qoTYDVcey4lrBq3AKGEJ18GHM20nNg?= =?us-ascii?Q?brwP8mgIU9WYIpRwk5yuUwJ7CQfP5mnjaYKa9kZNCHo2R3PJlR3saQSsmBDE?= =?us-ascii?Q?DiiZAHxUC2CQSYOCQNMg2GWJZQBT0Ukb9/IQ+/eGGe/ZmnFMV99iv9kKN8p3?= =?us-ascii?Q?WgofDqDu65Nyxa8WOWjX16eS9DRVhoZ4BPj6BBhiGPkvwqXyc3b0u5dDw3xf?= =?us-ascii?Q?j676K58Xm7w5aDs+XECnZ5M1nfsoF0U4pJ49LYymxzyOq676UieoVukAUvBM?= =?us-ascii?Q?ha681dSml11dD0eGJ6WsENXa1JIQhTy9icwLqWtL0e3oOQlibpTJIZFXtG+g?= =?us-ascii?Q?jX2FIM5gFe9vUxt9ML5cQ0HgRsSYGYmOT42doZrBcgrbKQj74PGDoMV5Yiao?= =?us-ascii?Q?5he/yQ9bXCLic+gRAWW7ostS5H7QnS2lMpMGFyTnC6nL2LAEh7wnDBkmJQo2?= =?us-ascii?Q?hn8m0AlEDzCVSPnKE6LSJlkcTaaP1QT/7j3pm81ko10Wlr5KvFOzu+g0jPFB?= =?us-ascii?Q?3s4ayIKWlRluyppjWpO14iA9PzJ0mBZbxqu3XStYDtJmW+WrFjCVrzEzl5Oh?= =?us-ascii?Q?MdtNsyvSCpRE2mB5pg+mk6twmxBQiidb2yAb6bEE2YvlH3RTzFqoCIT7jEbw?= =?us-ascii?Q?+9s1L+micfsYoTr1AcmAIm2YfS89Ugyf0VTs8O0NuM4u1MpbVwFslO8/wnoo?= =?us-ascii?Q?AVEca16dCvcOH2ysLBMB0JmLrPp2wuLfpkafUV/e8UUhC0woUxrVXkTZdfFG?= =?us-ascii?Q?AYH17QdReU7zWkiUWmdOWxpECjhQY7uNk156v+wff7KCaRuc280QNWZ8dQOZ?= =?us-ascii?Q?dG8kzAxGYzwtHsujqIV8oqcGRppEMommjMqjwmP5uvCLzPYi5IlMA71HPNdc?= =?us-ascii?Q?iCMGlQC4uvth+4+iH9VAnv4le8HwqTR7jmrzNS6bFY/zhGWUOqUCzI7G6fCe?= =?us-ascii?Q?vWzvWKmBqQTOTVr1kcPxkRWK52Csh4awtxQUib2Jufl4yxFbdaiRqTpQqzl3?= =?us-ascii?Q?rXIrbam1VbbW42SQ0P9e6XcYW+LCOecA/0F4WSWbYVW5t6swe0aAnxrVl1qx?= =?us-ascii?Q?K8ovaoALgZ+Xn05xjjy/eqhrOk0/gA7F9bPb48hrY5B/iD/xnrSk1537t7aU?= =?us-ascii?Q?vTnUo3xinyKrmgC+i5aPXjX4XjqQChLizhwMkd5k1gKujfuNeZ+QWP1sQOw1?= =?us-ascii?Q?NbF/UW6iRWe7jRB/qzao/UTB5s43T8wMNT3cs9jJ5HEsHKfTR26uqrnAhVny?= =?us-ascii?Q?AB6T9vyFT8PuQyLIVIkFRN4lJhUYNxoMlmnA29qZ8MWrCOAo6CD6vd6JXnHc?= =?us-ascii?Q?ckE28qP4GU2r5cfGqho8M4uvX2mKvkFlY+KvKiy4PrK1?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: f1191b18-dff4-4549-51bc-08da912a6413 X-MS-Exchange-CrossTenant-AuthSource: MWHPR10MB1407.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Sep 2022 23:40:48.6550 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: bHOhZLp+OkhUO+wGzbZPMO0a2XnrUTN9IlgSb9YYrgzcc0f5U7q7Gl1iyMgalJouySfqp+i92AVRFmSRnxJCcu2r47pbWBZnFVO9KDZdueE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR10MB4645 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.895,Hydra:6.0.528,FMLib:17.11.122.1 definitions=2022-09-07_10,2022-09-07_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 suspectscore=0 phishscore=0 mlxlogscore=999 spamscore=0 adultscore=0 mlxscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2207270000 definitions=main-2209070087 X-Proofpoint-GUID: 5GQlguRxTVlzFJps_v49jj9ikuoSe3EM X-Proofpoint-ORIG-GUID: 5GQlguRxTVlzFJps_v49jj9ikuoSe3EM X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Hello, This patch v2 to improves the ABI XML file generated by ctf reader, there are Linux symbols (EXPORT_SYMBOL*) that were missing. Changes from v1: - Change order for `ctf_lookup_*' to at first looks symbol function types in `CTF Function section', and afterwards if is not success try in `CTF Variable section'. - Add comments describing use of `ctf_lookup_variable'. Comments will be grateful and appreciated!. Thanks in advanced, guillermo -- The current mechanism used by the ctf reader to looking for debug information given a specific Linux symbol, it opens the dictionary (default) which the name match with the binary name being processing in the current corpus, e.g. `vmlinux' or `module-name`.ko. However there are information symbols not located in a default dictionary, this is evident comparing the symbols in `Module.symvers' file with ABI XML file, so for example, the ctf reader is expecting to find the information for `LZ4_decompress_fast' symbol in the CTF `vmlinux' archive member, because this symbols is defined in `vmlinux' binary: 0x4c416eb9 LZ4_decompress_fast vmlinux EXPORT_SYMBOL But, it figures out that it is missing. The correct location is `vmlinux#0' dictionary: CTF archive member: vmlinux: ... Function objects: ... CTF archive member: vmlinux#0: Function objects: ... LZ4_decompress_fast -> 0x80037400: (kind 5) int (*) (const char *, char *, int) (aligned at 0x8) ... Therefore, ctf reader is looking for debug information in the whole archive, fortunately `libctf' provides a fast lookup mechanism using cache, dictionary references, etc., so the penalty performance is ~10%. Now, it make use of `ctf_lookup_by_symbol_name' at first instance which is in charge to locate symbol information given a symbol name on either CTF Function o Variable sections, if there isn't found it tries by using `ctf_lookup_variable' to looks in the CTF Variable section, this could happens due to `ld' operated with `--ctf-variables' option and function types information now resides in CTF Variable section. * src/abg-ctf-reader.cc (lookup_symbol_in_ctf_archive): New function. (process_ctf_archive): Use `lookup_symbol_in_ctf_archive'. Signed-off-by: Guillermo E. Martinez --- src/abg-ctf-reader.cc | 74 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc index 71808f9a..f5f58c7a 100644 --- a/src/abg-ctf-reader.cc +++ b/src/abg-ctf-reader.cc @@ -1204,6 +1204,61 @@ lookup_type(read_context *ctxt, corpus_sptr corp, return result; } +/// Given a symbol name, lookup the corresponding CTF information in +/// the default dictionary (CTF archive member provided by the caller) +/// If the search is not success, the looks for the symbol name +/// in _all_ archive members. +/// +/// @param ctfa the CTF archive. +/// @param dict the default dictionary to looks for. +/// @param sym_name the symbol name. +/// @param corp the IR corpus. +/// +/// Note that if @ref sym_name is found in other than its default dictionary +/// @ref ctf_dict will be updated and it must be explicitly closed by its +/// caller. +/// +/// @return a valid CTF type id, if @ref sym_name was found, CTF_ERR otherwise. + +static ctf_id_t +lookup_symbol_in_ctf_archive(ctf_archive_t *ctfa, ctf_dict_t **ctf_dict, + const char *sym_name, corpus_sptr corp) +{ + int ctf_err; + ctf_dict_t *dict = *ctf_dict; + ctf_id_t ctf_type = ctf_lookup_by_symbol_name(dict, sym_name); + + if (ctf_type != CTF_ERR) + return ctf_type; + + /* Probably --ctf-variables option was used by ld, so symbol type + definition must be found in the CTF Variable section. */ + ctf_type = ctf_lookup_variable(dict, sym_name); + + /* Not lucky, then, search in whole archive */ + if (ctf_type == CTF_ERR) + { + ctf_dict_t *fp; + ctf_next_t *i = NULL; + const char *arcname; + + while ((fp = ctf_archive_next(ctfa, &i, &arcname, 1, &ctf_err)) != NULL) + { + if ((ctf_type = ctf_lookup_by_symbol_name (fp, sym_name)) == CTF_ERR) + ctf_type = ctf_lookup_variable(fp, sym_name); + + if (ctf_type != CTF_ERR) + { + *ctf_dict = fp; + break; + } + ctf_dict_close(fp); + } + } + + return ctf_type; +} + /// Process a CTF archive and create libabigail IR for the types, /// variables and function declarations found in the archive, iterating /// over public symbols. The IR is added to the given corpus. @@ -1222,7 +1277,7 @@ process_ctf_archive(read_context *ctxt, corpus_sptr corp) corp->add(ir_translation_unit); int ctf_err; - ctf_dict_t *ctf_dict; + ctf_dict_t *ctf_dict, *dict_tmp; const auto symtab = ctxt->symtab; symtab_reader::symtab_filter filter = symtab->make_filter(); filter.set_public_symbols(); @@ -1248,19 +1303,17 @@ process_ctf_archive(read_context *ctxt, corpus_sptr corp) abort(); } + dict_tmp = ctf_dict; + for (const auto& symbol : symtab_reader::filtered_symtab(*symtab, filter)) { std::string sym_name = symbol->get_name(); ctf_id_t ctf_sym_type; - ctf_sym_type = ctf_lookup_variable(ctf_dict, sym_name.c_str()); - if (ctf_sym_type == (ctf_id_t) -1 - && !(corp->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN)) - // lookup in function objects - ctf_sym_type = ctf_lookup_by_symbol_name(ctf_dict, sym_name.c_str()); - - if (ctf_sym_type == (ctf_id_t) -1) - continue; + ctf_sym_type = lookup_symbol_in_ctf_archive(ctxt->ctfa, &ctf_dict, + sym_name.c_str(), corp); + if (ctf_sym_type == CTF_ERR) + continue; if (ctf_type_kind(ctf_dict, ctf_sym_type) != CTF_K_FUNCTION) { @@ -1298,13 +1351,14 @@ process_ctf_archive(read_context *ctxt, corpus_sptr corp) func_type, 0 /* is_inline */, location())); - func_declaration->set_symbol(symbol); add_decl_to_scope(func_declaration, ir_translation_unit->get_global_scope()); func_declaration->set_is_in_public_symbol_table(true); ctxt->maybe_add_fn_to_exported_decls(func_declaration.get()); } + + ctf_dict = dict_tmp; } ctf_dict_close(ctf_dict); -- 2.35.1