有一次不小心把我的乐1pro(x800+)掉地上了,屏幕碎的很惨。现在乐视都倒了,这机器的配置也跟不上了,不值得换屏,但电容屏碎了也能操作,就像废物利用,做个下载器。但下载到手机再转存到nas上太麻烦了,就想到cifs挂载nas。下载了一个带root的rom刷机后,adb shell进入系统shell,执行cat  /proc/filesystems查看支持的文件系统,没有发现cifs,说明内核没有支持cifs.查看内核支持模块,决定自己编译一个cifs模块增加这个功能.从此开始了以下的踩坑之旅.

1.通过uname -a 查内核版本,尽量保证内核版本接近,这样出问题的可能性会比较小.

查出的内核版本是Linux localhost 3.10.84-perf-g9fc36aa #1 SMP PREEMPT Wed Oct 19 18:52:46 CST 2016 aarch64

访问https://github.com/ 搜索android kernel le msm8994    (msm8994是高通骁龙810的编号) 会找到几个项目

https://github.com/Silentlys/android_kernel_letv_msm8994的内核版本和我使用的相同,所以就使用这个了。

git clone https://github.com/Silentlys/android_kernel_letv_msm8994.git

下载编译器

git clone https://aosp.tuna.tsinghua.edu.cn/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/

这里使用了清华的开源镜像站代替google的,因为众所周知的原因,使用https://android.googlesource.com不能下载。

export PATH=$PATH:/root/Android/aarch64-linux-android-4.9/bin
export ARCH=arm64
export SUBARCH=arm64
export ANDROID_AARCH64=/root/Android/aarch64-linux-android-4.9/bin
export CROSS_COMPILE=aarch64-linux-android-

cd android_kernel_letv_msm8994

mkdir output

make O=output msm8994_defconfig

make O=output menuconfig

选上cifs相关模块 nls_utf8模块

cd output/
LANG=c make O=output DTC_EXT=dtc -j6

取手机中的./adb pull /proc/config.gz

编译时出现error, 提示complit7.h 没有

参考https://blog.csdn.net/u014418171/article/details/82659887

下载https://bitbucket.org/jonascardoso/toolchain_aarch64_travis/downloads/

https://bitbucket.org/jonascardoso/toolchain_aarch64_travis/get/517026371d60.zip

gcc编译器

https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/

都出现问题

查看编译linux内核所用的gcc版本

手机上 cat /proc/version

Linux version 3.10.84-perf-g9fc36aa (letv@pcnbj-cp033) (gcc version 4.9.x-google 20140827 (prerelease) (GCC) ) #1 SMP PREEMPT Wed Oct 19 18:52:46 CST 2016

翻墙google查gcc version 4.9.x-google 20140827 (prerelease) (GCC) 找到android.googlesource.com下git日志

更新git

git log|grep 4b341df71296

git branch
git checkout master
git branch
git log|grep 4b341df71296
git branch lex800gcc 4b341df712969ca2ac0c3cf6294260d406b9d9be
gic checkout lex800gcc
git branch
bin/aarch64-linux-android-gcc --version
LANG=c make O=aoutput DTC_EXT=dtc -j6
编译成功

下载模块到手机

./adb push cifs.ko /sdcard/cifs.ko
./adb push nls_utf8.ko /sdcard/nls_utf8.ko
./adb shell
su

dmesg -c

insmod cifs.ko

insmod: failed to load cifs.ko: Exec format error

dmesg -c

disagrees about version of symbol module_layout

linux内核模块验证错误问题。

经过多天的查找,找到https://blog.csdn.net/mr_pang_1991/article/details/50014211,参考此大神的博客

终于编译成功。

记录如下

创建一个模块firststep.c

内容

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

const struct kernel_symbol *(*find_symbol1)(const char *name, struct module **owner, const unsigned long **crc, bool gplok, bool warn) = (const struct kernel_symbol *(*)(const char *name, struct module **owner, const unsigned long **crc, bool gplok, bool warn))0xffffffc000281554; //0xffffffc00027cab4; 通过手机/proc/kallsyms导出的绝对地址,如果 地址全是0,可以echo 0 > /proc/sys/kernel/kptr_restrict  使用绝对地址是为了不进行crc的版本验证

int (*printk1)(const char *fmt, ...) = (int (*)(const char *fmt, ...))0xffffffc000bfeaac; //  0xffffffc000be3e94;

static const char *sym_array[] = {
"module_layout",
"request_key",
.....此处是cifs.mod.c和nls_utf8.mod.c中的____versions[]数组中的名列表
"register_nls",
"utf32_to_utf8",
"utf8_to_utf32",
};

int __init
find_symbol_init (void)
{
  const char *name;
  int index;
  const struct kernel_symbol *ksymbol;
  struct module *owner;
  const unsigned long *crc;
  bool gplok = true;
  bool warn = true;
  for (index = 0; index < ARRAY_SIZE (sym_array); index++)
    {
      name = sym_array[index];
      ksymbol = find_symbol1 (name, &owner, &crc, gplok, warn);
      if (ksymbol != NULL)
    printk1 (" %s", ksymbol->name);
      else
    printk1 ("<0>Failed to find symbol %s\n", name);
      if (crc != NULL)
    printk1 ("*crc : 0x%lx\n", *crc);
      else
    printk1 ("\n");
    }
  return 0;
}

void __exit
find_symbol_exit (void)
{
}

module_init (find_symbol_init);
module_exit (find_symbol_exit);

MODULE_LICENSE ("GPL");
MODULE_AUTHOR("SongTao");

创建Makefile文件

ifneq ($(KERNELRELEASE),)

MODULE_NAME = firststep
#    $(MODULE_NAME)-objs := firststep.o
    obj-m := $(MODULE_NAME).o

else

KERNELDIR ?= /root/Android/le3_10_84/android_kernel_letv_msm8994/aoutput  //内核编译输出路径
    PWD ?= $(shell pwd)

.PHONY: modules clean

modules:
    $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modules
clean:
    rm -f *.o *.mod.c .*.*.cmd *.ko *.order *.symvers
    rm -rf .tmp_versions

endif

修改内核目录下scripts/Makefile.modpost文件,在$(modules:.ko=.mod.o): %.mod.o: %.mod.c FORCE规则下的$(call if_changed_dep,cc_o_c)上面和下面都增加$(shell sleep 30),为了有足够的时间修改编译时生成的mod.c文件的内容

从手机中取一个ko文件,使用modprobe --show-modversions ufsd.ko查出手机正在使用的module_layout的crc值

0x2e7c00e9      module_layout 记录下来

LANG=c make

当生成firststep.mod.c时,立刻打开文件,修改文件中的module_layout对应的值为记录的。

编译完成后,下载到手机,加载模块后

执行dmesg可以看到需要的模块crc值。复制出来备用。

将这些值整理完成,重新编译cifs等模块前,删除对应的.mod.c文件,执行编译,.mod.c生成后,立刻修改文件中的值,编译完成下载到手机就可以insmod成功了。

insmod /sdcard/cifs.ko

ps #cifsiod
mount -t cifs -o username=guest,password=,iocharset=utf8 //IP地址/public /mnt/cifs

/mnt/cifs是手动创建的
mount -o bind /system/test/ /storage/sdcad0/111
chgrp sdcard_rw /storage/sdcad0/111

insmod /sdcard/cifs.ko
insmod /sdcard/nls_utf8.ko

ls -l /proc/1/ns

lrwxrwxrwx root     root              2019-12-18 23:38 mnt -> mnt:[4026531840]
lrwxrwxrwx root     root              2019-12-18 23:38 net -> net:[4026535318]

Usage: nsenter [OPTIONS] [PROG [ARGS]]

-t PID          Target process to get namespaces from
        -m[FILE]        Enter mount namespace
        -u[FILE]        Enter UTS namespace (hostname etc)
        -i[FILE]        Enter System V IPC namespace
        -n[FILE]        Enter network namespace
        -p[FILE]        Enter pid namespace
        -U[FILE]        Enter user namespace
        -S UID          Set uid in entered namespace
        -G GID          Set gid in entered namespace
        --preserve-credentials  Don't touch uids or gids
        -r[DIR]         Set root directory
        -w[DIR]         Set working directory
        -F              Don't fork before exec'ing PROG

//nsenter -t 1 -m 4026531840 -n 4026535318

nsenter -t 1

mount -t cifs -o username=guest,password=,iocharset=utf8 //IP地址/public /sdcard/BdNetdisk

