arm64交叉编译5.4.86内核kprobe模块insmod加载Exec format错误求解
错误原因分析
- DEFEX安全机制拦截:dmesg日志明确返回
defex: immutable write violation报错,三星设备内置的DEFEX(可执行文件动态防护)安全机制,对/vendor/lib/modules目录配置了不可执行、不可修改的强制保护规则,直接拦截了内核加载该路径下ko文件的访问请求,触发Exec format error错误。 - 内核源码与配置不匹配:你编译模块使用的是纯主线5.4.86内核源码,而目标设备使用的是高通QGKI定制版本5.4.86内核,两者的补丁、配置参数存在大量定制修改,虽然模块vermagic前缀与内核版本一致,但实际内核符号、校验规则存在差异,会导致模块格式校验失败。
- 路径权限限制:/vendor分区默认以只读方式挂载,自定义模块写入后也会被SELinux等安全规则限制加载权限。
解决方案
- 调整模块存放路径
将模块不要放在/vendor分区,转移到无DEFEX保护的/data/local/tmp目录下,执行以下命令测试加载:
mv /vendor/lib/modules/kprobe_module.ko /data/local/tmp/ chmod 755 /data/local/tmp/kprobe_module.ko insmod /data/local/tmp/kprobe_module.ko
如果仍有DEFEX拦截,可临时关闭DEFEX强制校验,执行setprop persist.defex.enforce 0后重启设备再尝试。
- 对齐内核编译配置
- 下载目标设备对应版本的官方开源内核源码,不要使用纯主线5.4.86源码编译。
- 从目标设备导出当前内核的配置文件,替换编译用内核的配置:
# 设备上执行 zcat /proc/config.gz > /sdcard/kernel_config
将导出的配置文件放到编译用的内核源码根目录,重命名为.config。
- 修改内核源码Makefile的
EXTRAVERSION参数,追加-qgki-22560472-userdebug-abG996USQU4ZUIH,保证编译出的模块vermagic与目标内核完全匹配。 - 确认内核配置中已开启必要选项:
CONFIG_KPROBES=y、CONFIG_MODULES=y、CONFIG_MODULE_UNLOAD=y。
- 临时关闭SELinux拦截
如果是userdebug版本设备,加载前执行setenforce 0关闭SELinux强制校验,避免额外拦截。
内容的提问来源于stack exchange,提问作者shiva mahanty
相关产品推荐
相关产品推荐

