Linux中程序的运行原理
在Linux的开发环境中,C语言程序的运行环境如图1-3所示。
作为UNIX操作系统的一种,Linux的操作系统提供了一系列的接口,这些接口被称为系统调用(System Call)。在UNIX的理念中,系统调用"提供的是机制,而不是策略"。C语言的库函数通过调用系统调用来实现,库函数对上层提供了C语言库文件的接口。在应用程序层,通过调用C语言库函数和系统调用来实现功能。一般来说,应用程序大多使用C语言库函数实现其功能,较少使用系统调用。
![]() |
图1-3 Linux下C语言程序的结构 |
在Linux等系统的环境中,C语言库及其头文件都是系统的一部分,只要安装了编译工具即可以完成C语言程序的开发。这点与Windows中程序的开发有所不同,Windows中一般需要安装开发包才能进行程序开发。
C语言程序经过编译-汇编-连接,最终生成可执行程序格式。可执行程序中包含两个部分的内容:
程序头
程序主体(二进制机器代码)
在程序头中包含了供操作系统加载的信息,操作系统根据这些信息加载可执行程序。而可执行程序的主体依然是二进制的机器代码。程序在运行的时候,正是靠逐条地执行这些机器代码,形成程序运行的序列。
在Linux操作系统中,普遍使用ELF格式来作为可执行程序或者程序生成过程中的中间格式。ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的。工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位Intel体系上不同操作系统之间可移植的二进制文件格式。
如果开发者定义了一个二进制接口集合,ELF标准允许用它来支持流线型的软件运行。通过它可以减少不同执行接口的数量,也可以减少重新编程和重新编译的代码。
ELF文件格式包括三种主要的类型:可执行文件、可重定向文件、共享库。
1.可执行文件(应用程序)
可执行文件包含了代码和数据,是可以直接运行的程序。
2.可重定向文件(*.o)
可重定向文件又称为目标文件,它包含了代码和数据(这些数据是和其他重定位文件和共享的object文件一起连接时使用的)。
3.共享文件(*.so)
也称为动态库文件,它包含了代码和数据(这些数据是在连接时候被连接器ld和运行时动态连接器使用的)。动态连接器可能称为ld.so.1,libc.so.1 或者 ld-linux.so.1。
object文件参与程序的连接(创建一个程序)和程序的执行(运行一个程序)。object文件格式提供了一个方便有效的方法来用并行的视角看待文件的内容,这些object文件的活动可以反映出不同的需要。一个ELF头存在于文件的开始处,在这里保存了路线图(road map),描述了该文件的组织情况。节(section)保存着object 文件的信息,从连接角度看它包括指令、数据、符号表和重定位信息等。
ELF文件格式如图1-4所示。
![]() |
(点击查看大图)图1-4 ELF可执行程序结构 |
一个ELF文件从连接器(Linker)的角度看,是一些节的集合;从程序加载器(Loader)的角度看,它是一些段(Segments)的集合。ELF格式的程序和共享库具有相同的结构,只是段的集合和节的集合上有些不同。
ELF格式的共享库可以加载到任何地址。事实上,共享库使用PIC(Place Independence Code,位置无关代码),使得文件的代码段(Text Page)不需要重定位,并且可以被多个进程共享。ELF格式的连接器通过GOT(Global Offset Table)来支持PIC代码。
原文地址:http://book.51cto.com/art/200902/111794.htm
ABI(application binary interface)是什么样东西?
ABI是系统与应用之间的协议. 一个BINARY(EXEC, LIB)必需符合ABI才能在相应的系统上运行. 比如我在PC上用不管什么样的COMPILER, 只要产生符合LINUX的ELF文件, 用相应的INSTRUCTION SET(比如INTEL, PPC, SPARC). 就可以在一个LINUX机器上运行. 调用系统或别人的LIB. ABI定义了BINARY的文件格式, 内容, 以及装载/卸载程序的要求, 函数调用时参数传递规则, 寄存器, 堆栈的使用等. |