为安卓或嵌入式Linux设备搭建调试开发环境

您所在的位置:网站首页 linux安卓开发环境搭建 为安卓或嵌入式Linux设备搭建调试开发环境

为安卓或嵌入式Linux设备搭建调试开发环境

2024-07-15 01:33| 来源: 网络整理| 查看: 265

前言

在2017年笔者发布了一篇文章,主要描述了在64位安卓手机上搭建基本的开发环境的操作(详见:https://blog.csdn.net/yeholmes/article/details/78568172)。当时通过百度网盘提供了两个安装包,并没有涉及到安装包的制作过程。一方面该安装包的制作过程比较复杂,不易编写文章描述;另一方面,也想着以后开发一个自动生成此类安装包的工程,但至今未能实现。今日结合最近我为32位安卓手机(实测64位安卓及嵌入式Linux设备也可以正常运行)制作的简易调试开发环境,分享一下此类工具的制作原理及制作过程。

 

制约条件

为了将一些重量级的调试、开发工具移植到安卓设备(或嵌入式Linux设备)上,如GDB调试工具,编译出来的动态链接的可执行文件大小超过5.5MB,需要移植很多的依赖库,这个过程是很繁琐的,我们需要通过buildroot/openwrt等开源工具帮助我们编译这些依赖库。此外,安卓系统使用的C语言库是bionic(而一些嵌入式Linux设备使用的C库则是uclibc),相比GNU C语言库glibc,缺少很多的库函数定义,这也让交叉编译gdb等工具困难重重。

更重要的是,我们希望此类调试开发工具是相对通用的,不能出现一种设备一种嵌入式系统,我们就得重新制作一遍工具。该工具应当是可重用的,只要有运行Linux内核的嵌入式ARM(或ARM64位)设备,都可以安装我们的调试开发工具。这几点就要求我们将独立的GNU C语言库打包至调试开发工具中。

 

实现机制

下图是笔者在小米手机上安装之后,通过SSH登录到手机上的截图,并根据此图讲述基本的实现机制。

  登录至手机后,根用户会切换到根目录;在根目录下有三个重要的软链接,即ety/liy/usy,分别指向/data/user/LinuxARM中的文件夹。对于安卓设备来说,根目录下已存在的etc软链接指向/system/etc,该文件夹下保存的是安卓系统的配置文件和资源文件;这一点与我们的调试开发工具存在冲突,此问题的解决方法如下:

使用hed命令行工具修改glibc的动态库文件(如上图的libc和动态链接器),把etc/usr/lib直接修改成为ety/usy/liy,这样我们的工具也就会读取我们制作的工具中的配置文件和资源文件了。

此外,某些嵌入式LINUX设备使用的C语言库可能也是glibc,我们希望自己的工具在运行时加载自身携带的glibc,那首先需要修改动态链接器自动加载动态库的路径:

如上图,动态链接器ld-2.25.so默认从/lib/及/usr/lib/两个文件夹中寻找动态库,使用hed命令行工具直接将/lib及/usr/lib修改为/liy和/usr/liy(其实/usr/已被修改为/usy,即/usy/liy),这样就不会误加载嵌入式设备上已存在的动态库文件了。见第一张图,使用ldd命令查看可执行文件ls的动态库依赖情况时,动态链接器能够正确地找到ls依赖的动态库,即libc.so.6所在的路径:在/liy文件夹下。

上面的修改还没有结束;其次,要修改各个ELF可执行文件的动态链接器(见第一张图,less可执行文件及gdb可执行文件的动态链接器均为/lib/ld-linux-armhf.so.y),这是通过一个名为reset-dynlinker.sh的脚本遍历指定文件夹中的可执行文件,调用hed命令行工具直接修改二进制可执行文件(该脚本可以在安装包的host文件夹下找到):

见上图,我们使用的动态链接器路径为/lib/ld-linux-armhf.so.y,这样可以避免使用到设备上的动态链接器/lib/ld-linux-armhf.so.3(如果存在的话)。

最后,为了避免我们的调试开发工具受到以LD_为前缀的环境变量的影响,我们还要修改动态链接器ld-2.25.so中的机器码,让它只解析以DL_为前缀的环境变量(详见安装包中的modify-ld.so.sh脚本),对应的源代码如下:

至此,我们的调试开发工具就可以在多种设备上运行了:它自带glibc库和一些第三方开源库,我们能够实现一次制作,处处运行;也可以为嵌入式设备移植一些复杂的调试开发工具,如Git/Vim等。

安装过程

笔者提供了已制作好的调试开发工具安装包,实测在安卓设备和嵌入式Linux设备上正常运行(下载路径为:https://download.csdn.net/download/yeholmes/12323920),压缩包名称为LinuxARM.tar.xz。对于安卓设备(或嵌入式Linux设备)上存在xzcat和tar命令行工具的,可以使用以下命令进行安装:

umask 022 mkdir -p /data/user xzcat /path/to/LinuxARM.tar.xz | tar -x -f - cd LinuxARM && tar -x -f Git.ar && sync cp scripts/install.sh /system/xbin/tsel

这样就在安卓设备上安装完成了。启动安卓终端工具,运行tsel脚本,以启动SSH服务器(由dropbear工具提供),这样就可以登录至安卓设备上了(注意root用户的初始密码为123456,SSH的端口号为2020):

制作过程

真正的猛士,不仅赖而且挑剔:我们即不想编译gdb/vim/dropbear/git等调试开发工具依赖的ncurses/libcurl/expat/openssl/zlib等库,又嫌弃buildroot生成的vim编辑器不够正宗(buildroot生成的vim编辑器缺少在线文档)。这样我们选择使用buildroot编译一个小型的根文件系统,同时集成了这些开源库;之后再手动编译这些调试开发工具。

① 从linaro.org网站上下载交叉编译器,下载链接:(https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz);下载后解压到/opt目录下:

② 从buildroot.org网站下载buildroot开源工具,并解压至用户目录下:

③ 使用安装包中的scripts/buildroot.defconfig文件配置openwrt,并编译生成根文件系统压缩包rootfs.tar。在PC机上创建/system/LinuxARM文件夹,将根文件系统压缩包解压至LinuxARM文件夹中:

④ 按照安装包中scripts文件夹下的编译记录文件为小型的根文件系统交叉编译dropbear/gdb/git/vim等开源应用:

⑤ 运行安装包中host文件夹下的三个脚本,以修改/system/LinuxARM各个子文件夹下的可执行文件,这些脚本会调用hed命令行工具实现一些必要的修改(具体的用法及实现请参考各个脚本的内容):

至此,基本的制作过程就完成了;对LinuxARM文件夹进行压缩,下载到手机上即可安装使用了。该制作过程说明的比较简略,但体现了基本的流程;此过程中也遇到诸多问题,这里就不再详细说明了。

其他

本文主要描述此类运行于安卓或嵌入式Linux设备上的调试开发工具的实现机制;因此并没有集成很多的调试或开发工具。一些开源软件如nodejs/golang等都提供已编译好的运行于嵌入式设备上的软件包,可以简略地修改运态链接器放在设备上运行。对于安卓设备,由于LinuxARM.tar.xz没有创建/tmp临时目录,因此一些功能如vimtutor是不能正确运行的,不过vim及gdb可以正常使用:

笔者制作了一些其他的调试开发工具包,如带有python3解析器、man手册的安装包,如需要请发邮件联系笔者:[email protected]



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3