1. 为什么会有这个框架?

在只有工具链和内核头文件情况下,想单独编译app或者ko 用于测试。

2. 框架

1. 主Makefile

all:
    $(MAKE) -C ./modules_ko
    $(MAKE) -C ./modules_app
    
clean:
    $(MAKE) -C ./modules_ko clean
    $(MAKE) -C ./modules_app clean

2. app编译框架

Makefile

CURR_DIR := $(shell pwd)
CROSS_COMPILE := "the location of toolchain"
CC=$(CROSS_COMPILE)gcc
LD= $(CROSS_COMPILE)ld
STRIP=$(CROSS_COMPILE)strip
ARCH=arm
CFLAGS = -g -Wall
LDFLAGS = 
FILELIST = app_test.c

all: app_test

.PHONY : all clean app_test

app_test:
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(FILELIST)
    $(STRIP) $@    

clean:
    rm -f *.o app_test

测试文件

#include<stdio.h>

int main(void)
{
    printf("just for app compile test\n");
    return 0;
}

3. ko编译框架

Makefile

KERNELDIR=../linux-4.1  ## you should modify it
obj-m += ko_test.o

CROSS_COMPILE := "the location of toolchain"
ARCH=arm

# if you need include other heade file "-I path"
EXTRA_CFLAGS += 


all:
    $(MAKE) -C $(KERNELDIR) M=`pwd` ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE)  modules 

clean:
    $(MAKE) -C $(KERNELDIR) M=`pwd` ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) clean

测试文件

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

static int module_test_init(void)
{
    printk("************modules_test init***********\n");
    
    return 0;
}

static void module_test_exit(void)
{
    printk("************modules_test exit***********\n");
    
    return ;
}

module_init(module_test_init);
module_exit(module_test_exit);

MODULE_DESCRIPTION("modules_test");
MODULE_LICENSE("GPL");

{hide}

源码

app、ko编译源码
{/hide}

最后修改:2022 年 04 月 25 日
如果觉得我的文章对你有用,请随意赞赏