【问题标题】:make is not creating the kernel object filemake 没有创建内核目标文件
【发布时间】:2014-10-13 15:11:13
【问题描述】:

我正在修改现有的内核模块 SCTP。我已经把它做成了一个可加载的内核模块,这样我就可以修改模块并在运行时进行测试。该模块的Makefile为:

#
# Makefile for SCTP support code.
#

obj-$(CONFIG_IP_SCTP) += sctp.o
obj-$(CONFIG_NET_SCTPPROBE) += sctp_probe.o

sctp-y := sm_statetable.o sm_statefuns.o sm_sideeffect.o \
      protocol.o endpointola.o associola.o \
      transport.o chunk.o sm_make_chunk.o ulpevent.o \
      inqueue.o outqueue.o ulpqueue.o command.o \
      tsnmap.o bind_addr.o socket.o primitive.o \
      output.o input.o debug.o ssnmap.o auth.o

sctp_probe-y := probe.o

sctp-$(CONFIG_SCTP_DBG_OBJCNT) += objcnt.o
sctp-$(CONFIG_PROC_FS) += proc.o
sctp-$(CONFIG_SYSCTL) += sysctl.o

sctp-$(subst m,y,$(CONFIG_IPV6))    += ipv6.o

当我运行 make 时,它​​会创建 3 个文件 sctp_probe.o, sctp.o and modules.order。但是sctp_probe.ko and sctp.ko不是由上面的Makefile创建的。

如何修改上面的Makefile来创建这两个内核对象文件?

更新了@vinay hunachyal 的答案的其他部分。

我尝试了这个方法。在诊断出一些错误之后。现在我在内核编译结束时得到这个错误。

depmod: WARNING: /lib/modules/3.16.1/kernel/fs/dlm/dlm.ko needs unknown symbol sctp_do_peeloff
sh ./arch/x86/boot/install.sh 3.16.1 arch/x86/boot/bzImage \
    System.map "/boot"
depmod: WARNING: /lib/modules/3.16.1/kernel/fs/dlm/dlm.ko needs unknown symbol sctp_do_peeloff

【问题讨论】:

  • 正确更新问题..因为错误是在depmod期间而不是在模块编译时。所以把你尝试的一些步骤和错误日志。?

标签: linux-kernel makefile kernel kernel-module


【解决方案1】:

如果您在内核树源中构建,那么在 menuconfig 中,您需要选择 Module 来代替 YM

make menuconfig

在此之后转到

Networking support --->

这里去

Networking options --->

如果它的y 更改为m

{y} The SCTP Protocol ---> 将其更改为 {M} The SCTP Protocol --->

这将使sctp-y 能够构建为dynamic module 而不是静态的。

之后进入 SCTP 协议

<y> SCTP: Association probing change to The SCTP Protocol

这将使sctp_probe-y 能够构建为dynamic module 而不是静态的。

最后保存并退出现在你构建


ELSE关注

如果您在内核源代码树之外构建。

将 net/sctp/ 复制到外部内核源代码树。

例如 cp net/sctp /home/vinay/dd/。 -r

清理你的内核源代码树。

make clean

make dist clean

然后make menuconfig

make modules_prepare

在 /home/vinay/dd/sctp/

代替KERNELDIR:= give path of configured kernel source tree

例如,如果 /home/vinay/linux-x.x.x 中的内核源代码

KERNELDIR:=/home/vinay/linux-x.x.x

**NOTE TAB 应该在默认后退出并清除目标。

在 Makefile 的末尾添加以下行。

 KERNELDIR:=<path to configured kernel source tree >
 PWD:=$(shell pwd)

default:
 <tab> $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
 <tab> $(MAKE) -C $(KERNELDIR) M=$(PWD) clean

这使得构建变得简单


【讨论】:

  • 我已经在做第一步了。在第一次构建之后,我一次又一次地修改了几个 SCTP 文件以包含我的功能。那么如果我想测试修改后的 SCTP 而不重新构建整个内核并且不重新启动该怎么办?
  • 你试过第二个吗?获取完整的代码并构建它而不是编译整个内核,这里你只能编译 sctp。
  • 第二个我无法理解。 sctp 模块在没有依赖模块的情况下如何工作?
  • 我试过了,它对我有用..在退出 sctp 文件夹中的 makefile 中添加以下行并编译它,只要你试一试,如果有任何问题,请告诉我
  • 我尝试了第二部分并用它显示的新错误更新了我的问题。
【解决方案2】:

据我了解内核 makefile,这些文件不会被创建,因为您已明确要求内核 make 系统具有作为内核整体的一部分的功能。

如果您将 y 替换为 m,您将获得内核模块。

比如用sctp-m替换sctp-y等等。

【讨论】:

  • 在构建内核时,我选择了 sctp 作为M。所以默认情况下它是一个可加载的内核,对吗?它应该自己用m 替换ys 吗?
  • 我已经尝试替换它们。内核正在尝试构建内核对象文件,但出现以下错误。 make[1]: *** No rule to make target net/sctp/sctp_probe.c',需要net/sctp/sctp_probe.o'. Stop. make: *** [net/sctp/] Error 2
  • 我希望您所说的 sctp 是指 IP_SCTP。在 sctp 的 Kconfig 中添加以下内容: config IP_SCTP tristate "The SCTP Protocol (EXPERIMENTAL)" 依赖于 INET && EXPERIMENTAL 依赖于 IPV6 || IPV6=n depends on m 会强制编译为模块
  • 没有。 SCTP 是从 2.6 内核开始的独立模块。 (实验性)。
  • 当然,但我不是在谈论模块的名称。我说的是配置选项。我这里有一个 2.6.34 和 net/sctp 的 Kconfig 文件提到:menuconfig IP_SCTP tristate "The SCTP Protocol (EXPERIMENTAL)" 所以用编辑器检查你的 .config 文件,以确保 IP_SCTP 被构建为一个模块。像这样:# CONFIG_IP_DCCP is not set [\n] CONFIG_IP_SCTP=m [\n] # CONFIG_SCTP_DBG_MSG is not set [\n] [\n] 仅用于划分换行符,因为它似乎不允许在 cmets 中使用换行符
【解决方案3】:

我很确定你的宏 CONFIG_IP_SCTP 和 CONFIG_NET_SCTPPROBE 没有“m”值,它们被设置为“y”。 您可以在最终的 .config 文件中验证这些宏值。 这些宏应该定义如下

    CONFIG_NET_SCTPPROBE=m
    CONFIG_IP_SCTP=m

感谢

【讨论】:

  • 所有设置为m 仅关于.config 中的SCTP,除了这个。 CONFIG_IP_VS_PROTO_SCTP=y。我认为我们不需要将其设置为m
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多