Makefile:LKM源代码变量不起作用

时间:2017-09-15 13:47:36

标签: makefile kernel-module

当我偶然发现这个奇怪的问题时,我试图编译一个可加载的内核模块:

QList<CascadeJobInfo> m_InternJobInfoList;
foreach (CascadeJobInfo jobInfo, m_InternJobInfoList)
{

    m_InternJobInfoList.removeOne(jobInfo);
}

此代码可以正常工作。但是当我使用上面注释的单行obj-m := $(ROOTKIT).o # $(ROOTKIT)-y += $(CORE_OBJS) $(SRCS_OBJS) $(LIBS_OBJS) $(INCL_OBJS) $(ROOTKIT)-y += src/core.o src/libs/syscalltable.o src/network_keylog.o src/server.o $(ROOTKIT)-y += src/module_hiding.o src/getdents_hook.o src/socket_hiding.o src/packet_hiding.o $(ROOTKIT)-y += src/port_knocking.o src/privilege_escalation.o src/include/utils.o ccflags-y := -I$(SRCS_H) -I$(LIBS_H) -I$(INCL_H) 而不是三行时,它只编译$(ROOTKIT)-y,它只是一个文件。我得到的输出是其他文件中定义的所有函数都是未定义的。

为什么会这样,即使$(CORE_OBJS)说这些变量的内容与写出每个文件名完全相同?有没有办法在变量中列出目标文件,或者我是否必须在每次添加文件时手动键入所有这些文件?

echo变量的输出:

$(XXXX_OBJS)

编辑:要查看完整的Makefile:

src/core.o
src/network_keylog.o src/packet_hiding.o src/module_hiding.o src/getdents_hook.o src/port_knocking.o src/server.o src/socket_hiding.o src/privilege_escalation.o
src/libs/syscalltable.o
src/include/utils.o

1 个答案:

答案 0 :(得分:0)

你似乎在滥用substitution references

SRCS := foo.c
OBJS_1 := $(SRCS:.c=.o)    # evaluates to 'foo.o'
OBJS_2 := $($(SRCS):.c=.o) # evaluates to nothing

OBJS_1的转让是替代参考的工作原理;对OBJS_2的赋值只是一个语法错误,它扩展为$(foo.c:.c=.o)然后再扩展为''(因为没有该名称的变量)。所以你的作业就像这样:

LIBS_OBJS   := $($(wildcard $(LIBS_S)/*.c):.c=.o)

导致空变量。我不知道你是如何得到“$(XXXX_OBJS)变量的输出”(因为你的makefile中没有实际显示它们),但实际上只有{ {1}}包含任何内容,而这一切都会进入CORE_OBJS

要修复它,只需放弃替换引用并使用patsubst

$(ROOTKIT)-y

编辑:好吧,让我们从小处开始积累。

第1步:尝试以下makefile,并告诉我们结果(在评论中):

LIBS_OBJS   := $(patsubst %.c, %.o, $(wildcard $(LIBS_S)/*.c))

(如果输出无法管理,您可以尝试使用包含SRCS_S := src SRCS_OBJS := $(patsubst %.c, %.o, $(wildcard $(SRCS_S)/*.c)) SRC_LIST += $(SRCS_OBJS) $(info $(SRC_LIST)) foo.c的源目录