--- /dev/null
+ifneq ($(KERNELRELEASE),)
+# kbuild part of makefile
+obj-m := moduleA.o moduleB.o moduleC.o
+else
+# normal makefile
+KDIR ?= /lib/modules/`uname -r`/build
+KVER ?= `uname -r`
+TESTDIR_BASE := /tmp/test-kmod
+TESTDIR := $(TESTDIR_BASE)/lib/modules/$(KVER)/
+
+default:
+ $(MAKE) -C $(KDIR) M=$$PWD
+
+install: default
+ mkdir -p $(TESTDIR)/kernel/
+ cp *.ko $(TESTDIR)/kernel/
+ cp modules.order $(TESTDIR)
+ depmod -a -b $(TESTDIR_BASE) $(KVER)
+
+clean:
+ $(MAKE) -C $(KDIR) M=$$PWD clean
+
+endif
--- /dev/null
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/printk.h>
+
+#include "printmodule.h"
+
+static int __init test_module_init(void)
+{
+ printA();
+ printB();
+ return 0;
+}
+module_init(test_module_init);
+
+void printA(void)
+{
+ pr_warn("Hello, world A\n");
+}
+EXPORT_SYMBOL(printA);
+
+MODULE_AUTHOR("Lucas De Marchi <lucas.demarchi@intel.com>");
+MODULE_LICENSE("GPL");
--- /dev/null
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/printk.h>
+
+#include "printmodule.h"
+
+static int __init test_module_init(void)
+{
+ printB();
+ printC();
+
+ return 0;
+}
+module_init(test_module_init);
+
+void printB(void)
+{
+ pr_warn("Hello, world B\n");
+}
+EXPORT_SYMBOL(printB);
+
+MODULE_AUTHOR("Lucas De Marchi <lucas.demarchi@intel.com>");
+MODULE_LICENSE("GPL");
--- /dev/null
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/printk.h>
+
+#include "printmodule.h"
+
+static int __init test_module_init(void)
+{
+ printC();
+ printB();
+ return 0;
+}
+module_init(test_module_init);
+
+void printC(void)
+{
+ pr_warn("Hello, world C\n");
+}
+EXPORT_SYMBOL(printC);
+
+MODULE_AUTHOR("Lucas De Marchi <lucas.demarchi@intel.com>");
+MODULE_LICENSE("GPL");
--- /dev/null
+#pragma once
+
+void printA(void);
+void printB(void);
+void printC(void);