kernel 增加自定义宏编译开关

在MAKEFILE适当位置增加如下定义:

LINUXINCLUDE    := \
-I$(srctree)/arch/$(hdr-arch)/include \
-Iarch/$(hdr-arch)/include/generated \
$(if $(KBUILD_SRC), -I$(srctree)/include) \
-Iinclude \
$(USERINCLUDE)


KBUILD_CPPFLAGS := -D__KERNEL__


KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
  -fno-strict-aliasing -fno-common \
  -Werror-implicit-function-declaration \
  -Wno-format-security \
  -fno-delete-null-pointer-checks \
  -Werror=format -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast


KBUILD_AFLAGS_KERNEL :=
KBUILD_CFLAGS_KERNEL :=
KBUILD_AFLAGS   := -D__ASSEMBLY__
KBUILD_AFLAGS_MODULE  := -DMODULE
KBUILD_CFLAGS_MODULE  := -DMODULE
KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds



###########333
#zheng add macro define
include $(srctree)/vendor_define_gen.mk


KBUILD_CFLAGS += $(KERNEL_CDEFS)
KBUILD_CPPFLAGS += $(KERNEL_CDEFS)
$(error ++++++kingberry custom defines: $(KERNEL_CDEFS)) 
#kingberry.end




# Read KERNELRELEASE from include/config/kernel.release (if it exists)
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)


export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
export CPP AR NM STRIP OBJCOPY OBJDUMP
export MAKE AWK GENKSYMS INSTALLKERNEL PERL UTS_MACHINE
export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS



vendor_define_gen.mk这个文件定义如下:



MY_PROJECT := $(subst full_,,$(TARGET_PRODUCT))




include $(srctree)/../device/eastaeon/$(MY_PROJECT)/vendor/vendor_config.mk
-include $(srctree)/../device/eastaeon/$(MY_PROJECT)/vendor/vendor_config_$(XXXXXXXX_VENDOR).mk
include $(srctree)/../device/eastaeon/$(MY_PROJECT)/ProjectConfig.mk
include $(srctree)/../build/core/my_add_mtk_macro_def.mk


KERNEL_CDEFS=$(call mtk.custom.generate-macros)
#$(info *******************test zheng ************************** )
#$(error $(KERNEL_CDEFS) )



/

lk中增加宏定义:

# When the host arch is ARM, ensure stack protection code is not emitted since
# it's not supported by the bootloader's libc
ifneq ($(shell uname -m | grep "arm.*"),)
  CFLAGS += -fno-stack-protector
endif
CPPFLAGS := -fno-exceptions -fno-rtti -fno-threadsafe-statics
#CPPFLAGS += -Weffc++
ASMFLAGS := -DASSEMBLY
LDFLAGS :=


CFLAGS += -ffunction-sections -fdata-sections
LDFLAGS += -gc-sections


#xxxxxx.zheng add for COMDEF
include make/vendor_define_gen.mk
#kingberry.end


# top level rule
all:: $(OUTBIN) $(OUTELF).lst $(OUTELF).debug.lst $(OUTELF).sym $(OUTELF).size APPSBOOTHEADER


# the following three object lists are identical except for the ordering
# which is bootobjs, kobjs, objs
BOOTOBJS :=
OBJS :=


# a linker script needs to be declared in one of the project/target/platform files
LINKER_SCRIPT :=


# anything you add here will be deleted in make clean
GENERATED := $(CONFIGHEADER)


对应make下文件:

MY_PROJECT := $(subst full_,,$(TARGET_PRODUCT))




include $(srctree)/../device/eastaeon/$(MY_PROJECT)/vendor/vendor_config.mk
-include $(srctree)/../device/eastaeon/$(MY_PROJECT)/vendor/vendor_config_$(XXXXXX_VENDOR).mk
include $(srctree)/../device/eastaeon/$(MY_PROJECT)/ProjectConfig.mk
include $(srctree)/../build/core/my_add_mtk_macro_def.mk


MTK_CDEFS    += $(call mtk.custom.generate-macros)
#$(error ******************* XXXXX.zheng ************************** )
#$(error $(MTK_CDEFS) )


CPPFLAGS     += 
CFLAGS       += $(MTK_CDEFS)
ASMFLAGS     += $(MTK_CDEFS)




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux系统中,内核(kernel)是操作系统的核心组件,它负责管理系统的硬件资源和提供各种系统服务。内核模块(kernel module)是一种可动态加载和卸载的程序,可以在运行中向内核添加新的功能或修改现有功能。 交叉编译(cross compilation)是指在一台计算机上编译生成另一种体系结构(如ARM)下的可执行文件。由于内核模块需要与内核紧密配合,因此需要使用与目标平台相同的工具链进行交叉编译。 以下是在Linux系统中交叉编译内核模块的基本步骤: 1. 安装交叉编译工具链 根据目标平台的体系结构,安装相应的交叉编译工具链。例如,在Ubuntu系统中,可以使用以下命令安装arm-linux-gnueabi交叉编译工具链: ``` sudo apt-get install gcc-arm-linux-gnueabi ``` 2. 配置交叉编译环境 在编译内核模块之前,需要设置交叉编译环境变量。例如,要编译ARM架构的内核模块,可以使用以下命令设置环境变量: ``` export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- ``` 其中,ARCH指定目标平台的体系结构,CROSS_COMPILE指定交叉编译工具链的前缀。 3. 编写内核模块代码 根据需要,编写内核模块的代码。内核模块代码通常包括init函数和exit函数,分别在模块加载和卸载时执行。 4. 编译内核模块 使用交叉编译工具链编译内核模块。例如,下面的命令编译名为hello的内核模块: ``` make -C /path/to/kernel/source M=$PWD modules ``` 其中,-C选项指定内核源代码的路径,M选项指定内核模块所在的目录。 5. 加载内核模块 将编译生成的内核模块(.ko文件)复制到目标平台上,使用insmod命令加载模块: ``` insmod hello.ko ``` 6. 卸载内核模块 使用rmmod命令卸载内核模块: ``` rmmod hello ``` 以上就是在Linux系统中交叉编译内核模块的基本步骤。在实际应用中,还需要考虑内核版本、编译选项等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值