Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp1160673yba; Sat, 6 Apr 2019 05:17:30 -0700 (PDT) X-Google-Smtp-Source: APXvYqyz1PekVuVobUMU7YWRodV624om1eBCNhaRzfQS8gHLrEOjiOC9klg1yuLIL+Qk21nokHZm X-Received: by 2002:aa7:8289:: with SMTP id s9mr18290537pfm.208.1554553050381; Sat, 06 Apr 2019 05:17:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554553050; cv=none; d=google.com; s=arc-20160816; b=XySNNUG3Zym7vx+ECPW6yxCPmLo6pEKU6ZpEM31MD9g4cJXUBVtnl6a5dKi/QzUYV8 vANCz1F3yHTK0BIoOXNvCalUFWuP53XgWWLbn0p7zYqRKBgrb+j4pYnFGDg5/h1Mlx2l qu6L49MDgU6NNlPlEHNsZaBFb4CRxwoCSTmDFs3tz1IAm+3Dir1MBnIzwcvHdnwWLHij fx9J5UZME8eO6X2ll5SJEZeTPz95NUUIrGMi1qQHGl5QB0AwNdKKVioa3kTDf88ZHv/B p0SVVJQUIy9DLB+X/6y5dNvB7PqYwmUsSaCZ01YzuSafmxK2fmJWhT2ayxCoahB8VgSs ciiw== 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=pvLy7MBoV8i7kq15XzUBOfagxFqVKFAMaDoInvR6jbo=; b=nCzoEDW9UUf9bGJiPv4oDobMjlXanbH0SsrtqurwSF/8H4sKU7RxOR9U8xsyz8Hhsk tfIOhtkR6dpcsPW0rrHgueZsAU95yOwSf82G5LXbtVUUv5GebziL/6eoO9RYK0k4zOs9 j9fI+I/+os6LtLPbDn4wYwuLWLO6ldeIv1k+uUCr8ne+/DKGC2QwanGiq6KjSbK0cbMr jBJAjdcXHO+QSi81xQRILmKv2iYO3QEEu/bQIythgqORnFwlwTicJL5CRTrEvyeZo3ha ihzXtdd0tdCX799iHFLt19UE8Qcus9W1cAYx144QQ8KGs4gpla92BPDVAFz/5UxqEAlD D/tg== 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 f9si20685482pgq.347.2019.04.06.05.17.13; Sat, 06 Apr 2019 05:17:30 -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 S1726494AbfDFMPJ (ORCPT + 99 others); Sat, 6 Apr 2019 08:15:09 -0400 Received: from monster.unsafe.ru ([5.9.28.80]:59476 "EHLO mail.unsafe.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726310AbfDFMPJ (ORCPT ); Sat, 6 Apr 2019 08:15:09 -0400 Received: from localhost.localdomain (ip-89-102-33-211.net.upcbroadband.cz [89.102.33.211]) (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 3BC43C61A84; Sat, 6 Apr 2019 12:14:50 +0000 (UTC) Date: Sat, 6 Apr 2019 14:14:47 +0200 From: Alexey Gladkov To: Masahiro Yamada Cc: linux-kernel@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-api@vger.kernel.org, linux-modules@vger.kernel.org, "Kirill A . Shutemov" , Gleb Fotengauer-Malinovskiy , "Dmitry V. Levin" , Michal Marek , Dmitry Torokhov , Rusty Russell , Jessica Yu , Lucas De Marchi Subject: [PATCH v2] moduleparam: Save information about built-in modules in separate file Message-ID: <20190406121447.GB4047@localhost.localdomain> 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 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 ... v2: * Extract modinfo from vmlinux.o as suggested by Masahiro Yamada; * Rename output file to kernel.builtin; * Add MODULE_VERSION to modinfo that is saved to the kernel.builtin; * Fix build warnings on powerpc. Co-Developed-by: Gleb Fotengauer-Malinovskiy Signed-off-by: Gleb Fotengauer-Malinovskiy Signed-off-by: Alexey Gladkov --- .gitignore | 1 + Makefile | 2 ++ include/asm-generic/vmlinux.lds.h | 1 + include/linux/module.h | 1 + include/linux/moduleparam.h | 12 +++++------- scripts/link-vmlinux.sh | 4 ++++ 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index a20ac26aa2f5..432332fd745e 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ *.xz Module.symvers modules.builtin +kernel.builtin # # Top-level generic files diff --git a/Makefile b/Makefile index d5713e7b1e50..d9dc6211fbc7 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 $(MODLIB)/ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst # This depmod is only for convenience to give the initial @@ -1328,6 +1329,7 @@ endif # CONFIG_MODULES # Directories & files removed with 'make clean' CLEAN_DIRS += $(MODVERDIR) include/ksym +CLEAN_FILES += kernel.builtin # Directories & files removed with 'make mrproper' MRPROPER_DIRS += include/config usr/include include/generated \ diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 3d7a6a9c2370..44c724bf7d3a 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -844,6 +844,7 @@ EXIT_CALL \ *(.discard) \ *(.discard.*) \ + *(.modinfo) \ } /** diff --git a/include/linux/module.h b/include/linux/module.h index f5bc4c046461..1cae28b1172a 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -237,6 +237,7 @@ extern typeof(name) __mod_##type##__##name##_device_table \ #define MODULE_VERSION(_version) MODULE_INFO(version, _version) #else #define MODULE_VERSION(_version) \ + MODULE_INFO(version, _version); \ static struct module_version_attribute ___modver_attr = { \ .mattr = { \ .attr = { \ 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..b914e026ef28 100755 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh @@ -226,6 +226,10 @@ modpost_link vmlinux.o # modpost vmlinux.o to check for section mismatches ${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o +info MODINFO kernel.builtin +"${OBJCOPY}" -j .modinfo -O binary vmlinux.o kernel.builtin +chmod 444 kernel.builtin + kallsymso="" kallsyms_vmlinux="" if [ -n "${CONFIG_KALLSYMS}" ]; then -- 2.21.0