编译32位_玩转Android10源码开发定制(11)内核篇之安卓内核模块开发编译
一、 開(kāi)發(fā)前期準(zhǔn)備
本文中使用的是linageOs源碼中下載的oneplus3 安卓10內(nèi)核源碼進(jìn)行研究測(cè)試。交叉編譯鏈?zhǔn)褂玫氖莑inageOs源碼中的交叉編譯鏈。
lineageOs源碼中oneplus3內(nèi)核源碼位置路徑:
/home/qiang/lineageOs/kernel/oneplus/msm8996lineageOs源碼中交叉編譯目錄位置路徑:
/home/qiang/lineageOs/prebuilts/gcc/linux-x86為了方便研究測(cè)試,不破壞lineageOs中的內(nèi)核源碼結(jié)構(gòu)。我新建一個(gè)目錄專門存放內(nèi)核源碼、內(nèi)核模塊源碼。并將內(nèi)核源碼拷貝到該目錄。
本文后續(xù)測(cè)試的內(nèi)核源碼目錄路徑:
?home/qiang/myproject/kernel/oneplus3/msm8996本文后續(xù)內(nèi)核模塊編寫存放目錄路徑:
/home/qiang/myproject/kernel/oneplus3/modules二、編譯內(nèi)核源碼
安卓源碼中device/廠商/手機(jī)型號(hào)/BoardConfig.mk文件中配置了內(nèi)核源碼路徑和編譯配置文件。因此在device/oneplus/oneplus3/BoardConfig.mk中存放了相關(guān)的內(nèi)核配置信息,如下所示:
BOARD_KERNEL_BASE?:=?0x80000000BOARD_KERNEL_PAGESIZE?:=?4096
BOARD_KERNEL_TAGS_OFFSET?:=?0x02000000
BOARD_RAMDISK_OFFSET?????:=?0x02200000
BOARD_KERNEL_IMAGE_NAME?:=?Image.gz-dtb
TARGET_KERNEL_SOURCE?:=?kernel/oneplus/msm8996
TARGET_KERNEL_CONFIG?:=?lineageos_oneplus3_defconfig
以上TARGET_KERNEL_CONFIG變量指定了oneplus3內(nèi)核的編譯配置文件名為:lineageos_oneplus3_defconfig。
在內(nèi)核源碼中編譯配置文件一般存放在路徑arch/處理器平臺(tái)/configs下面。由于一加3手機(jī)為arm64,所以在路徑arch/arm64/configs下找到配置文件lineageos_oneplus3_defconfig。如下所示:
qiang@ubuntu:~/myproject/kernel/oneplus3/msm8996/arch/arm64/configs$?pwd/home/qiang/myproject/kernel/oneplus3/msm8996/arch/arm64/configs
qiang@ubuntu:~/myproject/kernel/oneplus3/msm8996/arch/arm64/configs$?ls?-la?lineageos_oneplus3_defconfig
-rw-rw-r--?1?qiang?qiang?15001?1月???3?23:00?lineageos_oneplus3_defconfig
由于編譯內(nèi)核模塊的時(shí)候需要依賴于已經(jīng)編譯過(guò)的內(nèi)核輸出,并且內(nèi)核需要配置為可加載才能正常編譯內(nèi)核模塊。所以需要修改一下arch/arm64/configs/lineageos_oneplus3_defconfig,添加如下配置項(xiàng)。
#?開(kāi)啟內(nèi)核模塊可加載CONFIG_MODULES=y
#?開(kāi)啟內(nèi)核模塊可卸載
CONFIG_MODULE_UNLOAD=y
腳本如下
#?設(shè)置編譯平臺(tái)為64位armexport?ARCH=arm64
export?SUBARCH=arm64
#?配置arm64的交叉編譯路徑
export?PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
#?配置32位arm的交叉編譯路徑
#?測(cè)試過(guò)程中32位的不設(shè)置居然編譯不過(guò)
export?PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:$PATH
#?設(shè)置64位交叉編譯工具前綴
#?這個(gè)前綴其實(shí)就是交叉編譯鏈路徑/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin?下面的工具的公共前綴
export?CROSS_COMPILE=aarch64-linux-android-
#?設(shè)置32位交叉編譯工具前綴
#?這個(gè)前綴其實(shí)就是交叉編譯鏈路徑/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin?下面的工具的公共前綴
export?CROSS_COMPILE_ARM32=arm-linux-androideabi-
#?通過(guò)make命令生成編譯配置文件.config
#?O=out指定輸出目錄??lineageos_oneplus3_defconfig:這個(gè)是oneplus3的內(nèi)核編譯配置
make??O=out?lineageos_oneplus3_defconfig
#??執(zhí)行內(nèi)核編譯
make?-j2?O=out?ARCH=arm64
以上腳本在終端難的一個(gè)一個(gè)的輸入,我將上面的弄成一個(gè)make.sh文件,到時(shí)候直接執(zhí)行。make.sh內(nèi)容如下:
#!/bin/bash#?切換到內(nèi)核源碼根目錄去?
cd?./msm8996
make?mrproper
make?clean
export?ARCH=arm64
export?SUBARCH=arm64
export?PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
export?PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:$PATH
export?CROSS_COMPILE=aarch64-linux-android-
export?CROSS_COMPILE_ARM32=arm-linux-androideabi-
make?-j2?O=out?lineageos_oneplus3_defconfig
make?-j2??O=out?ARCH=arm64
在終端執(zhí)行make.sh之后就可以看到編譯內(nèi)核了,如下所示:
qiang@ubuntu:~/myproject/kernel/oneplus3$?./make.sh?make[1]:?Entering?directory?'/home/qiang/myproject/kernel/oneplus3/msm8996/out'
??GEN?????./Makefile
??HOSTCC??scripts/basic/fixdep
??HOSTCC??scripts/kconfig/conf.o
??HOSTCC??scripts/kconfig/zconf.tab.o
??HOSTLD??scripts/kconfig/conf
編譯完成之后,可以在目錄/home/qiang/myproject/kernel/oneplus3/msm8996/out下面找到編譯產(chǎn)生的文件和內(nèi)核鏡像。
三、編寫helloworld模塊
此處編寫一個(gè)簡(jiǎn)單的HelloWorld模塊進(jìn)行研究測(cè)試。
文件代碼如下:
#include?#include?
#include?
static?int?__init?hello_init(void){
???printk(KERN_ALERT?"Hello?World!\n");
???return?0;
}
static?void?__exit?hello_exit(void){
???printk(KERN_ALERT?"See?You,Hello?World!\n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile如下:
#?設(shè)置內(nèi)核源碼編譯的輸出目錄KERNEL_OUT=/home/qiang/myproject/kernel/oneplus3/msm8996/out
#?設(shè)置arm64交叉編譯鏈工具路徑
TOOLCHAIN=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
#?設(shè)置arm32交叉編譯鏈工具路徑
TOOLCHAIN32=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-
#?設(shè)置模塊
obj-m?:=?helloworld.o
#?編譯命令配置?
all:
?make?ARCH=arm64?CROSS_COMPILE_ARM32=$(TOOLCHAIN32)??CROSS_COMPILE=$(TOOLCHAIN)?-C?$(KERNEL_OUT)?M=$(shell?pwd)??modules
#?清理編譯命令
clean:
?make?-C?$(KERNEL_OUT)?M=$(shell?pwd)?clean
編譯如下:
qiang@ubuntu:~/myproject/kernel/oneplus3/modules/helloworldmodule$?pwd/home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule
qiang@ubuntu:~/myproject/kernel/oneplus3/modules/helloworldmodule$?ls?-la
total?16
drwxrwxr-x?2?qiang?qiang?4096?1月???5?21:18?.
drwxrwxr-x?6?qiang?qiang?4096?1月???5?21:17?..
-rw-rw-r--?1?qiang?qiang??310?1月???5?21:06?helloworld.c
-rw-rw-r--?1?qiang?qiang??498?1月???5?21:08?Makefile
qiang@ubuntu:~/myproject/kernel/oneplus3/modules/helloworldmodule$?make
make?ARCH=arm64?CROSS_COMPILE_ARM32=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-??CROSS_COMPILE=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-?-C?/home/qiang/myproject/kernel/oneplus3/msm8996/out?M=/home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule??modules
make[1]:?Entering?directory?'/home/qiang/myproject/kernel/oneplus3/msm8996/out'
??CC?[M]??/home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule/helloworld.o
??Building?modules,?stage?2.
??MODPOST?1?modules
??CC??????/home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule/helloworld.mod.o
??LD?[M]??/home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule/helloworld.ko
make[1]:?Leaving?directory?'/home/qiang/myproject/kernel/oneplus3/msm8996/out'
模塊編譯好之后就可以 adb push到手機(jī),使用insmod加載模塊進(jìn)行測(cè)試驗(yàn)證了。以后就可以通過(guò)寫內(nèi)核系統(tǒng)hook模塊進(jìn)行系統(tǒng)調(diào)用內(nèi)核層攔截、寫netfileter hook模塊進(jìn)行網(wǎng)絡(luò)管控等等操作。
專注安卓系統(tǒng)、安卓ndk開(kāi)發(fā)、安卓應(yīng)用安全和逆向分析相關(guān)知識(shí)分享,系統(tǒng)定制、frida、xposed(sandhook、edxposed)系統(tǒng)集成、加固、脫殼等等。關(guān)注公眾號(hào)第一時(shí)間接收更新文章。
總結(jié)
以上是生活随笔為你收集整理的编译32位_玩转Android10源码开发定制(11)内核篇之安卓内核模块开发编译的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一场横跨大西洋的实验,开创通讯方式新纪元
- 下一篇: 中芯国际股票在a股上市了吗