1.安卓内核驱动模块(ko文件)独立编译教程 (上)
2.MacOS 下交叉编译的折腾笔记
3.用 BusyBox 构建根文件系统
4.ARM & Linux 基础学习 / 配置交叉编译工具链 / 编译 Linux 应用和驱动 / 编译内核
5.å¦ä½å®è£
gcc-linaro-arm-linux-gnueabihf-4.8-2014.03
6.arm-linux-gcc å arm-elf-gcc çåºå«
安卓内核驱动模块(ko文件)独立编译教程 (上)
在没有启用驱动签名校验的安卓内核(如4.xx.xxx版本)中,编译ko文件可以实现特定功能,如内存无痕读取和防root检测。本文将分两部分教你如何独立编译ko文件,首先从内核编译开始。
环境与设备准备:
确保你的keystone源码设备和编译环境已安装必要的工具,如编译器和对应设备的内核源码。小米设备的内核源码可从Github获取,例如小米,推荐使用高通Clang或linaro_gcc。接下来,根据内核配置指南,获取设备配置文件,解压/proc/config.gz并进行编译,生成vmlinux和Module.symvers文件。
修改驱动模块校验信息:
如果直接编译ko文件,可能会遇到加载错误,原因是驱动模块符号crc校验与内核不符。解决方法是重命名vmlinux,提取boot.img,安装vmlinux-to-elf工具,桌面程序源码并使用脚本来提取并替换Module.symvers中的crc信息。如果内核版本与源码一致,部分符号处理可略过。最终,替换后的Module.symvers将确保编译的ko文件拥有正确的校验信息。
请继续阅读下篇教程,获取完整过程和更多详细步骤。
MacOS 下交叉编译的折腾笔记
探索 MacOS 下的交叉编译技巧
本文作为系列 “折腾笔记” 的一部分,旨在以直白的方式展示交叉编译过程中的实际操作,而非追求最佳实践。本教程将为初学者提供一个直观理解交叉编译的基本框架,并在后续篇章中深入探讨基于 Bazel 的交叉编译最佳实践,以及如何在树莓派等目标平台上运行包含深度学习模型的小程序。
值得注意的是,尽管 MacOS 广为人知,但并不等同于 Linux。在 MacOS 上进行交叉编译时,往往面临着一些挑战。例如,某些 TensorFlowLite 提供的棋牌源码如何交叉编译工具或 Linaro 系列工具仅在 Linux 环境下可用。因此,建议在进行 MacOS 下的交叉编译时,采用 Docker 技术运行 Linux 系统,从而有效绕过这些平台限制。
对于交叉编译的入门理解与实践思路,我们需要明确其本质是利用能将源代码转换为目标平台机器语言的编译器。在进行树莓派等目标平台的交叉编译时,通常需要使用特定于目标架构(如 ARM)的编译器,例如 arm-linux-gnueabihf-gcc。
实际操作中,交叉编译流程可以概括为以下步骤:
1. **依赖环境安装**:利用 Homebrew 等包管理工具安装必要的依赖项。
2. **环境准备**:从树莓派设备上复制相关 gcc 及其配套环境。
3. **环境检查**:确保当前工作目录正确无误。
4. **源代码准备**:编写或获取待编译的源代码文件,如 `hello_cross_comile.cc`。
5. **交叉编译执行**:利用 LLVM 工具链结合 arm-linux-gnueabihf-binutils 进行交叉编译。
6. **构建输出**:运行特定编译脚本(通常封装为 `.sh` 文件)生成目标平台可执行文件(如 `hello`),随后将该文件传输至树莓派等目标平台进行执行。
推荐阅读资源:
4. **[野火]i.MX Linux开发实战指南**:该文档提供了一个全面且详细的交叉编译指南,虽然不直接支持 MacOS,gitlab 源码恢复但通过开启 Docker 环境,可以轻松实现 MacOS 下的交叉编译。
Crosstool-ng:尽管这是 MacOS 下公认的交叉编译解决方案,但其操作复杂,且存在系统崩溃风险。对于坚持使用此方案的开发者,可参考他人提供的 Docker 镜像,例如 **Dockfile**,但同样建议考虑使用更易管理的 Linux 操作系统(如 Ubuntu)作为 Docker 容器的基础环境。
用 BusyBox 构建根文件系统
构建Linux嵌入式系统的基石是根文件系统,它是一个集成核心组件的单一目录,为后续软件和设备管理提供基础。根文件系统内包含了诸如/bin的系统命令(strong>如ls、cd等),/dev管理设备,/etc配置文件以设置环境,/lib存放必要库文件,/mnt用于临时挂载,/proc虚拟系统信息确保系统运行透明,/usr为软件资源库,直销提成源码/var存储可变数据,而/sbin则包含管理员工具,/sys用于设备管理和监控,/opt则存放可选软件,sysfs和sysfs类似但功能略有差异。 BusyBox,这个强大的瑞士军刀工具,扮演着构建根文件系统的关键角色。首先,从官网下载适合的版本,如busybox-1..0,并在Ubuntu虚拟机中借助NFS服务进行定制。这里,我们需要确保在Makefile中针对目标架构进行适当的调整,尤其是处理可能的COMPILE错误,使用绝对路径,并解决中文字符问题,比如在源码中的printable_string.c和unicode.c文件中,可能需要注释或调整字符编码规则以支持中文显示。 定制BusyBox的过程可通过两种方式完成:defconfig(默认配置)或图形化的menuconfig。推荐动态编译,并激活mdev和Unicode支持,以确保兼容性和功能性。 编译步骤如下:首先运行make defconfig 或 make menuconfig,然后选择动态编译和必要的Unicode支持。接着,使用make make install CONFIG_PREFIX=/path 命令将编译后的工具和文件安装到指定的rootfs目录,这里会生成bin、sbin、usr和linuxrc文件夹,其中Linux内核通过寻找init程序(通常是linuxrc)进入用户态。 接下来,为了增强根文件系统的功能性,我们需要添加lib库。从交叉编译器的/usr/local/arm/gcc-linaro-...目录下的arm-linux-gnueabihf/libc/lib子目录中复制.so和.a文件到rootfs/lib,特别注意处理特殊库文件ld-linux-armhf.so.3。 除了基本的文件夹结构,如dev、proc、mnt、sys、tmp和root,还需要创建额外的目录以支持系统的完整功能。例如,dev目录用于设备文件管理,proc用于虚拟系统信息,mnt用于挂载外部存储,sys用于设备驱动的配置,而tmp则存放临时文件。 最后,通过NFS服务将rootfs挂载到开发板上,确保在bootargs中正确设置root,例如:root=/dev/nfs, nfsroot=...:/home/andyxi/linux/nfs/rootfs, proto=tcp, rw。然后,通过串口设置bootargs启动Linux,如果出现错误,表明rootfs可能还不完整,后续我们将深入探讨如何修复和完善这个关键步骤。 获取BusyBox的具体资源,请关注相关渠道并输入关键词"busybox"获取详细信息。ARM & Linux 基础学习 / 配置交叉编译工具链 / 编译 Linux 应用和驱动 / 编译内核
基于 ARM & Linux 的基础学习 本文整理自“ask imx6ull”开发板的相关资料,以及菜鸟教程、C语言中文网等资源,旨在提炼核心内容,方便后续查阅。对于基础知识,本文将不再详述,如有错误,期待您的指正。请记住,文章基于IMX6ULL的A7内核,配置的交叉编译器对应ARMv7 位,对于A内核如i.mx8mm,则需使用ARMv8 位的工具链。保持清晰的学习态度,耐心探索。 获取Linux应用和驱动的编译指南,可以从三个途径入手:开发板供应商提供的SDK工具链、ARM官网下载、以及Linaro GCC编译器。具体操作涉及编辑~/.bashrc文件以添加环境变量,并测试编译器版本。 针对IMX6ULL,SDK中的工具链位于/.../ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin。通过添加至.bashrc并激活,验证工具链可用性。在编写和编译驱动程序时,需编写Makefile并确保环境变量设置正确。 编译内核时,需根据特定开发板的配置文件,如arch/arm/configs/目录下的内容进行。首先在Linux源码目录执行配置命令,生成内核文件和设备树文件。对于内核模块的编译,同样在Linux源码目录进行,完成后将模块导入目标板的lib/modules目录。 对于Buildroot构建系统,它简化了嵌入式Linux定制过程,自动化构建bootloader、内核和文件系统。通过一系列Makefile命令,可以快速生成适用于不同目标板的嵌入式Linux环境。学习Buildroot,可以参考相关文档。 构建过程可能耗时较长,但通过配置不同的配置文件,可以定制化地创建不同需求的文件系统。编译成功后,输出的文件需传输到嵌入式板并安装或烧录至SD卡或eMMC中。å¦ä½å®è£ gcc-linaro-arm-linux-gnueabihf-4.8-.
1ã å¦æè¦èªå·±ç¼è¯å·¥å ·é¾ï¼ä»ä»¥ä¸é¾æ¥ä¸è½½æºç
crosstools-ngä¸è½½å°å
monly used with uClinux. uC-libc and
uClibc. They are quite different despite their similar names. Here is a
quick overview of how they are different.
ããuC-libc is the original library for uClinux. It was based on sources
from the Linux- C library which was part of the ELKs project with m
support added by Jeff Dionne and Kenneth Albanowski. It is a fairly complete
libc implementation, however, some of the API's are a little non-standard
and quite a few common libc routines are not present. Currently it has
stable support for m, ColdFire and ARM (Non-MMU) architectures. It was
primary design goal is to be small and light weight. It does try to conform
to any standards, although its API tries to be compatible with most libcs,
it is not always exactly the same.
ããThe uClinux distribution provides an environment that can compile using
either uC-libc or uClibc depending on your needs. For m and Coldfire
platforms it is generally better to chose uC-libc as it supports shared
libraries and is the most commonly used libc for these CPUs. uClibc also
works quite well with almost all platforms supported by the distribution.
Which libc you choose to use will be decided by your requirements
uClinuxæ两个ç»å¸¸ä½¿ç¨çlibcåºï¼uC-libcåuClibcãè½ç¶ä¸¤è ååå¾ç¸ä¼¼ï¼å ¶å®æå·®
å«ï¼ä¸é¢å°±ç®åçä»ç»ä¸ä¸äºè çä¸åä¹å¤ãuC -libcæ¯ææ©ä¸ºuClinuxå¼åçåºï¼æ¯
Jeff DionneåKenneth Albanowski为å¨EKLs项ç®ä¸æ¯æmå¨Linux- Cåºæºç
ä¸ç§»æ¤çãuC-libcæ¯ä¸ä¸ªå®å ¨çlibcå®ç°ï¼ä½å ¶ä¸æä¸äºapiæ¯éæ åçï¼æäºlibcç
æ åä¹æ²¡æå®ç°ãuC-libc稳å®å°æ¯æ mï¼ColdFireå没æMMUçARMãå ¶ä¸»è¦è®¾è®¡
ç®æ æ¯âå°âã"è½»"ï¼å¹¶å°½éä¸æ åä¸è´ï¼è½ç¶å®çAPIåå¾å¤libcå ¼å®¹ï¼ä½æ¯ä¼¼ä¹å¹¶
ä¸åå®ææçé£æ ·åæææ åä¸è´ã
uClibcå°±æ¯ä¸ºäºè§£å³è¿ä¸ªé®é¢ä»uC-libcä¸åå±åºæ¥çãå®çææAPIé½æ¯æ åç(æ£ç¡®
çè¿åç±»åï¼åæ°çç)ï¼å®å¼¥è¡¥äºuC-libcä¸æ²¡æå®ç°çlibcæ åï¼ç°å¨å·²ç»è¢«ç§»æ¤å°
å¤ç§æ¶æä¸ãä¸è¬æ¥è®²ï¼å®å°½éå ¼å®¹glibc以便使åºç¨ç¨åºç¨uClibcæ¹ååç容æã
uClibcè½å¤å¨æ åç VM linuxåuClinuxä¸é¢ä½¿ç¨ã为äºåºç¨ç¨åºçç®æ´ï¼å®çè³å¯ä»¥
å¨è®¸å¤æ¯æMMUçå¹³å°ä¸è¢«ç¼è¯æå ±äº«åºãErik Andersonå¨uClibcèååäºå¾å¤çå·¥
ä½ãuClibcæ¯æ许å¤ç³»åçå¤çå¨ï¼mï¼Coldfireï¼ARMï¼MIPSï¼vï¼ xï¼
iï¼Sparcï¼SuperHï¼Alphaï¼PowerPCåHitachi 8ãä¸æå¢å çå¹³å°æ¯ææ¾ç¤ºuClibc
è½å¤å¾å®¹æçéåºæ°çæ¶æãuClinuxåè¡çæä¾äºç¯å¢è½å¤è®©ä½ éæ©ä½¿ç¨uC-libcææ¯
uClibcç¼è¯ã对äºmåColdfireå¹³å°æ¥è¯´ï¼éæ©uC-libcè¿æ¯ç¨å¾®å¥½ä¸ç¹ï¼å 为å®
æ¯æå ±äº«åºï¼èå ±äº«åºæ¯è¿äºcpuç»å¸¸ä½¿ç¨ç libc.uClibcä¹å ä¹åææçå¹³å°é½è½å¾
好çå·¥ä½ãéæ©åªç§libcåå³äºä½ çéæ±ã
newlib æ¯ä¸ä¸ªç¨äºåµå ¥å¼ç³»ç»çå¼æ¾æºä»£ç çCè¯è¨ç¨åºåºï¼ç±libcålibm两个åºç»
æï¼ç¹ç¹æ¯è½»é级ï¼é度快ï¼å¯ç§»æ¤å°å¾å¤CPUç»æä¸ãnewlibå®ç°äºè®¸å¤å¤æçå
è½ï¼å æ¬å符串æ¯æï¼æµ®ç¹è¿ç®ï¼å ååé (å¦malloc)åI/Oæµå½æ°(printfï¼fprinf()
çç)ãå ¶ä¸libcæä¾äºc è¯è¨åºçå®ç°ï¼èlibmæä¾äºæµ®ç¹è¿ç®æ¯æã
å¨ä¸ºARM交åç¼è¯gccç¼è¯å¨æ¶ï¼å¯¹gccæå®ä¸åçé ç½®é项æ¶ï¼ä½¿ç¨çCè¯è¨åºå°±ä¸åï¼
gccç¼è¯å¨é»è®¤ä½¿ç¨Glibcï¼ä¹å¯ä»¥ä½¿ç¨ uClibc/uC-libc(åºæ¬å ¼å®¹Glibc API)ï¼å½ä½¿ç¨
--with-newlibæ¶ï¼gccç¼è¯å¨ä¸ä½¿ç¨Glibcãå½æ²¡æ交åç¼è¯Glibcæ¶ï¼å¯ä»¥ä½¿ç¨
--with-newlibç¦æ¢è¿æ¥Glibcèç¼è¯bootstrap gccç¼è¯å¨ãä»gccæºç®å½ä¸ç
config/armä¸çt-linuxåt-arm-elfä¸å¯ä»¥çåºï¼ä¸åç--targetä¹å½±ågccè¿æ¥Cè¯è¨
åºï¼t-linux(--target=arm-linux)é»è®¤ä½¿ç¨Glibcï¼-arm-elf(--target=arm-elf)使ç¨
- Dinhibit_libcç¦æ¢è¿æ¥Glibcï¼è¿æ¶æ们就å¯ä»¥ä½¿ç¨newlibçå ¶ä»Cè¯è¨åºç¼è¯GCCå·¥
å ·é¾ã
è½ç¶GCCå·¥å ·é¾é ç½®äºä¸åççCè¯è¨åºï¼ä½ç±äºè¿äºCè¯è¨åºé½å¯ä»¥ç¨æ¥æ¯æGCCï¼å®ä»¬
å¯¹æ ¸å¿æ°æ®çå¤çä¸ä¸åå¨è¾å¤§åºå ¥ãå èarm-linux-* å arm-elf-*åºå«ä¸»è¦è¡¨ç°å¨
Cè¯è¨åºçå®ç°ä¸ï¼ä¾å¦ä¸åç³»ç»è°ç¨ï¼ä¸åçå½æ°éå®ç°ï¼ä¸åçABI\å¯å¨ä»£ç 以å
ä¸åç³»ç»ç¹æ§çå¾®å°çå·®å«ã
arm-linux-*å arm-elf-*ç使ç¨æ²¡æä¸ä¸ªç»å¯¹çæ åï¼æé¤ä¸ååºå®ç°çå·®å¼ï¼gccå¯
以ç¼è¯ä»»ä½ç³»ç»ãarm-linux-*å arm-elf-*é½å¯ä»¥ç¨æ¥ç¼è¯è£¸æºç¨åºåæä½ç³»ç»ï¼åª
æ¯å¨éµå¾ªä¸é¢çæè¿°æ¶ç³»ç»ç¨åºæ¾å¾æ´å åè°ï¼
arm-linux-*é对è¿è¡linuxçARMæºå¨ï¼å ¶ä¾èµäºæå®çCè¯è¨åºGlibcï¼å 为åæ ·ä½¿ç¨
Glibcçlinuxè使å¾arm-linux-*å¨è¿è¡linuxçARMæºå¨ä¸ç¼è¯æ¾å¾æ´å åè°ã
arm-elf-*åæ¯ä¸ä¸ªç¬ç«çç¼è¯ä½ç³»ï¼ä¸ä¾èµäºæå®çCè¯è¨åºGlibcï¼å¯ä»¥ä½¿ç¨newlib
çå ¶ä»Cè¯è¨åºï¼ä¸è¦æ±æä½ç³»ç»æ¯æï¼å½å ¶ä½¿ç¨ä¸ºåµå ¥å¼ç³»ç»è设计çä¸äºè½»å·§çCè¯
è¨åºæ¶ç¼è¯è£¸æºç¨åº(没ælinuxç大åæä½ç³»ç»çç¨åº)ï¼å¦çæ§ç¨åºï¼bootloaderç
è½ä½¿å¾ç³»ç»ç¨åºæ´å å°å·§å¿«æ·ã
Linaro prebuilt toolchain does support both hard and soft floating
point. You can get it from /linaro-toolchain-binaries/+milestone/. try: ./arm-linux-gnueabihf-gcc -print-multi-lib
The default configure is --with-arch=armv7-a --with-tune=cortex-a9
--with-fpu=vfpv3-d --with-float=hard --with-mode=thumb
To use soft floating, you need options: -marm -march=armv4t -mfloat-abi=soft.
In your case, please try to change -march=armv5 to "-march=armv4t"
If you want to change to configure to cortex-a8 and armv5. You need
* Change cortex-a9 to cortex-a8 in
samples/linaro-arm-linux-gnueabihf/crosstool.config
* Change armv4t to armv5 in
contrib/linaro/patches/gcc/linaro-4.7-./multilib.patch,
Then follow the instructions to rebuild the toolchain
(contrib/linaro/doc/README.txt)
BTW: crosstool-ng-linaro does not support multilib for eglibc. It uses
the prebuilt sysroot from Ubuntu Precise. If it does not work for you,
please use the latest crosstool-ng from http://crosstool-ng.org/.