build external module splited into several files

Colin Vidal colin at cvidal.org
Mon Apr 4 14:00:09 EDT 2016


Hi all,

I'm currently reading LDD the 3rd edition. Chapter 2 says that if we
need for example to build module "foo.c" which is split in two other
files "sub1.c" and "sub2.c", we just have to define the following
Kbuild variable in the makefile:

foo-objs := sub1.o sub2.o

I suppose that 

foo-y := sub1.o sub2.o

has the same semantic ? That's not very clear to me.

Anyway, the thing is that if I didn't use "sub1.c" and "sub2.c" (I
comment "foo-objs" line in the makefile and I define variables sub1 and
sub2 in "hello.c"), I've got the info messages in dmesg as well.
However, if I use "sub1.c" and "sub2.c" (the whole code at the end of
this mail), I get nothing, but the module still loaded anyway (insmod
returns no error and rmmod neither).

I think I'm missing something, but I didn't figure it out... I run
Linux 4.5 that I build from master sources. I'm not very settle into
the whole configuration options, so I use "make olddefconfig" on Fedora
4.4.6-300 config file.

Thanks,

Colin

---

Makefile:

obj-m := hello.o
hello-y := sub1.o sub2.o

KDIR=/lib/modules/$(shell uname -r)/build

all:
        $(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
        $(MAKE) -C $(KDIR) M=$(PWD) clean

---

hello.c:

#include <linux/module.h>
#include <linux/printk.h>

extern int sub1;
extern int sub2;

static int __init hello_init(void)
{
        pr_info("Hello, world! %d\n", sub1);
        return 0;
}

static void __exit hello_exit(void)
{
        pr_info("Bye. %d\n", sub2);
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");

---

sub1.c:

int sub1 = 55;

---

sub2.c:

int sub2 = 345;



More information about the Kernelnewbies mailing list