编译32位_玩转Android10源码开发定制(11)内核篇之安卓内核模块开发编译
一、 開發前期準備
本文中使用的是linageOs源碼中下載的oneplus3 安卓10內核源碼進行研究測試。交叉編譯鏈使用的是linageOs源碼中的交叉編譯鏈。
lineageOs源碼中oneplus3內核源碼位置路徑:
/home/qiang/lineageOs/kernel/oneplus/msm8996lineageOs源碼中交叉編譯目錄位置路徑:
/home/qiang/lineageOs/prebuilts/gcc/linux-x86為了方便研究測試,不破壞lineageOs中的內核源碼結構。我新建一個目錄專門存放內核源碼、內核模塊源碼。并將內核源碼拷貝到該目錄。
本文后續測試的內核源碼目錄路徑:
?home/qiang/myproject/kernel/oneplus3/msm8996本文后續內核模塊編寫存放目錄路徑:
/home/qiang/myproject/kernel/oneplus3/modules二、編譯內核源碼
安卓源碼中device/廠商/手機型號/BoardConfig.mk文件中配置了內核源碼路徑和編譯配置文件。因此在device/oneplus/oneplus3/BoardConfig.mk中存放了相關的內核配置信息,如下所示:
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內核的編譯配置文件名為:lineageos_oneplus3_defconfig。
在內核源碼中編譯配置文件一般存放在路徑arch/處理器平臺/configs下面。由于一加3手機為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
由于編譯內核模塊的時候需要依賴于已經編譯過的內核輸出,并且內核需要配置為可加載才能正常編譯內核模塊。所以需要修改一下arch/arm64/configs/lineageos_oneplus3_defconfig,添加如下配置項。
#?開啟內核模塊可加載CONFIG_MODULES=y
#?開啟內核模塊可卸載
CONFIG_MODULE_UNLOAD=y
腳本如下
#?設置編譯平臺為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的交叉編譯路徑
#?測試過程中32位的不設置居然編譯不過
export?PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:$PATH
#?設置64位交叉編譯工具前綴
#?這個前綴其實就是交叉編譯鏈路徑/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin?下面的工具的公共前綴
export?CROSS_COMPILE=aarch64-linux-android-
#?設置32位交叉編譯工具前綴
#?這個前綴其實就是交叉編譯鏈路徑/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin?下面的工具的公共前綴
export?CROSS_COMPILE_ARM32=arm-linux-androideabi-
#?通過make命令生成編譯配置文件.config
#?O=out指定輸出目錄??lineageos_oneplus3_defconfig:這個是oneplus3的內核編譯配置
make??O=out?lineageos_oneplus3_defconfig
#??執行內核編譯
make?-j2?O=out?ARCH=arm64
以上腳本在終端難的一個一個的輸入,我將上面的弄成一個make.sh文件,到時候直接執行。make.sh內容如下:
#!/bin/bash#?切換到內核源碼根目錄去?
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
在終端執行make.sh之后就可以看到編譯內核了,如下所示:
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下面找到編譯產生的文件和內核鏡像。
三、編寫helloworld模塊
此處編寫一個簡單的HelloWorld模塊進行研究測試。
文件代碼如下:
#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如下:
#?設置內核源碼編譯的輸出目錄KERNEL_OUT=/home/qiang/myproject/kernel/oneplus3/msm8996/out
#?設置arm64交叉編譯鏈工具路徑
TOOLCHAIN=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
#?設置arm32交叉編譯鏈工具路徑
TOOLCHAIN32=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-
#?設置模塊
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到手機,使用insmod加載模塊進行測試驗證了。以后就可以通過寫內核系統hook模塊進行系統調用內核層攔截、寫netfileter hook模塊進行網絡管控等等操作。
專注安卓系統、安卓ndk開發、安卓應用安全和逆向分析相關知識分享,系統定制、frida、xposed(sandhook、edxposed)系統集成、加固、脫殼等等。關注公眾號第一時間接收更新文章。
總結
以上是生活随笔為你收集整理的编译32位_玩转Android10源码开发定制(11)内核篇之安卓内核模块开发编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一场横跨大西洋的实验,开创通讯方式新纪元
- 下一篇: 中芯国际股票在a股上市了吗