Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp2732623pxb; Mon, 17 Jan 2022 04:48:16 -0800 (PST) X-Google-Smtp-Source: ABdhPJwzsmwz4THyK1bSb2/CIpj8GP5nfl8JZ0Wxf+ZTBeXcoBYYLGPpRWd4rFzDT6QkySFmPrVv X-Received: by 2002:a63:45:: with SMTP id 66mr3775002pga.607.1642423695880; Mon, 17 Jan 2022 04:48:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642423695; cv=none; d=google.com; s=arc-20160816; b=Q/85Xhq19DaHi/kT3wXcb6liRazkr760pUSUtcD68EMZDcKldCrFKh7GoGlFDmfPgQ fa+dDklPTQPrEC+QPHNnbk6jSDKG5sa5mBN8E3PowJ6SbsvtEwJ9YjsZ0rZCkR9bDLI4 mOcIu6Bufd/zlW58+YANt1BYignqPLmnXBH5ymOVCM51H9NqtU8I9kWfDoi6/rX5UUvJ C91q2zFwMmyCP4cwcNuFGLfRY1aBBSZNK90wQhv1NZ38vcidqmcwXzzUtQNwOdWaxtcD OadI6zIPo09SyTakdeATs08lIKVXFhDf78zwQGNz2qEBDZGWYeMfeUCp4C9kh7Z2qMAr Ga9g== 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=bLLHRdyLq7WE7D4YQ9dymvGcdmVPZn0QSdNSPiQpGfY=; b=Tf1YxmwMkH1u0UDnFFuBwUj5cH+WzhGMPNsMZQeBhNzwy76IuEXBM2V/erSWkEwF8M pGBSKZh8affTkep5LubQjoKY8knhiVlhYr1oRXq0GkqgkRtAXcSw35MR7UPoLy4b5OJD e3KlOQxMrgU7s0E4RdKNzhXCcXf15Fo/u5G0zaTiX5DASIeNGJ2N6ND7Y/9uf7pbRsob jqyrg7EcZ+i1Vx6mPBdTt7VHkNkSWRpJjyZKc9uoRLet3PjSskC0EkHh2pBTl6QXUf9W /3L4ZgrH5qnVt/ch5ZXRdpSDhdyjVJpkj8GXQKk+X6SDGgrHR9QSxgbJlTIM7CEjUzK7 rwjQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=LNejyZND; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.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 vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s30si15061458pfg.241.2022.01.17.04.48.03; Mon, 17 Jan 2022 04:48:15 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=LNejyZND; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.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: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232246AbiAQFeS (ORCPT + 99 others); Mon, 17 Jan 2022 00:34:18 -0500 Received: from ams.source.kernel.org ([145.40.68.75]:47034 "EHLO ams.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232004AbiAQFeM (ORCPT ); Mon, 17 Jan 2022 00:34:12 -0500 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 6AA6AB80DCF; Mon, 17 Jan 2022 05:34:10 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B4604C36AF2; Mon, 17 Jan 2022 05:34:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1642397649; bh=NmDsvF8ClcMJUo/tilVl/bZES60Igb1VuHjR2+H+TOM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LNejyZNDHtVpAKzDLhIh3HN+GLq+ZO7RIPOyD6djY20Ljxu8Hu6pfFYHZSSdFjtMP d7o8tnjSPoJvPzPazwQ3fvqThTKnaDcnlQM2xCQDmyPm1s3iKAVqNMUiqplOiLYWBc 7VMnmuer76ltEUDAZj4kJnnn2LLBGL7SEQaIiFjY90yLrBSoII671yKKrwNZge2Miz k+xD6VqGVe8GcxiRQ7ejOVZ4Np3Ln1+pZFgbwfbvpzXSevSiHgZQiffQITz5U7z3iG PEx17saRhFxT25NA0MSi/mdKIRbl0CkpQH7nnWVXLP+HOOouAzW4TCO0scpcsKZPYR xBl0K6Ob+7mTg== From: Miguel Ojeda To: Linus Torvalds , Greg Kroah-Hartman Cc: rust-for-linux@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Gary Guo , Boqun Feng , Matthew Wilcox Subject: [PATCH v3 01/19] kallsyms: support "big" kernel symbols Date: Mon, 17 Jan 2022 06:33:31 +0100 Message-Id: <20220117053349.6804-2-ojeda@kernel.org> In-Reply-To: <20220117053349.6804-1-ojeda@kernel.org> References: <20220117053349.6804-1-ojeda@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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. 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 --- 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 3011bc33a5ba..80702273494a 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 54ad86d13784..79b11bb7f07d 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c @@ -470,12 +470,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.34.1