首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个单独的对象目录中构建一个树外Linux内核模块。

在一个单独的对象目录中构建一个树外Linux内核模块。
EN

Stack Overflow用户
提问于 2011-04-19 15:32:34
回答 6查看 20.7K关注 0票数 10

我正面对(Kbuild,内核≥2.6.28)的目录结构,并为更大的项目构建系统。我们的项目包含一个树外Linux内核模块,我们的目录结构看起来如下(显然是简化的):

代码语言:javascript
复制
checkout/src/common/*.c           source files (common to Linux and other platforms)
checkout/src/linux-driver/*.c     source files (for the Linux kernel driver)
checkout/build/linux/Kbuild       Kbuild
tmp/linux-2.6.xx/                 where the Linux kernel is unpacked and configured
output/linux-arm-debug/           where object files must end up

构建过程不能修改checkout下的任何内容,构建模块时也不能修改tmp/linux-2.6.xx下的任何内容。所有输出文件必须在output/linux-arm-debug下结束(或者在构建时选择任何架构和调试变体)。

我读过kbuild/modules.txt,并开始编写Kbuild文件:

代码语言:javascript
复制
MOD_OUTPUT_DIR = ../../../output/linux-$(ARCH)-$(DEBUG)
obj-m += $(MOD_OUTPUT_DIR)/foo_mod.o
$(MOD_OUTPUT_DIR)/our_module-objs := $(MOD_OUTPUT_DIR)/foo_common.o $(MOD_OUTPUT_DIR)/foo_linux.o

这将处理将对象文件存储在与Kbuild所在的不同目录中的问题。现在我如何指定foo_common.o需要从…/checkout/src/common/foo_common.c编译,foo_linux.o需要从…/checkout/src/linux-driver/foo_linux.c编译

EN

回答 6

Stack Overflow用户

发布于 2016-06-16 11:48:51

下面是一个Makefile,它用源代码树构建出内核-树模块(改编自@Mark的注释).

代码语言:javascript
复制
KDIR ?= /lib/modules/$(shell uname -r)/build
BUILD_DIR ?= $(PWD)/build
BUILD_DIR_MAKEFILE ?= $(PWD)/build/Makefile

default: $(BUILD_DIR_MAKEFILE)
    make -C $(KDIR) M=$(BUILD_DIR) src=$(PWD) modules

$(BUILD_DIR):
    mkdir -p "$@"

$(BUILD_DIR_MAKEFILE): $(BUILD_DIR)
    touch "$@"

clean:
    make -C $(KDIR) M=$(BUILD_DIR) src=$(PWD) clean

注意:你还需要一个Kbuild文件..。

代码语言:javascript
复制
obj-m += my_driver.o
票数 11
EN

Stack Overflow用户

发布于 2013-12-11 04:57:53

我也有过类似的问题。我对linux_2_6_34/scripts/Makefile.build进行了如下修改。

代码语言:javascript
复制
ifdef SRCDIR
src := $(SRCDIR)
else
src := $(obj)
endif

SRCDIR是目录源。

要编译模块,请运行

代码语言:javascript
复制
make -c $(KDIR) M=$(Your_output_dir) SRCDIR=$(your source directory)`
票数 3
EN

Stack Overflow用户

发布于 2011-04-28 19:49:30

我的不雅但有效的解决方案是将源文件复制到输出树中。

代码语言:javascript
复制
FOO_SOURCES_DIR = $(src)/../../../checkout/src
FOO_MOD_OUTPUT_DIR = ../../../output/linux-$(ARCH)-$(DEBUG)

# Specify the object files
obj-m += $(FOO_MOD_OUTPUT_DIR)/foo_mod.o
FOO_MODULE_OBJS := $(FOO_MOD_OUTPUT_DIR)/foo_common.o $(FOO_MOD_OUTPUT_DIR)/foo_linux.o
$(FOO_MOD_OUTPUT_DIR)/foo_mod-objs := $(FOO_MODULE_OBJS)

# Where to find the sources
$(src)/$(FOO_MOD_OUTPUT_DIR)/foo_common.c: $(FOO_SOURCES_DIR)/common/foo_common.c
$(src)/$(FOO_MOD_OUTPUT_DIR)/foo_linux.c: $(FOO_SOURCES_DIR)/linux-driver/foo_linux.c

# Rules to copy the sources
FOO_COPIED_SOURCES = $(patsubst %.o,$(src)/%.c,$(FOO_MODULE_OBJS))
$(FOO_COPIED_SOURCES):
        $(Q)mkdir -p $(@D)
        cp -f $< $@
clean-files += $(FOO_COPIED_SOURCES)
clean-dirs += $(FOO_MOD_OUTPUT_DIR)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5718899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档