本节书摘来自异步社区《嵌入式C编程实战》一书中的第1章,第1.5节,作者【瑞典】Lars Bengtsson(本特松) , Lennart Lindh(林德), 李华峰 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.5 软件开发工具
现在有很多的软件开发语言,如C、C++、ADA、LISP等。软件的开发都遵循标准化的过程。程序(源代码)可以被编译成目标对象可以执行的代码,一些编译器会将代码转换为汇编程序。而链接器将程序与用到的库文件和其他一些东西组织在一起,而且所有的基地址都是绝对地址。链接器最后产生的可以被下载到目标系统并执行的机器代码,如图1.11所示。
1.5.1 编译器
编译器是一种计算机软件,它的作用是将源程序转换为目标程序。通常,通过两个步骤,就可以将一个C语言编写的程序转换为目标程序。第一步,将C程序转换为汇编程序;第二步,将汇编转换为目标程序。目标程序不能直接载入到系统中,它还需要和其他目标代码文件链接到一起。
目标程序可能会需要与设备驱动程序和其他程序组织在一起,这一点需要由链接器来实现。编译器不会将符号地址转换为真实地址。因此,这里即使只有一个目标程序,也必须使用链接器来完成地址转换。
1.5.2 链接器
链接器允许将不同的模块组织成一个程序,而程序员使用链接器的历史可以追溯到1947年。
链接器的定义
链接器是一个程序,可以将目标程序模块组织在一起,形成一个可执行的程序。简单地说,就是它将多个文件组合到了一起。
目标程序是指一种包含了机器代码和信息的程序模块。这些模块最后需要链接器进行组装。
大多数的编程语言(如C)都允许独立地进行模块的编写。这样做简化了编程的工作,因为你可以将一个大型的程序分解为多个更小、更容易管理的部分。
最后,将这些模块组合在一起,这是链接器的工作。图1.12给出了程序链接的过程。
elf=可执行链接格式。