Re: Building external module

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Jun 28, 2008 at 3:14 AM, Adrian Bunk <bunk@xxxxxxxxxx> wrote:
> On Sat, Jun 28, 2008 at 02:51:51AM +0500, Shaz wrote:
>> On Sat, Jun 28, 2008 at 2:32 AM, Adrian Bunk <bunk@xxxxxxxxxx> wrote:
>> > On Sat, Jun 28, 2008 at 02:16:14AM +0500, Shaz wrote:
>> >> Hi,
>> >>
>> >> Need to compile an external module as a kernel built-in module. Its
>> >> Makefile is set as obj-m meaning as a loadable module so it will be
>> >> kept on filesystem separately. This means I have to do obj-y to make
>> >> it built-in. But I wanted to know, before I just try it out, that the
>> >> Makefile of the kernel module is way too complex for me and there was
>> >> an install target which is creating files for miscilleneous functions
>> >> of the module and it had a /dev/<module-name>, which means its a
>> >> device driver.
>> >>
>> >> So what do I need to consider apart from the change obj-m to obj-y?
>> >
>> > It does not work this way.
>>
>> Are you sure because in kernel top-level Makefile contains SUBDIRS
>> symbol for external modules and if it contains a path then target all
>> becomes _all else _all becomes modules. Personally, I am not sure of
>> this behavior but I think if we can do obj-y instead of obj-m than
>> maybe this module is built-in. Sorry you already said it's not
>> possible but I am still curious why it doesn't in the light of
>> SUBDIRS.
>
> The reason is simple:
> When an external module gets built the kernel image is not rebuilt.

Thats what I am trying to say. I am newbie but the following makes sense to me:

If the SUBDIRS will take "make" to the external module by setting its
value to KBUILD_EXTMOD. Consider the following lines from kernel
Makefile:

# If building an external module we do not care about the all: rule
# but instead _all depend on modules
PHONY += all
ifeq ($(KBUILD_EXTMOD),)
_all: all
else
_all: modules
endif

If the module's Makefile consists of obj-y instead of obj-y then its
should work. ...?

>
>> By the way can you suggest how do I workout getting the code inside
>> the kernel source.
>>
>> Analyzing the following from module's Makefile:
>>
>> all:  $(src)/crypto/gmp.h $(src)/crypto/libgmp.a
>>       @$(MAKE) -C $(KERNEL_BUILD) M=$(CURDIR) modules
>>
>> I thought maybe if i replace "modules" with "all", it might have the
>> same effect as what I suggested in case of SUBDIRS for kernel
>> Makefile.
>
> Where can I find the source for this module?

I am not sure what you mean by the source of the module? If you mean
source to the module Makefile then here it is:

---------------------------------------------
# kernel settings
KERNEL_RELEASE := $(shell uname -r)
KERNEL_BUILD   := /lib/modules/$(KERNEL_RELEASE)/build
MOD_SUBDIR     := misc

# GNU MP configuration
GMP_LIB        := /usr/lib/libgmp.a
GMP_HEADER     := /usr/include/gmp.h

# sources and objects
src            ?= .
DIRS           := . crypto <MODULE_NAME>
SRCS           := $(foreach dir, $(DIRS), $(wildcard $(src)/$(dir)/*.c))
OBJS           := $(patsubst %.c, %.o, $(SRCS))
SRCS           += $(foreach dir, $(DIRS), $(wildcard $(src)/$(dir)/*.h))
DISTSRC        := ./README ./AUTHORS ./ChangeLog ./Makefile $(SRCS)
DISTDIR        :=
<MODULE_NAME>-$(VERSION_MAJOR).$(VERSION_MINOR)$(VERSION_SUFFIX)

# module settings
MODULE_NAME    := <MODULE_NAME>
obj-m               := $(MODULE_NAME).o
$(MODULE_NAME)-objs := $(patsubst $(src)/%.o, %.o, $(OBJS)) crypto/libgmp.a

# do not print "Entering directory ..."
MAKEFLAGS      += --no-print-directory
EXTRA_CFLAGS   += -Wall -Werror -DDEBUG -I$(src) -I$(src)/crypto
-I$(src)/<MODULE_NAME>

all:	$(src)/crypto/gmp.h $(src)/crypto/libgmp.a
	@$(MAKE) -C $(KERNEL_BUILD) M=$(CURDIR) all

clean:
	@$(MAKE) -C $(KERNEL_BUILD) M=$(CURDIR) clean
	rm -f $(src)/crypto/gmp.h $(src)/crypto/libgmp.a $(src)/Modules.symvers

install:
	@$(MAKE) -C $(KERNEL_BUILD) M=$(CURDIR) modules_install
	test -d /var/<MODULE_NAME> || mkdir /var/<MODULE_NAME>
	test -c /dev/<MODULE_NAME> || mknod /dev/<MODULE_NAME> c 10 224
	depmod -a

$(src)/crypto/libgmp.a:
	test -e $(src)/crypto/libgmp.a || ln -s $(GMP_LIB) $(src)/crypto/libgmp.a

# Note: We have to make sure that we use stack-based calling conventions
# when using GNU MP library functions
$(src)/crypto/gmp.h:
	test -r $(src)/crypto/gmp.h || cat $(GMP_HEADER) | \
		sed -e "s/\(__GMP_DECLSPEC [^e].*\);/\1 __attribute__ ((regparm(0)));/" | \
		sed -e "s/^int$$/int __attribute__ ((regparm(0)))/" | \
		sed -e "s/^void$$/void __attribute__ ((regparm(0)))/" | \
		sed -e "s/^size_t$$/size_t __attribute__ ((regparm(0)))/" | \
		sed -e "s/^mp_limb_t$$/mp_limb_t __attribute__ ((regparm(0)))/" | \
		sed -e "s/^__GMP_EXTERN_INLINE void$$/__GMP_EXTERN_INLINE void
__attribute__ ((regparm(0)))/" | \
		sed -e "s/^unsigned long$$/unsigned long __attribute__ ((regparm(0)))/" | \
		sed -e "s/\(.* (\*__gmp_allocate_func) .*\);/\1 __attribute__
((regparm(0)));/" | \
		sed -e "s/\(.* (\*__gmp_reallocate_func) .*\);/\1 __attribute__
((regparm(0)));/" | \
		sed -e "s/\(.* (\*__gmp_free_func) .*\);/\1 __attribute__ ((regparm(0)));/" \
		> $(src)/crypto/gmp.h

.PHONY: all clean install

------------------------------------------
>
>> Thanks
>
> cu
> Adrian
>
> --
>
>       "Is there not promise of rain?" Ling Tan asked suddenly out
>        of the darkness. There had been need of rain for many days.
>       "Only a promise," Lao Er said.
>                                       Pearl S. Buck - Dragon Seed
>
>



-- 
Shaz

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux