热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

修改boot.img文件的工具,mkbootfs,mkbootimg,unpackbootimg

转载#编译mkbootfs,mkbootimg,unpackbootimg#首先要得到android_system_core的源代码,从github.com上面下载得


转载
#编译mkbootfs,mkbootimg,unpackbootimg
#首先要得到android_system_core的源代码,从github.com上面下载得到
#其中要编译的三个文件分别位于CyanogenMod-android_system_core-***的目录里面的不同文件夹中。
下面的代码是经过我修改的:

http://pan.baidu.com/share/link?shareid=104897&uk=2265432600

CyanogenMod-...m-core-sn.zip

其中mkbootfs的源代码位于cpio文件夹中
mkbootimg和unpackbootimg位置mkbootimg文件夹中
#使用的工具是linux系统的gcc
PS:如果需要交叉编译,就需要下载我制作的交叉编译器
下面讲解一下编译的过程:
一 讲解编译mkbootfs文件
1.分析Android.mk(此文件位于cpio目录里面)
目录路径如下:
/home/username/CyangenMod-android_system_core-***(其中的*代表的是标识码)/cpio/Android.mk
使用gedit打开此文件,
得到的内容如下:
----------cut here-----------------------
# Copyright 2005 The Android Open Source Project

LOCAL_PATH:= $(call my-dir)    #得到本目录的位置
include $(CLEAR_VARS)         #其中这句表示声明编译的开始。

LOCAL_SRC_FILES := \           #源代码文件
 mkbootfs.c

LOCAL_MODULE := mkbootfs        #生成的文件名

include $(BUILD_HOST_EXECUTABLE)     #生成在本机使用的可执行文件

$(call dist-for-goals,droid,$(LOCAL_BUILT_MODULE))   #这句就不知道是什么意思了
--------------------------------------------------

2.制作自己使用的makefile
从上面的Android.mk文件中得到如下的信息:
编译用到的源代码文件是mkbootfs.c,生成的文件是一个可执行的文件,
没有加入编译参数,生成的文件在本机运行。
所以我制作的makefile如下所示:
----------------cut here------------------------
#makefile for arm-mkbootimg
#create by sn

 #arm-linux-androideabi- #这句是我在编译android版本的mkbootfs用到的。
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
EXEC = arm-mkbootfs
OBJ = mkbootfs.o
SRC = mkbootfs.c
$(EXEC):$(OBJ) ;$(CC) -o $&#64; $<
$(OBJ):$(SRC) ;$(CC) -fPIC -c -o $&#64; $<

clean:
 rm -f $(OBJ) $(EXEC)

-------------------------------------------

--------------------------------------------------
3.查看源代码中的头文件关链问题。
/*mkbootfs.c */中的头文件声明问题如下
------------------cut here-----------------
#include
#include
#include
#include

#include
#include
#include

#include
#include

#include
--------------------------------------------
为了能让编译通过&#xff0c;得修改最后一个头文件声明位置&#xff0c;修改为如下&#xff1a;
---------------
#include "android_filesystem_config.h"  
-------------------------------------
最后要做的是&#xff0c;把CyangenMod-android_system_core-**/include/private/android_filesystem_config.h文件复制到当前的目录即是CygenMod-android_system_core-**/cpio目录里面。
4.在终端里面使用make&#xff0c;来编译生成mkbootfs
5.如果需要交叉编译的&#xff0c;就把makefile中的
CROSS_COMPILE &#61;  #这句补充完整。

二 编译mkbootimg和unpackbootimg
1.分析mkbootimg文件夹中的Android.mk文件
-------------------cut here--------------
LOCAL_PATH:&#61; $(call my-dir)  #这句是声明当前的目录
include $(CLEAR_VARS)

LOCAL_SRC_FILES :&#61; mkbootimg.c       #要用到的源代码是mkbootimg.c
LOCAL_STATIC_LIBRARIES :&#61; libmincrypt   #此句声明要使用的静态库文件是libmincrypt.a

LOCAL_MODULE :&#61; mkbootimg

include $(BUILD_HOST_EXECUTABLE)    #上当的内容是编译mkbootimg的命令。

include $(CLEAR_VARS)             #从这里开始到是编译unpackbootimg的部分
LOCAL_MODULE_TAGS :&#61; eng
LOCAL_SRC_FILES :&#61; unpackbootimg.c
LOCAL_MODULE :&#61; unpackbootimg
include $(BUILD_HOST_EXECUTABLE)      #编译unpackbootimg的部分

include $(CLEAR_VARS)                   #下面的部分也是编译mkbootimg和unpackbootimg的&#xff0c;但是加载的库文件就多了一个libcutils.so。所以我主要要上面的部分为规则。
LOCAL_SRC_FILES :&#61; mkbootimg.c
LOCAL_STATIC_LIBRARIES :&#61; libmincrypt libcutils libc
LOCAL_MODULE :&#61; utility_mkbootimg
LOCAL_MODULE_STEM :&#61; mkbootimg
LOCAL_MODULE_CLASS :&#61; UTILITY_EXECUTABLES
LOCAL_UNSTRIPPED_PATH :&#61; $(PRODUCT_OUT)/symbols/utilities
LOCAL_MODULE_PATH :&#61; $(PRODUCT_OUT)/utilities
LOCAL_FORCE_STATIC_EXECUTABLE :&#61; true
LOCAL_MODULE_TAGS :&#61; eng
include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)
LOCAL_SRC_FILES :&#61; unpackbootimg.c
LOCAL_STATIC_LIBRARIES :&#61; libcutils libc
LOCAL_MODULE :&#61; utility_unpackbootimg
LOCAL_MODULE_TAGS :&#61; eng
LOCAL_MODULE_STEM :&#61; unpackbootimg
LOCAL_MODULE_CLASS :&#61; UTILITY_EXECUTABLES
LOCAL_UNSTRIPPED_PATH :&#61; $(PRODUCT_OUT)/symbols/utilities
LOCAL_MODULE_PATH :&#61; $(PRODUCT_OUT)/utilities
LOCAL_FORCE_STATIC_EXECUTABLE :&#61; true
include $(BUILD_EXECUTABLE)

$(call dist-for-goals,droid,$(LOCAL_BUILT_MODULE))
---------------------------------------
2.根据Android.mk文件得要的如下的内容&#xff0c;在编译的过程中都需要加载静态库libmincrypt.a文件。
找了一找系统目录&#xff0c;没有发现这个文件&#xff0c;再在/CyanogenMod-android_system_core-**/libmincrypt/Android.mk文件中得到了如下的信息&#xff1a;
--------------------cut here------------
# Copyright 2008 The Android Open Source Project
#
LOCAL_PATH :&#61; $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE :&#61; libmincrypt              
LOCAL_SRC_FILES :&#61; rsa.c sha.c
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE :&#61; libmincrypt          #还有这句LOCAL_MODULE :&#61; libmincrypt
LOCAL_SRC_FILES :&#61; rsa.c sha.c
include $(BUILD_HOST_STATIC_LIBRARY)       #生成主机使用的静态库#include $(BUILD_HOST_STATIC_LIBRARY)


# TODO: drop the hyphen once these are checked in
include $(LOCAL_PATH)/tools/Android.mk

----------------------------------------------
为了编译这个mkbootimg和unpackbootimg&#xff0c;首先要编译得到libmincrypt.a
2.1以下的内容是编译libmincrypt.a的过程&#xff1a;
  从刚刚的libmincrypt/Android.mk可以得到如下的信息&#xff1a;
需要的源代码文件是&#xff1a;rsa.c sha.c
分析rsa.c和sha.c的源代码&#xff0c;得到了共同的头文件声明如下&#xff1a;
------------------cut here---------------
/*rsa.c or sha.c */
#include "mincrypt/rsa.h"
#include "mincrypt/sha.h"
-----------------------------
在文件的声明中&#xff0c;得知了&#xff0c;需要用到的头文件在/include/mincrypt/目录中
所以需要把/CyanogenMod-android_system_core-***/include/mincrypt/目录复制到当前的目录即是/libmincrypt
2.2制作自己的makefile文件
-------------------cut here---------------
#make file build for libmincrypt.a
#create by sn
CROSS_COMPILE &#61;  #arm-linux-androideabi-
CC &#61; $(CROSS_COMPILE)gcc
LD &#61; $(CROSS_COMPILE)ld
AR &#61; $(CROSS_COMPILE)ar
STATIC_LIB &#61; libmincrypt.a
OBJ &#61;rsa.o sha.o
$(STATIC_LIB):$(OBJ);$(AR) -r $(STATIC_LIB) $(OBJ)
rsa.o:rsa.c;$(CC) -c -o $&#64; $<

sha.o:sha.c;$(CC) -c -o $&#64; $<


clean:
 rm -f $(STATIC_LIB) $(OBJ)
----------------------------------------

根据文件关链&#xff0c;写的makefile如上所示。
在终端里面进入当前的目录/libmincrypt
再执行make,来编译生成libmincrypt.a 文件。
把编译得到的文件复制到/mkbootimg目录下面。以备用。
3.在第二步中已经得到了libmincrypt.a文件。
下面就开始制作makefile,并编译mkbootimg,unpackbootimg

-----------------------cut here---------------------
#make for build mkbootimg
#create by sn 2012-5-23 21:14:18
CROSS_COMPILE &#61;  #arm-linux-androideabi-
CC &#61; $(CROSS_COMPILE)gcc
LD &#61; $(CROSS_COMPILE)ld
LDCFLAGES &#61;
STATIC_LIB &#61; libmincrypt.a
#MKBOOTIMG_TARGET &#61; arm-mkbootimg
MKBOOTIMG_OBJ &#61; mkbootimg.o
MKBOOTIMG_SRC &#61; mkbootimg.c
#UNPACKBOOT_TARGET &#61; arm-unpackbootimg
UNPACKBOOTIMG_OBJ &#61; unpackbootimg.o
UNPACKBOOTIMG_SRC &#61; unpackbootimg.c
all:mkbootimg
mkbootimg:$(MKBOOTIMG_OBJ);$(CC) -o $&#64; $<$(STATIC_LIB)

$(MKBOOTIMG_OBJ):$(MKBOOTIMG_SRC);$(CC) -c $<
unpackboot:unpackbootimg
unpackbootimg:$(UNPACKBOOTIMG_OBJ);$(CC) -o $&#64; $<$(STATIC_LIB)
$(UNPACKBOOTIMG_OBJ):$(UNPACKBOOTIMG_SRC);$(CC) -c $<


clean:
 rm -f mkbootimg unpackbootimg $(MKBOOTIMG_OBJ)  $(UNPACKBOOTIMG_OBJ)
-------------------------------------------------
这个makefile主要是定义了编译的对象和编译的方法。
还有编译的规则。
在输入make all
编译的时候&#xff0c;得到的文件是mkbootimg
输入make unpackboot
编译得到unpackbootimg

二.在同一个文件夹中编译所有的文件(mkbootfs,mkbootimg,unpackbootimg)
我选择的工作目录是/mkbootimg
1。复制需要的文件
在../include目录中复制mincrypt目录到当前目录&#xff08;mkbootimg)
在../libmincrypt目录中复制sha.c rsa.c文件到当前目录
在../cpio目录中复制mkbootfs.c    #此文件在一中已经经过修改。
在../include/private目录中复制android_filesystem_config.h头文件到当前目录。
在复制完成后。当前目录的结构如下&#xff1a;
./mincrypt/sha.h
./mincrypt/rsa.h
./Android.mk
./android_filesystem_config.h
./bootimg.h
./mkbootfs.c
./mkbootimg.c
./unpackbootimg.c
./rsa.c
./sha.c
./unpackbootimg.c
./makefile # 此文件需要自己创建

2.制作自己的makefile
下面是我编写好的makefile
-----------------------------cut here----------------------------
#make for build mkbootimg
#create by sn 2012-5-23 21:14:18
CROSS_COMPILE &#61;  #arm-linux-androideabi-
CC &#61; $(CROSS_COMPILE)gcc
LD &#61; $(CROSS_COMPILE)ld
AR &#61; $(CROSS_COMPILE)ar
LDCFLAGES &#61;
STATIC_LIB &#61; libmincrypt.a
#MKBOOTIMG_TARGET &#61; arm-mkbootimg
MKBOOTIMG_OBJ &#61; mkbootimg.o
MKBOOTIMG_SRC &#61; mkbootimg.c
#UNPACKBOOT_TARGET &#61; arm-unpackbootimg
UNPACKBOOTIMG_OBJ &#61; unpackbootimg.o
UNPACKBOOTIMG_SRC &#61; unpackbootimg.c
LIBMINCRYPT_OBJ &#61; sha.o rsa.o
SHA_SRC &#61; sha.c
RSA_SRC &#61; rsa.c
MKBOOTFS_OBJ &#61; mkbootfs.o
MKBOOTFS_SRC &#61; mkbootfs.c
all:mkbootimg               #此处定义编译mkbootimg
mkbootimg:$(MKBOOTIMG_OBJ);$(CC) -o $&#64; $<$(STATIC_LIB)

$(MKBOOTIMG_OBJ):$(MKBOOTIMG_SRC);$(CC) -c $<

unpackboot:unpackbootimg              #此处定义编译unpackbootimg
unpackbootimg:$(UNPACKBOOTIMG_OBJ);$(CC) -o $&#64; $<$(STATIC_LIB)
$(UNPACKBOOTIMG_OBJ):$(UNPACKBOOTIMG_SRC);$(CC) -c $<

lib:libmincrypt.a                     #此处定义编译libmincrypt.a
libmincrypt.a:$(LIBMINCRYPT_OBJ);$(AR) -r $(STATIC_LIB) $(LIBMINCRYPT_OBJ)
sha.o:$(SHA_SRC);$(CC) -c -fPIC $<
rsa.o:$(RSA_SRC);$(CC) -c -fPIC $<

mkboot:mkbootfs                  #此处定义了编译mkbootfs
mkbootfs:$(MKBOOTFS_OBJ);$(CC) -o $&#64; $<
$(MKBOOTFS_OBJ):$(MKBOOTFS_SRC);$(CC) -c $<

clean:                    #此处定义了要清除的文件
 rm -f mkbootfs mkbootimg unpackbootimg $(MKBOOTIMG_OBJ)  $(UNPACKBOOTIMG_OBJ) $(LIBMINCRYPT_OBJ) $(STATIC_LIB) $(MKBOOTFS_OBJ)

-------------------------------------------------
3.编译
简单说一说编译的方法。
因为这个mkbootimg和unpackbootimg都依赖于libmincrypt.a&#xff0c;
所以在编译mkbootimg和unpackbootimg之前要先编译这个libmicrypt.a
方法如下 &#xff1a;
3.1
先执行make lib   #此条命令是生成libmincrypt.a
再执行make all #此条命令是生成mkbootimg
再执行make unpackboot #此条命令是生成unpackbootimg
再后执行的是make mkboot  #此条命令可以在最前执行&#xff0c;也可以在最后执行。因为这个mkbootfs没有依赖于libmincrypt.a
3.2
最后总结一下就是。
没有什么是不可能的。
只要肯努力就行了。

下面提供的是我已经编译好的工具&#xff1a;

http://pan.baidu.com/share/link?shareid&#61;104898&uk&#61;2265432600

make-mkboot-tools.rar

下面是编译后的图片&#xff1a;绿色表示生成的可执行文件。


 




推荐阅读
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 本文介绍了如何在ARM架构的裸机环境中通过C语言编程点亮LED灯。主要包括初始化栈指针、关闭看门狗以及编写控制LED灯状态的C代码等关键步骤。 ... [详细]
  • GCC(GNU Compiler Collection)是GNU项目下的一款功能全面且高效的多平台编译工具,广泛应用于Linux操作系统中。本文将详细介绍GCC的特点及其基本使用方法。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • 在Linux系统中,许多应用程序以源代码的形式提供,这给安装带来了挑战。本文旨在介绍一种简化源码软件安装流程的方法,帮助用户更加轻松地完成安装。 ... [详细]
  • 本文介绍了一种方法,通过使用Python的ctypes库来调用C++代码。具体实例为实现一个简单的加法器,并详细说明了从编写C++代码到编译及最终在Python中调用的全过程。 ... [详细]
  • 【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库
    【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库 ... [详细]
  • 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是 ... [详细]
  • 在 Ubuntu 22.04 LTS 上部署 Jira 敏捷项目管理工具
    Jira 敏捷项目管理工具专为软件开发团队设计,旨在以高效、有序的方式管理项目、问题和任务。该工具提供了灵活且可定制的工作流程,能够根据项目需求进行调整。本文将详细介绍如何在 Ubuntu 22.04 LTS 上安装和配置 Jira。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • AcetoneISO:Ubuntu Linux下的全能虚拟光驱工具
    AcetoneISO 是一款功能强大的虚拟光驱软件,适用于 Linux 和 Mac 系统。它支持多种映像文件格式的挂载和转换,并提供丰富的文件管理功能。 ... [详细]
  • IO流——字符流 BufferedReader / BufferedWriter 进行文件读写
    目录节点流、处理流读文件:BufferedReader的使用写文件:BufferedWriter的使用节点流处理流节点流和处理流的区别和联系字符流Buf ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中安装 Python 3.7 的步骤,包括编译工具的安装、Python 3.7 源码的下载与编译、软链接的创建以及常见错误的处理方法。 ... [详细]
  • Kubernetes 1.9.0 Alpha.1 发布公告 [Kubernetes 最新动态]
    近日,Kubernetes 社区发布了两个新版本:1.8.0 RC.1 和 1.9.0 Alpha.1。这是 k8s 1.9.0 的首次发布,自 v1.8.0 Alpha.3 以来进行了大量更新,共提交了 279 次。 ... [详细]
author-avatar
手机用户2502880645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有