目录

移植adb到iMX6开发板(arm)

说明

交叉编译与本地编译

编译器和目标程序都是相同架构的编译过程,被称为本地编译

编译器和目标程序运行在不同架构的编译过程,被称为交叉编译,如编译器运行在x86架构平台上,编译生成ARM架构的可执行程序

静态库与动态库

  1. 静态库的扩展名一般为“.a”或“.lib”;动态库的扩展名一般为“.so”或“.dll”。

  2. 静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行;动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行。

所使用的平台

使用飞凌资料里提供的linux4.1.15+qt的ubuntu 12虚拟机作为编译环境

目的是将adb工具移植到arm平台【飞凌嵌入式 搭载NXP i.MX6QuadOKMX6Q-S3开发板】

adb移植相关源码

adb移植有三个部分:交叉编译zlib,交叉编译openssl,交叉编译adb

android-tools源码使用study_record,里面包含了这两个库和adb的源码,我替换了其中的openssl,使用的是openssl-1.0.0s.tar.gz,1.0.0以其他字母结尾的应该也可以,不同字母对应不同小版本迭代,修复bug之类的

交叉编译zlib

解压进入zlib目录

tar zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11

执行飞凌提供的环境变量,主要是export了一些配置,如CC=,CPP=等等

. /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa9hf-neon-poky-linux-gnueabi

然后config会根据刚刚export的环境变量更换CC等参数,可以查看makefile确认,如果configure错误,可以查看configure.log文件,里面有详细错误信息

./configure --prefix=/home/workspace/build/zlib

编译

make
make install

完成后可以在/home/workspace/build/下找到zlib,在lib目录下可以看到.so文件,是动态库

交叉编译openssl

下载openssl-1.0.0s.tar.gz压缩包,放入虚拟机,解压,进入文件夹

tar zxvf openssl-1.0.0s.tar.gz
cd openssl-1.0.0s/

执行飞凌提供的环境变量

. /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa9hf-neon-poky-linux-gnueabi

配置

./Configure --prefix=/home/workspace/build/openssl os/compiler:arm-poky-linux-gnueabi-gcc

打开makefile,把里面的CC= $(CROSS_COMPILE)arm-poky-linux-gnueabi-gcc改成CC= $(CROSS_COMPILE)gcc,重复了

编译

make
make install

在/home/workspace/build/下可以找到openssl,config没有shared参数,出来的是静态库

交叉编译adb

进入/android-tools-4.2.2/core/adb下 打开makefile文件,注释掉CC字段,修改zlib openssl 头文件与库搜索路径,包括CPPFLAGS和LDFLAGS,对应交叉编译时对应的prefix字段

完整的makefile如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# Makefile for adb; from https://heiher.info/2227.html

# CC:=arm-oe-linux-gnueabi-gcc

VPATH+= ./
SRCS+= adb.c
SRCS+= adb_client.c
SRCS+= adb_auth_host.c
SRCS+= commandline.c
SRCS+= console.c
SRCS+= file_sync_client.c
SRCS+= fdevent.c
SRCS+= get_my_path_linux.c
SRCS+= services.c
SRCS+= sockets.c
SRCS+= transport.c
SRCS+= transport_local.c
SRCS+= transport_usb.c
SRCS+= usb_linux.c
SRCS+= usb_vendors.c
SRCS+= utils.c

VPATH+= ../libcutils
SRCS+= abort_socket.c
SRCS+= socket_inaddr_any_server.c
SRCS+= socket_local_client.c
SRCS+= socket_local_server.c
SRCS+= socket_loopback_client.c
SRCS+= socket_loopback_server.c
SRCS+= socket_network_client.c
SRCS+= list.c
SRCS+= load_file.c

VPATH+= ../libzipfile
SRCS+= centraldir.c
SRCS+= zipfile.c


CPPFLAGS+= -DADB_HOST=1
CPPFLAGS+= -DHAVE_FORKEXEC=1
CPPFLAGS+= -DHAVE_SYMLINKS
CPPFLAGS+= -DHAVE_TERMIO_H
CPPFLAGS+= -I./
CPPFLAGS+= -I../include
# zlib openssl 头文件与库搜索路径
CPPFLAGS+= -I/home/workspace/build/openssl/include
CPPFLAGS+= -I/home/workspace/build/zlib/include

LDFLAGS+= -L/home/workspace/build/zlib/lib
LDFLAGS+= -L/home/workspace/build/openssl/lib
LIBS+= -lc -lpthread -lz -lcrypto

OBJS= $(SRCS:.c=.o)

all: adb

adb: $(OBJS)
	$(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)

clean:
	rm -rf $(OBJS) adb

执行环境变量

. /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa9hf-neon-poky-linux-gnueabi

编译

make

将得到的adb可执行文件用u盘拷贝到开发板上,运行./adb即可

这里不需要拷贝zlib和openssl到开发板,openssl是静态链接不用导入板子,zlib是动态的,但在板子上已经有了,可以在开发板/lib目录下查看,所以不用管