设为首页 加入收藏

TOP

掌握嵌入式Linux编程2工具链(一)
2023-07-23 13:24:55 】 浏览:107
Tags:Linux 编程

2工具链

工具链是嵌入式Linux的第一个元素,也是你项目的起点。你将用它来编译所有将在你的设备上运行的代码。你在这个早期阶段做出的选择将对最终结果产生深远的影响。你的工具链应该能够通过使用处理器的最佳指令集来有效地利用你的硬件。它应该支持你所需要的语言,并对便携式操作系统接口(POSIX)和其他系统接口有一个坚实的实现。
你的工具链应该在整个项目中保持不变。换句话说,一旦你选择了你的工具链,就一定要坚持下去。在一个项目中以不一致的方式改变编译器和开发库会导致微妙的错误。也就是说,当发现安全缺陷或错误时,最好还是要更新你的工具链。
获得工具链可以像下载和安装TAR文件一样简单,也可以像从源代码构建整个东西一样复杂。在本章中,我采取了后一种方法,在crosstool-NG的工具的帮助下,我可以向你展示创建工具链的细节。稍后,在第6章 "选择构建系统 "中,我将转向使用构建系统生成的工具链,这是更常用的获得工具链的方法。当我们读到第14章 "从BusyBox runit开始 "时,我们将下载一个预先构建好的Linaro工具链来和Buildroot一起使用,这样可以节省一些时间。

技术要求

基于Linux的主机系统,安装有autoconf, automake, bison, bzip2, cmake, flex, g++, gawk, gcc, gettext, git, gperf, help2man, libncurses5-dev, libstdc++6, libtool, libtool-bin, make, patch, python3-dev, rsync, texinfo, unzip, wget, and xz-utils或其对应物。
我推荐使用Ubuntu 20.04 LTS或更高版本,因为本章的练习在写作时都是在该Linux发行版上测试的。以下是在Ubuntu 20.04 LTS上安装所有必要软件包的命令:


$ sudo apt-get install autoconf automake bison bzip2 cmake \ flex g++ gawk gcc

gettext git gperf help2man libncurses5-dev libstdc++6 libtool \ libtool-bin make

patch python3-dev rsync texinfo unzip wget xz-utils

本章的所有代码都可以在本书GitHub仓库的Chapter02文件夹中找到:https://github.com/PacktPublishing/Mastering-Embedded-Linux-Programming-Third-Edition。

工具链的介绍

工具链是一套将源代码编译成可执行文件的工具,可以在你的目标设备上运行,包括编译器、链接器和运行时库。最初,你需要工具链来构建嵌入式Linux系统的其他三个要素:引导程序、内核和根文件系统。它必须能够编译用汇编、C和C++编写的代码,因为这些都是基础开源包中使用的语言。

通常情况下,Linux的工具链是基于GNU项目的组件
(http://www.gnu.org),在写这篇文章时,大多数情况下仍是如此。然而,在过去的几年中,Clang编译器和相关的低级虚拟机(LLVM)项目(http://llvm.org)已经发展到了现在可以替代GNU工具链的程度。LLVM和基于GNU的工具链之间的主要区别是许可;LLVM用BSD许可,而GNU用GPL。

Clang也有一些技术上的优势,比如更快的编译和更好的诊断,但GNU GCC的优势在于与现有代码库的兼容性以及对各种架构和操作系统的支持。虽然花了一些年的时间,Clang现在可以编译嵌入式Linux所需的所有组件,是GNU的可行的替代方案。要了解更多的情况,请看https://www.kernel.org/doc/html/latest/kbuild/llvm.html。

关于如何使用Clang进行交叉编译,在https://clang.llvm.org/docs/CrossCompilation.html,有很好的描述。如果你想把它作为嵌入式Linux构建系统的一部分,EmbToolkit(https://embtoolkit.org)完全支持GNU和LLVM/Clang工具链,而且很多人正在努力将Clang用于Buildroot和Yocto项目。我将在第6章 "选择构建系统 "中介绍嵌入式构建系统。同时,本章主要讨论GNU工具链,因为它仍然是Linux中最流行和最成熟的工具链。

标准的GNU工具链由三个主要部分组成:

  • Binutils: 一套二进制实用程序,包括汇编器和链接器。它可以在http://gnu.org/software/binutils。

  • GNU编译器集合(GCC): 这些是C和其他语言的编译器,根据GCC的版本,包括C++、Objective-C、Objective-C++、Java、Fortran、Ada和Go。它们都使用一个共同的后端,产生汇编代码,并将其输入到GNU汇编器中。它可以在http://gcc.gnu.org/。

  • C库: 基于POSIX规范的标准化应用程序接口(API),它是应用程序进入操作系统内核的主要接口。
    应用程序的主要接口。正如我们在本章后面将看到的,有几个C语言库需要考虑。

除了这些,你还需要一份Linux内核头文件的副本,其中包含直接访问内核时需要的定义和常量。现在,你需要它们来编译C语言库,但是你以后在编写程序或编译与特定Linux设备交互的库时也需要它们,例如,通过Linux帧缓冲器驱动来显示图形。这不是简单的在你的内核源代码的include目录下复制头文件的问题。这些头文件只是为了在内核中使用,并且包含一些定义,如果在原始状态下用来编译普通的Linux应用程序,会引起冲突。

相反,你需要生成一套经过消毒的内核头文件,我在第5章 "构建根文件系统 "中已经说明了这一点。
内核头文件是否由你将要使用的Linux的确切版本生成,通常并不重要。因为内核接口总是向后兼容的,所以只需要头文件来自与你在目标上使用的内核相同或更早的内核。
大多数人认为GNU调试器(GDB)也是工具链的一部分,而且通常在这时就已经建立了。我将在第19章 "使用GDB进行调试 "中讨论GDB。

工具链的类型

对于我们的目的,有两种类型的工具链:

  • 原生

这种工具链与它生成的程序在同一类型的系统(有时是同一实际系统)上运行。这是台式机和服务器的通常情况,它在某些类别的嵌入式设备上也开始流行。例如,运行Debian for ARM的Raspberry Pi就有自我托管的本地编译器。

  • 交叉

这种工具链在与目标系统不同的类型上运行,允许在快速的桌面PC上进行开发,然后加载到嵌入式目标上进行测试。
几乎所有的嵌入式Linux开发都是使用交叉开发工具链完成的,部分原因是大多数嵌入式设备由于缺乏计算能力、内存和存储空间而不太适合进行程序开发,但也因为它使主机和目标环境分离。当主机和目标机使用相同的架构时,例如x86_64,后一点尤其重要。在这种情况下,在主机上进行本地编译并简单地将二进制文件复制到目标机

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇MRS-MRS相同功能代码管理应用笔记 下一篇物联网操作系统Zephyr入门教程4调..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目