Linux中程序的运行原理 

在Linux的开发环境中,C语言程序的运行环境如图1-3所示。

作为UNIX操作系统的一种,Linux的操作系统提供了一系列的接口,这些接口被称为系统调用(System Call)。在UNIX的理念中,系统调用"提供的是机制,而不是策略"。C语言的库函数通过调用系统调用来实现,库函数对上层提供了C语言库文件的接口。在应用程序层,通过调用C语言库函数和系统调用来实现功能。一般来说,应用程序大多使用C语言库函数实现其功能,较少使用系统调用。

133051513.jpg
图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所示。

133138777.jpg
图1-4  ELF可执行程序结构

一个ELF文件从连接器(Linker)的角度看,是一些节的集合;从程序加载器(Loader)的角度看,它是一些段(Segments)的集合。ELF格式的程序和共享库具有相同的结构,只是段的集合和节的集合上有些不同。

ELF格式的共享库可以加载到任何地址。事实上,共享库使用PIC(Place Independence Code,位置无关代码),使得文件的代码段(Text Page)不需要重定位,并且可以被多个进程共享。ELF格式的连接器通过GOT(Global Offset Table)来支持PIC代码。

 

 学习了较长时间Linux,建了个自己的学习资源,放在一个网盘中,无需注册和积分,快速方便免费下载,希望对大家有点点帮助!


贡献58Linux教程电子书和资料--经典必备     下载链接

不断更新中,觉得有用的朋友也可以收藏一下!!只分享有用有价值的资料给大家。如果你有好的相关资料也可以发给我(
2301775306@qq.com),我将分享给更多需要的人。

101-深入理解Linux内核(第三版
英文版)-1030.pdf
102-深入分析Linux_内核源代码--550.pdf
103-Linux下的C编程-438.pdf
104-linux从入门到精通-372.pdf
105-Linux菜鸟专用资料-595.pdf
106-Linux网络编程-335.pdf
107-嵌入式Linux应用开发完全手册-完整版-110.pdf
108-Linux设备驱动程序学习-170.pdf
109-嵌入式Linux应用程序开发详解--470.pdf
110-Linux实用培训教程合并版-486.pdf
111-嵌入式QT编程(mini2440)-143.pdf
112-linux_shell_编程-458.pdf
113-Qt编程及应用-116.pdf
114-Linux嵌入式软件开发-365.pdf
115-Linux程序员指南-101.pdf
116-ARM9+嵌入式Linux-348.pdf
119-ARM应用系统开发详解-270.pdf
120-Linux_C编程一站式学习_最新版-775.pdf
121-linux命令大全--分类总结、实例和用法—免费下载.pdf
225-U-boot源代码分析-62-pdf.pdf
226-Ubuntu从入门到精通-56-pdf.pdf
227-uCOS_ARM移植要点详解—北航版-364-pdf.pdf
228-内核阅读心得.pdf
229-我的arm_linux移植笔记.doc
230-Linux系统命令及其使用详解.doc
231-S3C2440完全开发流程.doc
232-史上最牛的Linux内核学习方法论.doc
233-Linux系统命令及其使用详解-120.doc
234-Linux_Socket培训课件.ppt
235-Linux基础培训课件.ppt
236-LAMP兄弟连Linux课件.pptx
237-Linux基础教程(清华课件).doc
238-Linux多线程编程手册.pdf
239-Linux内核情景分析-1565.pdf
241-系统程序员成长计划.pdf
242-Linux内核修炼之道.pdf
243-Linux_内核完全注释_V11.pdf
244-linux-kernel2628rc7.pdf
245-Linux菜鸟过关.pdf
246-GCC
中文手册.pdf
247-GDB调试工具指南.pdf
248-GNU Make
使用手册(中译版).pdf
249-GNU
linux
编程指南.pdf
250-linux0.01源代码.zip
251-Linux 2.6.19.x
内核编译配置选项简介.pdf
252-linux网络管理员手册.pdf
253-Linux那些事儿之我是EHCI主机控制器.pdf
254-Linux那些事儿之我是Hub.pdf
255-Linux那些事儿之我是PCI.pdf
256-Linux那些事儿之我是SCSI硬盘.pdf
257-Linux那些事儿之我是Sysfs.pdf
258-Linux那些事儿之我是UHCI.pdf
259-Linux那些事儿之我是Usb
Core.pdf

260-Linux那些事儿之我是U.pdf
261-Linux认证系列培训视频教程相关内容简介.pdf
262-鸟哥的Linux私房菜-完整版.chm
263-Linux_C_函数手册.chm