- 1、本文档共22页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于LINUX下的可执行程序ELF
★概要:
这片文档从程序员的角度讨论了linux的ELF二进制格式。介绍了一些ELF执行文件在运行控制的技术。展示了如何使用动态连接器和如何动态装载ELF。我们也演示了如何在LINUX使用GNU C/C++编译器和一些其他工具来创建共享的C/C++库。
★1前言
最初,UNIX系统实验室(USL)开发和发布了Executable and linking Format(ELF)这样的二进制格式。在SVR4和Solaris 2.x上,都做为可执行文件默认的二进制格式。ELF比a.out和COFF更强大更灵活。结合一些适当的工具,程序员使用ELF就可以在运行时控制程序的流程。
★2 ELF类型
三种主要的ELF文件类型:
.可执行文件:包含了代码和数据。具有可执行的程序。??? 例如这样一个程序??? ??? # file dltest??? dltest: ELF 32-bit LSB executable, Intel 80386, version 1,??????? dynamically linked (uses shared libs), not stripped
.可重定位文件:包含了代码和数据(这些数据是和其他重定位文件和共享的??? object文件一起连接时使用的)??? 例如这样文件
??? # file libfoo.o??? libfoo.o: ELF 32-bit LSB relocatable, Intel 80386, version 1,?????? not stripped
.共享object文件(又可叫做共享库):包含了代码和数据(这些数据是在连接??? 时候被连接器ld和运行时动态连接器使用的)。动态连接器可能称为??? ld.so.1,libc.so.1 或者 ld-linux.so.1。??? 例如这样文件??? ??? # file libfoo.so??? libfoo.so: ELF 32-bit LSB shared object, Intel 80386, version??? 1, not stripped
ELF section部分是非常有用的。使用一些正确的工具和技术,程序员就能熟练的操作可执行文件的执行。
★3 .init和.fini sections
在ELF系统上,一个程序是由可执行文件或者还加上一些共享object文件组成。为了执行这样的程序,系统使用那些文件创建进程的内存映象。进程映象有一些段(segment),包含了可执行指令,数据,等等。为了使一个ELF文件装载到内存,必须有一个program header(该program header是一个描述段信息的结构数组和一些为程序运行准备的信息)。
一个段可能有多个section组成.这些section在程序员角度来看更显的重要。
每个可执行文件或者是共享object文件一般包含一个section table,该表是描述ELF文件里sections的结构数组。这里有几个在ELF文档中定义的比较特别的sections.以下这些是对程序特别有用的:
.fini??? 该section保存着进程终止代码指令。因此,当一个程序正常退出时,??????? ??? 系统安排执行这个section的中的代码。.init??? ??? 该section保存着可执行指令,它构成了进程的初始化代码。??? 因此,当一个程序开始运行时,在main函数被调用之前(c语言称为??? main),系统安排执行这个section的中的代码。
.init和.fini sections的存在有着特别的目的。假如一个函数放到.init section,在main函数执行前系统就会执行它。同理,假如一个函数放到.fini section,在main函数返回后该函数就会执行。该特性被C++编译器使用,完成全局的构造和析构函数功能。
当ELF可执行文件被执行,系统将在把控制权交给可执行文件前装载所以相关的共享object文件。构造正确的.init和.fini sections,构造函数和析构函数将以正确的次序被调用。
★3.1 在c++中全局的构造函数和析构函数
在c++中全局的构造函数和析构函数必须非常小心的处理碰到的语言规范问题。构造函数必须在main函数之前被调用。析构函数必须在main函数返回之后被调用。例如,除了一般的两个辅助启动文件crti.o和crtn.o外,GNU C/C++编译器--gcc还提供两个辅助启动文件一个称为crtbegin.o,还有一个被称为crtend.o。结合.ctors和.dtors两个section,c++全局的构造函数和析构函数
文档评论(0)