Received: by 2002:a6b:500f:0:0:0:0:0 with SMTP id e15csp4766205iob; Mon, 9 May 2022 00:43:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwSl0OzTrVv33RYy86w5PD6cryUqgqQtgJWzSOr8XsD02YdKCyd4o5uFrZ2TDGJmaiA1odk X-Received: by 2002:a17:902:cf0b:b0:15a:2681:9180 with SMTP id i11-20020a170902cf0b00b0015a26819180mr14998279plg.137.1652082183327; Mon, 09 May 2022 00:43:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652082183; cv=none; d=google.com; s=arc-20160816; b=xXe0xr1asiHsK5P3V3i9HOOrsmS07B6GBUqp2a629JBj3BrvuzpjoBeNfPXYDfdHx3 VGZRwjGruPEbeE+T7F5X28L9EL2ZoesdrdJg1FzeejJ6Trolxa4k+af/7e6Ot8hQgPnh 4+tOdDOwnGW8+Tj62t5Ewp4JorN9HMZ+uDHiqcUCHIWEpYAyCNUlXRH5YF2zP1afDmGw X7KRS8czXkw9rDscl+0cGFImsu6OBllqzcLvPI+bH5dKk2Ah47mZWEkcUWdPWyB3O4fb iY2zt2hYecPyXUaamYQ1Z6wfCU2v+kqfof1H4TEa9CXVCamTJ/9FKn5GmMsULJJKl5fP vW/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=g5LjLH3mbJrNhmDILmaqq/bNoUdYKVt4PId/eau90MA=; b=wJGvq1IWVl3Vfx5A9fVrufNw/QkAucCojhmiGGoJJ0kuTyeYA1VXOUtG8m/FkG3KXF M6qAs4EIIoW5t4zpYb/MRxVfak4rn+e0SrP9VPUsYqIZI3KaBxYwCBNe//PzedNp+DDh g7Sar3bgiHh0ZqD17qovPIZ+JZHcT8t5dpKRjNlcet82c+zz01d14RlXLjwPWzoLyrcp u4JnUF+IgAOnz7+2EDLwI3wTD1fNtoVRy4CE2RDa4Gx3kZnEtbXHrEg8yqd6G96Mxft+ YSly4EF3u1Rj+6y5FzJIQB/6f4EBAq5uUa/u2iP5nVFXIBXwhCG/787txmHKgsOfVQtj MGLw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=IejeAEzx; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id p17-20020a63b811000000b003816043eec9si15902585pge.190.2022.05.09.00.43.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 May 2022 00:43:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=IejeAEzx; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 3E4D316A5F5; Mon, 9 May 2022 00:36:34 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1443293AbiEFUjc (ORCPT + 99 others); Fri, 6 May 2022 16:39:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38050 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1443176AbiEFUjU (ORCPT ); Fri, 6 May 2022 16:39:20 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B39FB12AE8; Fri, 6 May 2022 13:35:35 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 3CF8DB83993; Fri, 6 May 2022 20:35:34 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 81EE3C385A8; Fri, 6 May 2022 20:35:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1651869333; bh=BfaelvsE9otW4HAecF8ygPRcE3Y5bqRUzQDPTs9Sn3c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IejeAEzxtxG1qUtJMS/r4CKjWA25UAMFuSezsgmIAJsnXjXdznpcJPUfnww3Gv4bz XTyE7VLmyEu4lTmdCnj1hncLoQU74t/jrPBk4vJ1xfYzRBY/TaoZKhjhBMz7s+JOMs FAucOlRnCXqic9ZaL8KrTkvfQkda+6Lp5snrgQNRb8oSSqWTWCVOr8VCflmDi3fLxP EfreD8Zgt+hFwqxltT22yLEbPqnvukEEnir59Tc4itgtJDgb6HUaEIHJ9AZltNXLNZ /g9J8UmJ6pNbmlID1p4Evd48GR8NXvWPwDpnDPGGgDudTORp5nMfGmVY4O19xXiw50 CczQZfWKV/YZQ== From: Miguel Ojeda To: Kees Cook , Bixuan Cui , Randy Dunlap , Miroslav Benes , Matthew Wilcox , David Vernet , Nick Desaulniers , Jiri Olsa , Miguel Ojeda , Stephen Boyd , Boqun Feng , Wedson Almeida Filho , Gary Guo , Changbin Du , linux-kernel@vger.kernel.org Cc: rust-for-linux@vger.kernel.org, Alex Gaynor Subject: [PATCH v2 2/3] kallsyms: support "big" kernel symbols Date: Fri, 6 May 2022 22:34:23 +0200 Message-Id: <20220506203443.24721-3-ojeda@kernel.org> In-Reply-To: <20220506203443.24721-1-ojeda@kernel.org> References: <20220506203443.24721-1-ojeda@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.9 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable 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 Rust symbols can become quite long due to namespacing introduced by modules, types, traits, generics, etc. Increasing to 255 is not enough in some cases, and therefore we need to introduce longer lengths to the symbol table. In order to avoid increasing all lengths to 2 bytes (since most of them are small, including many Rust ones), we use ULEB128 to keep smaller symbols in 1 byte, with the rest in 2 bytes. Reviewed-by: Kees Cook Co-developed-by: Alex Gaynor Signed-off-by: Alex Gaynor Co-developed-by: Wedson Almeida Filho Signed-off-by: Wedson Almeida Filho Co-developed-by: Gary Guo Signed-off-by: Gary Guo Co-developed-by: Boqun Feng Signed-off-by: Boqun Feng Co-developed-by: Matthew Wilcox Signed-off-by: Matthew Wilcox Signed-off-by: Miguel Ojeda --- v2: - Collected Reviewed-by. kernel/kallsyms.c | 26 ++++++++++++++++++++++---- scripts/kallsyms.c | 29 ++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index 79f2eb617a62..e8d2262ef2d2 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c @@ -69,12 +69,20 @@ static unsigned int kallsyms_expand_symbol(unsigned int off, data = &kallsyms_names[off]; len = *data; data++; + off++; + + /* If MSB is 1, it is a "big" symbol, so needs an additional byte. */ + if ((len & 0x80) != 0) { + len = (len & 0x7F) | (*data << 7); + data++; + off++; + } /* * Update the offset to return the offset for the next symbol on * the compressed stream. */ - off += len + 1; + off += len; /* * For every byte on the compressed symbol data, copy the table @@ -127,7 +135,7 @@ static char kallsyms_get_symbol_type(unsigned int off) static unsigned int get_symbol_offset(unsigned long pos) { const u8 *name; - int i; + int i, len; /* * Use the closest marker we have. We have markers every 256 positions, @@ -141,8 +149,18 @@ static unsigned int get_symbol_offset(unsigned long pos) * so we just need to add the len to the current pointer for every * symbol we wish to skip. */ - for (i = 0; i < (pos & 0xFF); i++) - name = name + (*name) + 1; + for (i = 0; i < (pos & 0xFF); i++) { + len = *name; + + /* + * If MSB is 1, it is a "big" symbol, so we need to look into + * the next byte (and skip it, too). + */ + if ((len & 0x80) != 0) + len = ((len & 0x7F) | (name[1] << 7)) + 1; + + name = name + len + 1; + } return name - kallsyms_names; } diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index 82d6508bdf29..7e99799aa7b9 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c @@ -480,12 +480,35 @@ static void write_src(void) if ((i & 0xFF) == 0) markers[i >> 8] = off; - printf("\t.byte 0x%02x", table[i]->len); + /* There cannot be any symbol of length zero. */ + if (table[i]->len == 0) { + fprintf(stderr, "kallsyms failure: " + "unexpected zero symbol length\n"); + exit(EXIT_FAILURE); + } + + /* Only lengths that fit in up-to-two-byte ULEB128 are supported. */ + if (table[i]->len > 0x3FFF) { + fprintf(stderr, "kallsyms failure: " + "unexpected huge symbol length\n"); + exit(EXIT_FAILURE); + } + + /* Encode length with ULEB128. */ + if (table[i]->len <= 0x7F) { + /* Most symbols use a single byte for the length. */ + printf("\t.byte 0x%02x", table[i]->len); + off += table[i]->len + 1; + } else { + /* "Big" symbols use two bytes. */ + printf("\t.byte 0x%02x, 0x%02x", + (table[i]->len & 0x7F) | 0x80, + (table[i]->len >> 7) & 0x7F); + off += table[i]->len + 2; + } for (k = 0; k < table[i]->len; k++) printf(", 0x%02x", table[i]->sym[k]); printf("\n"); - - off += table[i]->len + 1; } printf("\n"); -- 2.35.3