嵌入式C语言自我修养:从芯片、编译器到操作系统
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第4章 程序的编译、链接、安装和运行

在Windows下开发一个C程序,一般都会用到集成开发环境(Integrated Development Environment,IDE),如VC++6.0、C-Free、Visual Studio、Keil等。IDE界面友好,使用方便,5分钟就可以快速上手:新建一个工程/源文件,编辑程序,点击界面上的Run按钮,然后我们编写的程序就可以运行了。至于程序是如何编译和运行的,我们无须操心,因为IDE已经为我们封装好了:IDE集程序编辑器、工程管理器、编译器、汇编器、链接器、调试器、二进制工具、库、头文件于一身,留给用户的使用接口就是创建一个工程,编写代码,运行代码。这种一站式开发方式大大简化了软件的开发,程序员只需要关注自己要实现的业务逻辑和功能代码即可,至于底层是如何编译运行的,不用关心。

嵌入式开发和桌面开发不太一样:处理器平台和软件生态碎片化、多样化。为了提高性价比,不同的嵌入式系统往往采取更灵活的配置:不同的CPU平台、不同大小的存储、不同的启动方式,导致我们在编译程序时,有时候不仅要考虑一个嵌入式平台的内存、存储器的地址空间,还要考虑将我们的程序代码“烧”写到什么地方、加载到内存什么地方、如何执行。这就要求嵌入式工程师必须了解在程序运行的背后,它们是如何编译、链接和运行的。有了这些理论支撑,我们才可能灵活地根据硬件平台的差异去完成软件层面的编译优化和配置。

关于编译原理方面的图书,比较经典的就是“龙书”“虎书”和“鲸书”,此外还有Linkers and Loaders和《程序员的自我修养》。尤其是《程序员的自我修养》这本书,中文语境和写作思维更适合国内的程序员阅读,把程序的编译、链接、运行的各个细节都已经讲得很清楚了。对于嵌入式工程师来说,对编译原理要掌握到什么程度,才能满足工作的需要呢?这是一个值得研究的问题:嵌入式工程师大多数拥有电子、电气、自动化专业背景,不可能像计算机专业的学生那样掌握程序编译过程中的每一个细节,如语法分析、词法分析等。虽然没有这个必要,但也不能对编译原理只有一个感性的认识,忽视一些关键的知识点和细节,在实际项目中将无法给我们的工程实践带来理论上的帮助和支撑。

市面上关于编译原理的图书,基本上都是基于X86平台讲解的,目前还没有看到基于ARM平台的。而对于嵌入式工程师来说,绝大多数时候都是基于ARM平台进行开发工作,基于这个背景和需求,本章的写作重点也就清晰了:参考前面提到的经典图书,结合ARM平台,把程序的编译、链接、安装和运行的基本原理串起来再给大家梳理一遍,并对嵌入式开发中的一些关键知识点和理论(如U-boot的加载、重定位)着重分析。对于ARM裸机程序运行的环境配置、Linux内核模块的加载运行机制等在编译原理的图书中很少提及的实际案例,也是本章分析的重点。而对于一些与嵌入式开发不太相关的内容(如语法分析、词法分析等),我们稍作了解就可以了,不必过于纠结细节,以防陷入其中无法自拔,打击学习的自信和热情。总之,本章的写作遵循的基本原则就是:适合嵌入式工程师阅读,不会去纠结一些太复杂烦琐的细节问题,着重讲解在实际的嵌入式开发中需要掌握的一些关键知识点和核心理论。

为了达到更好的学习效果,在学习之前,确保你的手上有一台可以运行Linux操作系统的计算机或虚拟机,并且在Linux环境下已经安装了GCC编译器和gcc-arm-linux-gnueabi交叉编译器。如果没有安装,则可以在Linux联网环境下使用下面的命令在线安装。

安装好编译工具后,我们就正式开启本章的学习之旅吧。