Received: by 2002:ac0:a874:0:0:0:0:0 with SMTP id c49csp300820ima; Fri, 15 Mar 2019 03:11:20 -0700 (PDT) X-Google-Smtp-Source: APXvYqxx0rUmY5+eyW8rmQtSL5FsGwD56+2mHnWR7WEnOmxt9/E1PQPkSWTFqD0KDi19I6p8BoU1 X-Received: by 2002:a65:6149:: with SMTP id o9mr2579160pgv.315.1552644680819; Fri, 15 Mar 2019 03:11:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552644680; cv=none; d=google.com; s=arc-20160816; b=iJN4mGOG1kXFXY4fSvOe0UMNXqHRQh4t3U3+Zwh+CZwbLPlp2IaLaVMpXgwxToGAEi fNlZxIgz5qUwUuQWgpO0///vOzPvrKxXjp86ZSjtVbC0Ohjc+Lj/J3zDbnSpgHs4yn2U F95EY/K8L8WOCQ+Iuz396B8KbB8fz1W/H2U25v062LHzGApLsgnI+026AiaJEvGzXp/W Fa/CIhVVnn9jGyegXCREytgtxN9SWN7oav1DJ4DUxfd5ILb5kOfTsewyz62qQtdIQkRc qGiswZ8g3F1cEGipWGRPJdYz2x/wD3C6qilzK/I4uYC2lEJrVBQwAc62ke9M9o37gQP0 97Jg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-disposition:mime-version :message-id:subject:cc:to:from:date; bh=jLag7ASD0900sdDb+si++orI1hdqcq/DmV0/Pq9tTgY=; b=c9wuKqudrgoqWtzG1UOpwHVleBzByX58go627vUcXteC47/fzDa8jWe2hXeaWupblJ oYtiVD3HG5wdtbOXsZC9J6c8ZN56m8q1r+oA9TbUOl3Fio1xBq/iL4luiBId573nCMz1 mSg0zUh6QjLfG9o0uLgLdF9MSOpP1p6TuVPn3/zhVQwsypY9xHjGjdUOh02l4Y9+ldVI PS38fSkSvXfv2KYuD4g1kCDd4AuHCY5hvbawl7vDta2HPXz4WFGzl8SopZvfe1uU0d23 65buJTacsgiY8iDMHfCF89cO9irPoKpsmLf5Gz1CTsS81vm9+6aAXvcl90T3awvOb8ui ll9g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h10si1420652pgs.573.2019.03.15.03.11.06; Fri, 15 Mar 2019 03:11:20 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727570AbfCOKKU (ORCPT + 99 others); Fri, 15 Mar 2019 06:10:20 -0400 Received: from monster.unsafe.ru ([5.9.28.80]:49344 "EHLO mail.unsafe.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727354AbfCOKKT (ORCPT ); Fri, 15 Mar 2019 06:10:19 -0400 Received: from Legion-PC.fortress (nat-pool-brq-t.redhat.com [213.175.37.10]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.unsafe.ru (Postfix) with ESMTPSA id 556C2C61A98; Fri, 15 Mar 2019 10:10:16 +0000 (UTC) Date: Fri, 15 Mar 2019 11:10:13 +0100 From: Alexey Gladkov To: Masahiro Yamada , Michal Marek Cc: linux-kernel@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-api@vger.kernel.org, "Kirill A . Shutemov" , Gleb Fotengauer-Malinovskiy , "Dmitry V. Levin" Subject: [RESEND PATCH v1] moduleparam: Save information about built-in modules in separate file Message-ID: <20190315101013.GN8455@Legion-PC.fortress> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Problem: When a kernel module is compiled as a separate module, some important information about the kernel module is available via .modinfo section of the module. In contrast, when the kernel module is compiled into the kernel, that information is not available. Information about built-in modules is necessary in the following cases: 1. When it is necessary to find out what additional parameters can be passed to the kernel at boot time. 2. When you need to know which module names and their aliases are in the kernel. This is very useful for creating an initrd image. Proposal: The proposed patch does not remove .modinfo section with module information from the vmlinux at the build time and saves it into a separate file after kernel linking. So, the kernel does not increase in size and no additional information remains in it. Information is stored in the same format as in the separate modules (null-terminated string array). Because the .modinfo section is already exported with a separate modules, we are not creating a new API. It can be easily read in the userspace: $ tr '\0' '\n' < kernel.builtin.modinfo ext4.softdep=pre: crc32c ext4.license=GPL ext4.description=Fourth Extended Filesystem ext4.author=Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others ext4.alias=fs-ext4 ext4.alias=ext3 ext4.alias=fs-ext3 ext4.alias=ext2 ext4.alias=fs-ext2 md_mod.alias=block-major-9-* md_mod.alias=md md_mod.description=MD RAID framework md_mod.license=GPL md_mod.parmtype=create_on_open:bool md_mod.parmtype=start_dirty_degraded:int ... Co-Developed-by: Gleb Fotengauer-Malinovskiy Signed-off-by: Gleb Fotengauer-Malinovskiy Signed-off-by: Alexey Gladkov --- Makefile | 1 + include/linux/moduleparam.h | 12 +++++------- scripts/link-vmlinux.sh | 8 ++++++++ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index d5713e7b1e50..971102194c92 100644 --- a/Makefile +++ b/Makefile @@ -1288,6 +1288,7 @@ _modinst_: fi @cp -f $(objtree)/modules.order $(MODLIB)/ @cp -f $(objtree)/modules.builtin $(MODLIB)/ + @cp -f $(objtree)/kernel.builtin.modinfo $(MODLIB)/ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst # This depmod is only for convenience to give the initial diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index ba36506db4fb..5ba250d9172a 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h @@ -10,23 +10,21 @@ module name. */ #ifdef MODULE #define MODULE_PARAM_PREFIX /* empty */ +#define __MODULE_INFO_PREFIX /* empty */ #else #define MODULE_PARAM_PREFIX KBUILD_MODNAME "." +/* We cannot use MODULE_PARAM_PREFIX because some modules override it. */ +#define __MODULE_INFO_PREFIX KBUILD_MODNAME "." #endif /* Chosen so that structs with an unsigned long line up. */ #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long)) -#ifdef MODULE #define __MODULE_INFO(tag, name, info) \ static const char __UNIQUE_ID(name)[] \ __used __attribute__((section(".modinfo"), unused, aligned(1))) \ - = __stringify(tag) "=" info -#else /* !MODULE */ -/* This struct is here for syntactic coherency, it is not used */ -#define __MODULE_INFO(tag, name, info) \ - struct __UNIQUE_ID(name) {} -#endif + = __MODULE_INFO_PREFIX __stringify(tag) "=" info + #define __MODULE_PARM_TYPE(name, _type) \ __MODULE_INFO(parmtype, name##type, #name ":" _type) diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh index c8cf45362bd6..399d7e4d11ec 100755 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh @@ -258,10 +258,12 @@ if [ -n "${CONFIG_KALLSYMS}" ]; then # step 1 vmlinux_link "" .tmp_vmlinux1 + "${OBJCOPY}" -R .modinfo .tmp_vmlinux1 kallsyms .tmp_vmlinux1 .tmp_kallsyms1.o # step 2 vmlinux_link .tmp_kallsyms1.o .tmp_vmlinux2 + "${OBJCOPY}" -R .modinfo .tmp_vmlinux2 kallsyms .tmp_vmlinux2 .tmp_kallsyms2.o # step 3 @@ -273,6 +275,7 @@ if [ -n "${CONFIG_KALLSYMS}" ]; then kallsyms_vmlinux=.tmp_vmlinux3 vmlinux_link .tmp_kallsyms2.o .tmp_vmlinux3 + "${OBJCOPY}" -R .modinfo .tmp_vmlinux3 kallsyms .tmp_vmlinux3 .tmp_kallsyms3.o fi @@ -281,6 +284,11 @@ fi info LD vmlinux vmlinux_link "${kallsymso}" vmlinux +info MODINFO kernel.builtin.modinfo +"${OBJCOPY}" -j .modinfo -O binary vmlinux kernel.builtin.modinfo +chmod 444 kernel.builtin.modinfo +"${OBJCOPY}" -R .modinfo vmlinux + if [ -n "${CONFIG_BUILDTIME_EXTABLE_SORT}" ]; then info SORTEX vmlinux sortextable vmlinux -- 2.19.2