Module.symvers的生成以及crc的计算
参考
- https://unix.stackexchange.com/questions/24704/how-to-generate-module-symvers
- CRC calculation in Module.symvers
测试内核模块如下
点击查看代码
#define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/mm.h>
struct demo_struct1
{
int a;
int b;
int c;
int d;
int f;
};
struct demo_struct2
{
int a;
int b;
int c;
int d;
};
void mod_test_01(void)
{
}
EXPORT_SYMBOL(mod_test_01);
void mod_test_02(int a)
{
}
EXPORT_SYMBOL(mod_test_02);
void mod_test_03(int a, int b)
{
}
EXPORT_SYMBOL(mod_test_03);
void mod_test_04(int a, int b)
{
}
EXPORT_SYMBOL_GPL(mod_test_04);
void mod_test_05(struct demo_struct1 a, int b)
{
}
EXPORT_SYMBOL_GPL(mod_test_05);
void mod_test_06(struct demo_struct1 a, struct demo_struct1 c)
{
}
EXPORT_SYMBOL_GPL(mod_test_06);
void mod_test_07(struct demo_struct1 *a, struct demo_struct2 *b)
{
}
EXPORT_SYMBOL_GPL(mod_test_07);
static int mod_open(struct inode *ino, struct file *file)
{
return 0;
}
static int mod_close (struct inode *ino, struct file *filp)
{
return 0;
}
static long mod_ioctl (struct file *file, unsigned int cmd, unsigned long data)
{
return 0;
}
static struct file_operations mod_test_fops = {
.owner = THIS_MODULE,
.open = mod_open,
.release = mod_close,
.unlocked_ioctl = mod_ioctl,
};
static struct miscdevice mod_miscdev = {
.fops = &mod_test_fops,
.name = "mod_test",
.minor = MISC_DYNAMIC_MINOR,
};
static int __init test_mod_init(void)
{
int ret = 0;
ret = misc_register(&mod_miscdev);
if (ret)
pr_err("misc register failed: %d\n", ret);
return ret;
}
static void __exit test_mod_exit(void)
{
misc_deregister(&mod_miscdev);
}
module_init(test_mod_init);
module_exit(test_mod_exit);
MODULE_LICENSE("GPL");
编译的日志
点击查看代码
make -C /home/pengdl/work/Qemu/x86_64/linux-6.4-rc5/ M=/home/pengdl/x86_64/modules/test_module/ test_mod.i
make[1]: Entering directory '/home/pengdl/work/Qemu/x86_64/linux-6.4-rc5'
CPP [M] /home/pengdl/x86_64/modules/test_module/test_mod.i
make[1]: Leaving directory '/home/pengdl/work/Qemu/x86_64/linux-6.4-rc5'
make -C /home/pengdl/work/Qemu/x86_64/linux-6.4-rc5/ M=/home/pengdl/x86_64/modules/test_module/ test_mod.symtypes
make[1]: Entering directory '/home/pengdl/work/Qemu/x86_64/linux-6.4-rc5'
SYM [M] /home/pengdl/x86_64/modules/test_module/test_mod.symtypes
make[1]: Leaving directory '/home/pengdl/work/Qemu/x86_64/linux-6.4-rc5'
make -C /home/pengdl/work/Qemu/x86_64/linux-6.4-rc5/ M=/home/pengdl/x86_64/modules/test_module/ KBUILD_VERSION=1 modules V=1
make[1]: Entering directory '/home/pengdl/work/Qemu/x86_64/linux-6.4-rc5'
make -f ./scripts/Makefile.build obj=/home/pengdl/x86_64/modules/test_module need-builtin=1 need-modorder=1
# CC [M] /home/pengdl/x86_64/modules/test_module/test_mod.o
gcc -Wp,-MMD,/home/pengdl/x86_64/modules/test_module/.test_mod.o.d -nostdinc -I./arch/x86/include -I./arch/x86/include/generated -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -Werror -fmacro-prefix-map=./= -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Wno-format-security -funsigned-char -std=gnu11 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -fcf-protection=branch -fno-jump-tables -m64 -falign-jumps=1 -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel -Wno-sign-compare -fno-asynchronous-unwind-tables -mindirect-branch=thunk-extern -mindirect-branch-register -mfunction-return=thunk-extern -fno-jump-tables -fpatchable-function-entry=16,16 -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -O2 --param=allow-store-data-races=0 -Wframe-larger-than=2048 -fstack-protector-strong -Wno-main -Wno-unused-but-set-variable -Wno-unused-const-variable -fno-stack-***-protection -pg -mrecord-mcount -mfentry -DCC_USING_FENTRY -falign-functions=16 -Wdeclaration-after-statement -Wvla -Wno-pointer-sign -Wcast-function-type -Wno-stringop-truncation -Wno-stringop-overflow -Wno-restrict -Wno-maybe-uninitialized -Wimplicit-fallthrough=5 -fno-strict-overflow -fno-stack-check -fconserve-stack -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -Wno-packed-not-aligned -g -DEXPORT_SYMTAB -DMODULE -DKBUILD_BASENAME='"test_mod"' -DKBUILD_MODNAME='"test_mod"' -D__KBUILD_MODNAME=kmod_test_mod -c -o /home/pengdl/x86_64/modules/test_module/test_mod.o /home/pengdl/x86_64/modules/test_module/test_mod.c ; ./tools/objtool/objtool --hacks=jump_label --hacks=noinstr --hacks=skylake --ibt --orc --retpoline --rethunk --static-call --uaccess --prefix=16 --link --module /home/pengdl/x86_64/modules/test_module/test_mod.o
# cmd_check_local_export /home/pengdl/x86_64/modules/test_module/test_mod.o
./scripts/check-local-export /home/pengdl/x86_64/modules/test_module/test_mod.o
# cmd_gen_objtooldep /home/pengdl/x86_64/modules/test_module/test_mod.o
{ echo ; echo '/home/pengdl/x86_64/modules/test_module/test_mod.o: $(wildcard ./tools/objtool/objtool)' ; } >> /home/pengdl/x86_64/modules/test_module/.test_mod.o.cmd
# cmd_gen_symversions_c /home/pengdl/x86_64/modules/test_module/test_mod.o
if nm /home/pengdl/x86_64/modules/test_module/test_mod.o 2>/dev/null | grep -q __ksymtab; then gcc -E -D__GENKSYMS__ -Wp,-MMD,/home/pengdl/x86_64/modules/test_module/.test_mod.o.d -nostdinc -I./arch/x86/include -I./arch/x86/include/generated -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -Werror -fmacro-prefix-map=./= -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Wno-format-security -funsigned-char -std=gnu11 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -fcf-protection=branch -fno-jump-tables -m64 -falign-jumps=1 -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel -Wno-sign-compare -fno-asynchronous-unwind-tables -mindirect-branch=thunk-extern -mindirect-branch-register -mfunction-return=thunk-extern -fno-jump-tables -fpatchable-function-entry=16,16 -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -O2 --param=allow-store-data-races=0 -Wframe-larger-than=2048 -fstack-protector-strong -Wno-main -Wno-unused-but-set-variable -Wno-unused-const-variable -fno-stack-***-protection -pg -mrecord-mcount -mfentry -DCC_USING_FENTRY -falign-functions=16 -Wdeclaration-after-statement -Wvla -Wno-pointer-sign -Wcast-function-type -Wno-stringop-truncation -Wno-stringop-overflow -Wno-restrict -Wno-maybe-uninitialized -Wimplicit-fallthrough=5 -fno-strict-overflow -fno-stack-check -fconserve-stack -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -Wno-packed-not-aligned -g -DEXPORT_SYMTAB -DMODULE -DKBUILD_BASENAME='"test_mod"' -DKBUILD_MODNAME='"test_mod"' -D__KBUILD_MODNAME=kmod_test_mod /home/pengdl/x86_64/modules/test_module/test_mod.c | scripts/genksyms/genksyms -r /dev/null >> /home/pengdl/x86_64/modules/test_module/.test_mod.o.cmd; fi
# cmd_mod /home/pengdl/x86_64/modules/test_module/test_mod.mod
printf '%s
' test_mod.o | awk '!x[$0]++ { print("/home/pengdl/x86_64/modules/test_module/"$0) }' > /home/pengdl/x86_64/modules/test_module/test_mod.mod
# cmd_modules_order /home/pengdl/x86_64/modules/test_module/modules.order
{ echo /home/pengdl/x86_64/modules/test_module/test_mod.o; :; } > /home/pengdl/x86_64/modules/test_module/modules.order
sh ./scripts/modules-check.sh /home/pengdl/x86_64/modules/test_module/modules.order
make -f ./scripts/Makefile.modpost
# MODPOST /home/pengdl/x86_64/modules/test_module/Module.symvers
scripts/mod/modpost -m -o /home/pengdl/x86_64/modules/test_module/Module.symvers -T /home/pengdl/x86_64/modules/test_module/modules.order -i Module.symvers -e
make -f ./scripts/Makefile.modfinal
# CC [M] /home/pengdl/x86_64/modules/test_module/test_mod.mod.o
gcc -Wp,-MMD,/home/pengdl/x86_64/modules/test_module/.test_mod.mod.o.d -nostdinc -I./arch/x86/include -I./arch/x86/include/generated -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -Werror -fmacro-prefix-map=./= -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Wno-format-security -funsigned-char -std=gnu11 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -fcf-protection=branch -fno-jump-tables -m64 -falign-jumps=1 -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel -Wno-sign-compare -fno-asynchronous-unwind-tables -mindirect-branch=thunk-extern -mindirect-branch-register -mfunction-return=thunk-extern -fno-jump-tables -fpatchable-function-entry=16,16 -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -O2 --param=allow-store-data-races=0 -Wframe-larger-than=2048 -fstack-protector-strong -Wno-main -Wno-unused-but-set-variable -Wno-unused-const-variable -fno-stack-***-protection -pg -mrecord-mcount -mfentry -DCC_USING_FENTRY -falign-functions=16 -Wdeclaration-after-statement -Wvla -Wno-pointer-sign -Wcast-function-type -Wno-stringop-truncation -Wno-stringop-overflow -Wno-restrict -Wno-maybe-uninitialized -Wimplicit-fallthrough=5 -fno-strict-overflow -fno-stack-check -fconserve-stack -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -Wno-packed-not-aligned -g -DMODULE -DKBUILD_BASENAME='"test_mod.mod"' -DKBUILD_MODNAME='"test_mod"' -D__KBUILD_MODNAME=kmod_test_mod -c -o /home/pengdl/x86_64/modules/test_module/test_mod.mod.o /home/pengdl/x86_64/modules/test_module/test_mod.mod.c
# LD [M] /home/pengdl/x86_64/modules/test_module/test_mod.ko
ld -r -m elf_x86_64 -z noexecstack --build-id=sha1 -T scripts/module.lds -o /home/pengdl/x86_64/modules/test_module/test_mod.ko /home/pengdl/x86_64/modules/test_module/test_mod.o /home/pengdl/x86_64/modules/test_module/test_mod.mod.o; true
# BTF [M] /home/pengdl/x86_64/modules/test_module/test_mod.ko
if [ ! -f vmlinux ]; then printf "Skipping BTF generation for %s due to unavailability of vmlinux
" /home/pengdl/x86_64/modules/test_module/test_mod.ko 1>&2; elif [ -n "" ] && ./scripts/is_rust_module.sh /home/pengdl/x86_64/modules/test_module/test_mod.ko; then printf "Skipping BTF generation for %s because it's a Rust module
" /home/pengdl/x86_64/modules/test_module/test_mod.ko 1>&2; else LLVM_OBJCOPY="objcopy" pahole -J --skip_encoding_btf_vars --btf_gen_floats --btf_base vmlinux /home/pengdl/x86_64/modules/test_module/test_mod.ko; ./tools/bpf/resolve_btfids/resolve_btfids -b vmlinux /home/pengdl/x86_64/modules/test_module/test_mod.ko; fi;
make[1]: Leaving directory '/home/pengdl/work/Qemu/x86_64/linux-6.4-rc5'
cp *.ko ../../share/
crc是通过下面的命令生成的
点击查看代码
if nm /home/pengdl/x86_64/modules/test_module/test_mod.o 2>/dev/null | grep -q __ksymtab; then gcc -E -D__GENKSYMS__ -Wp,-MMD,/home/pengdl/x86_64/modules/test_module/.test_mod.o.d -nostdinc -I./arch/x86/include -I./arch/x86/include/generated -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -Werror -fmacro-prefix-map=./= -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Wno-format-security -funsigned-char -std=gnu11 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -fcf-protection=branch -fno-jump-tables -m64 -falign-jumps=1 -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel -Wno-sign-compare -fno-asynchronous-unwind-tables -mindirect-branch=thunk-extern -mindirect-branch-register -mfunction-return=thunk-extern -fno-jump-tables -fpatchable-function-entry=16,16 -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -O2 --param=allow-store-data-races=0 -Wframe-larger-than=2048 -fstack-protector-strong -Wno-main -Wno-unused-but-set-variable -Wno-unused-const-variable -fno-stack-***-protection -pg -mrecord-mcount -mfentry -DCC_USING_FENTRY -falign-functions=16 -Wdeclaration-after-statement -Wvla -Wno-pointer-sign -Wcast-function-type -Wno-stringop-truncation -Wno-stringop-overflow -Wno-restrict -Wno-maybe-uninitialized -Wimplicit-fallthrough=5 -fno-strict-overflow -fno-stack-check -fconserve-stack -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -Wno-packed-not-aligned -g -DEXPORT_SYMTAB -DMODULE -DKBUILD_BASENAME='"test_mod"' -DKBUILD_MODNAME='"test_mod"' -D__KBUILD_MODNAME=kmod_test_mod /home/pengdl/x86_64/modules/test_module/test_mod.c | scripts/genksyms/genksyms -r /dev/null >> /home/pengdl/x86_64/modules/test_module/.test_mod.o.cmd; fi
把关键的语句提取出来,然后需要在内核源码目录下执行
点击查看代码
gcc -E -D__GENKSYMS__ -Wp,-MMD,/home/pengdl/x86_64/modules/test_module/.test_mod.o.d -nostdinc -I./arch/x86/include -I./arch/x86/include/generated -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -Werror -fmacro-prefix-map=./= -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Wno-format-security -funsigned-char -std=gnu11 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -fcf-protection=branch -fno-jump-tables -m64 -falign-jumps=1 -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel -Wno-sign-compare -fno-asynchronous-unwind-tables -mindirect-branch=thunk-extern -mindirect-branch-register -mfunction-return=thunk-extern -fno-jump-tables -fpatchable-function-entry=16,16 -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -O2 --param=allow-store-data-races=0 -Wframe-larger-than=2048 -fstack-protector-strong -Wno-main -Wno-unused-but-set-variable -Wno-unused-const-variable -fno-stack-***-protection -pg -mrecord-mcount -mfentry -DCC_USING_FENTRY -falign-functions=16 -Wdeclaration-after-statement -Wvla -Wno-pointer-sign -Wcast-function-type -Wno-stringop-truncation -Wno-stringop-overflow -Wno-restrict -Wno-maybe-uninitialized -Wimplicit-fallthrough=5 -fno-strict-overflow -fno-stack-check -fconserve-stack -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -Wno-packed-not-aligned -g -DEXPORT_SYMTAB -DMODULE -DKBUILD_BASENAME='"test_mod"' -DKBUILD_MODNAME='"test_mod"' -D__KBUILD_MODNAME=kmod_test_mod /home/pengdl/x86_64/modules/test_module/test_mod.c | scripts/genksyms/genksyms -r /dev/null
输出如下:
#SYMVER mod_test_01 0x1945b747
#SYMVER mod_test_02 0x7fc2cdde
#SYMVER mod_test_03 0x47d33f35
#SYMVER mod_test_04 0xba2ac740
#SYMVER mod_test_05 0xf2f91a3b
#SYMVER mod_test_06 0xded249a2
#SYMVER mod_test_07 0xd3ca0eba
给genksyms增加调试选项-D:
点击查看代码
gcc -E -D__GENKSYMS__ -Wp,-MMD,/home/pengdl/x86_64/modules/test_module/.test_mod.o.d -nostdinc -I./arch/x86/include -I./arch/x86/include/generated -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -Werror -fmacro-prefix-map=./= -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Wno-format-security -funsigned-char -std=gnu11 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -fcf-protection=branch -fno-jump-tables -m64 -falign-jumps=1 -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel -Wno-sign-compare -fno-asynchronous-unwind-tables -mindirect-branch=thunk-extern -mindirect-branch-register -mfunction-return=thunk-extern -fno-jump-tables -fpatchable-function-entry=16,16 -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -O2 --param=allow-store-data-races=0 -Wframe-larger-than=2048 -fstack-protector-strong -Wno-main -Wno-unused-but-set-variable -Wno-unused-const-variable -fno-stack-***-protection -pg -mrecord-mcount -mfentry -DCC_USING_FENTRY -falign-functions=16 -Wdeclaration-after-statement -Wvla -Wno-pointer-sign -Wcast-function-type -Wno-stringop-truncation -Wno-stringop-overflow -Wno-restrict -Wno-maybe-uninitialized -Wimplicit-fallthrough=5 -fno-strict-overflow -fno-stack-check -fconserve-stack -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -Wno-packed-not-aligned -g -DEXPORT_SYMTAB -DMODULE -DKBUILD_BASENAME='"test_mod"' -DKBUILD_MODNAME='"test_mod"' -D__KBUILD_MODNAME=kmod_test_mod /home/pengdl/x86_64/modules/test_module/test_mod.c | scripts/genksyms/genksyms -r /dev/null -D
输出如下:
Export mod_test_01 == <void mod_test_01 ( void ) >
#SYMVER mod_test_01 0x1945b747
Export mod_test_02 == <void mod_test_02 ( int ) >
#SYMVER mod_test_02 0x7fc2cdde
Export mod_test_03 == <void mod_test_03 ( int , int ) >
#SYMVER mod_test_03 0x47d33f35
Export mod_test_04 == <void mod_test_04 ( int , int ) >
#SYMVER mod_test_04 0xba2ac740
Export mod_test_05 == <void mod_test_05 ( struct demo_struct1 { UNKNOWN } , int ) >
#SYMVER mod_test_05 0xf2f91a3b
Export mod_test_06 == <void mod_test_06 ( struct demo_struct1 { UNKNOWN } , struct demo_struct1 ) >
#SYMVER mod_test_06 0xded249a2
Export mod_test_07 == <void mod_test_07 ( struct demo_struct1 { UNKNOWN } * , struct demo_struct2 { UNKNOWN } * ) >
#SYMVER mod_test_07 0xd3ca0eba
本文来自博客园,作者:dolinux,未经同意,禁止转载

浙公网安备 33010602011771号