Module.symvers的生成以及crc的计算

参考

测试内核模块如下

点击查看代码
#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
posted @ 2023-07-04 11:49  dolinux  阅读(597)  评论(0)    收藏  举报