没有android手机确切内核头文件,绕过模块的版本检查,构建一个内核模块相关推荐

  1. linux 内核头文件 linux kernel header

    1.内核头文件的发展历史         在 Linux 2.2/2.4 的纯真年代,内核头文件一直保持着 Unix 世界的"KISS"传统,只需将内核源码树中的头文件直接复制到 ...

  2. 【驱动】ubuntu安装内核头文件

    1.检查是否已经安装 使用dpkg-query命令检查是否有可用的内核头文件. $ dpkg-query -s linux-headers-$(uname -r) 如果输出显示install ok i ...

  3. 用户空间使用内核头文件

    在用户空间使用内核头文件(或模块)有两种方法: 1. 将内核头文件和相应模块移植到移植到用户层,在用户空间重新编译使用. 2. 在编译时使用-I/lib/modules/$(uname -r)/bui ...

  4. linux默认头文件,Linux安装合适内核头文件的方法

    摘要 腾兴网为您分享:Linux安装合适内核头文件的方法,桌面时钟,中建在线,圆通金刚,西餐菜谱等软件知识,以及万象,我不信表情包,兔子洞,服你网,电商直播app,网络工具箱,ffu文件,电脑功率计算 ...

  5. 如何下载linux内核头文件,在Linux系统上安装Linux内核头文件的教程

    当你在编译一个设备驱动模块时,你需要在系统中安装内核头文件.内核头文件同样在你编译与内核直接链接的用户空间程序时需要.当你在这些情况下安装内核头文件时,你必须确保内核头文件精确地与你当前内核版本匹配( ...

  6. linux的头文件下载,Linux内核头文件(linux headers)

    更新 Linux 内核头文件(linux headers) 三 8th, 2013 2,474 views | 发表评论 | Trackback 一般来说,如果不是自己编译 kernel,那么更新头文 ...

  7. Mac 和 Android 手机之间互传文件,这四种方法简单高效!

    在Windows上,我们常常需要用USB数据线将安卓手机连接到电脑上,然后在手机和电脑之间传输各种文件.但是这种方法对Mac电脑就不怎么起作用了.由于OS X系统的特殊性,许多用户都不知道如何顺利地将 ...

  8. centos 安装内核头文件_centos 内核头文件的安装操作方法

    不少用户想要在CentOS上安装内核投文件,但是又不知道如何安装,这的确是个棘手的问题.但其实centos 内核头文件的安装方法是极其简单的,只是需要在安装之前先查看系统当前的内核版本,版本一样可直接 ...

  9. Kali Linux 内核头文件安装

    查看linux内核版本 执行命令:uname -r 显示内核版本:4.6.0-kali1-amd64 查看linux是否已经安装内核头文件 执行命令:apt-cache search linux-he ...

最新文章

  1. 如何将数据库文件.mdf导入/恢复到SQL_Server2000
  2. ESFramework介绍之(16)―― Tcp数据自动发送器ITcpAutoSender
  3. 如何格式化电脑_移动硬盘提示格式化如何解决?数据恢复软件解决问题
  4. 分享一下最近看的东西
  5. 【Rayeager PX2分享】OpenCV入门之图像显示
  6. 一个卡片式的ViewPager,带你玩转ViewPager的PageTransformer属性!
  7. 在MySQL中使用正则表达式
  8. SuperScan扫描器
  9. python win32api键盘_python基于win32api实现键盘输入
  10. 数据库索引与视图实验
  11. android,解决手动创建的桌面快捷方式无法跳转到制定的activity的问题,提示未安装应用程序
  12. 自定义关机计算机,win7自定义定时关机设置方法是什么
  13. 全球及中国吊链总成行业研究及十四五规划分析报告
  14. mvvm与virtual dom算法的实践——“hoz”
  15. 绘制几何图形,生成辅助线的思路
  16. 计算机的基本配件图片,计算机硬件的重要部件
  17. AutoJs学习-2048全自动
  18. oracle关于索引
  19. 数据库不能不了解的知识点(上)
  20. 三家企业“支招”,数据安全防护指南来了!

热门文章

  1. 关闭oracle job定时任务,oracle job 定时任务,定时执行
  2. QEMU中的内存API(2)
  3. php钓鱼怎么使用方法,盘钩使用方法
  4. 超详细编写登录注册页面(内含验证码登录)
  5. win11开机后输入法无法使用
  6. 微信小程序获取微信绑定授权手机号
  7. 银行信用卡客户价值分析(Python数据分析)
  8. 常见软件项目开发模式思考
  9. Android 从零开始实现微信支付
  10. ms office excel2013教程 - 套用表格样式