可执行文件格式(大地小神之个人收藏)

可执行文件格式UNIX/LINUX平台下三种主要的可执行文件格式:a.outa.out(assemblerandlinkeditoroutput汇编器和链接编辑器的输出)、COFFCOFF(CommonObjectFileFormat通用对象文件格式)、ELFELF(ExecutableandLinkingFormat可执行和链接格式)。首先是对可执行文件格式的一个综述,并通过描述ELF文件加载过程以揭示可执行文件内容与加载运行操作之间的关系。随后依此讨论了此三种文件格式,并着重讨论ELF文件的动态连接机制,其间也穿插了对各种文件格式优缺点的评价。最后对三种可执行文件格式有一个简单总结,并提出作者对可文件格式评价的一些感想。可执行文件格式综述可执行文件格式综述相对于其它文件类型,可执行文件可能是一个操作系统中最重要的文件类型,因为它们是完成操作的真正执行者。可执行文件的大小、运行速度、资源占用情况以及可扩展性可扩展性、可移植性可移植性等与文件格式的定义和文件加载过程紧密相关。研究可执行文件的格式对编写高性能程序和一些黑客技术的运用都是非常有意义的。不管何种可执行文件格式,一些基本的要素是必须的,显而易见的,文件中应包含代码和数据。因为文件可能引用外部文件定义的符号(变量和函数),因此重定位信息重定位信息和符号信息符号信息也是需要需要的。一些辅助信息辅助信息是可选可选的,如调试信息调试信息、硬件信息硬件信息等。基本上任意一种可执行文件格式都是按区间保存上述信息,称为段(段(SegmentSegment))或节节((SectionSection))。不同的文件格式中段和节的含义可能有细微区别,但根据上下文关系可以很清楚的理解,这不是关键问题。最后,可执行文件通常都有一个文件头部文件头部以描述本文件的总体结构。相对可执行文件有三个重要三个重要的概念:编译(compile)、连接(link,也可称为链接、联接)、加载(load)。源程序文件被编译编译成目标文件,多个目标文件被连接连接成一个最终的可执行文件,可执行文件被加载加载到内存中运行。因为本文重点是讨论可执行文件格式,因此加载过程也相对重点讨论。下面是LINUX平台下ELF文件加载过程的一个简单描述。1:内核首先读ELF文件的头部头部,然后根据头部的数据指示分别读入各种数据结构,找到标记标记为可加载(loadable)的段段,并调用函数mmap()把段内容加载到内存内存中。在加载之前,内核把段的标记直接传递给mmap(),段的标记段的标记指示该段在内存中是否可读可读、可写可写,可执可执行行。显然,文本段是只读可执行,而数据段是可读可写。这种方式是利用了现代操作系统和处理器对内存的保护功能。著名Shellcode(参考资料17)的编写技巧则是突破此保护功能的一个实际例子。2:内核分析出ELF文件标记为PT_INTERP的段中所对应的动态连接器名称,并加载动态连接器。现代LINUX系统的动态连接器通常是/lib/ld-linux.so.2,相关细节在后面有详细描述。3:内核在新进程的堆栈中设置一些标记-值对,以指示动态连接器的相关操作。4:内核把控制传递给动态连接器。5:动态连接器检查程序对外部文件(共享库)的依赖性,并在需要时对其进行加载。6:动态连接器对程序的外部引用进行重定位进行重定位,通俗的讲,就是告诉程序其引用的外部变量/函数的地址,此地址位于共享库被加载在内存的区间内。动态连接还有一个延迟(Lazy)定位的特性,即只在”真正”需要引用符号时才重定位,这对提高程序运行效率有极大帮助。7:动态连接器执行在ELF文件中标记为.init的节的代码,进行程序运行的初始化。在早期系统中,初始化代码对应函数_init(void)(函数名强制固定),在现代系统中,则对应形式为void__attribute((constructor))init_function(void){……}其中函数名为任意。8:动态连接器把控制传递给程序,从ELF文件头部中定义的程序进入点开始执行。在a.out格式和ELF格式中,程序进入点的值是显式存在的,在COFF格式中则是由规范隐含定义。从上面的描述可以看出,加载文件最重要的是完成两件事情加载文件最重要的是完成两件事情:加加载载程序段和数据段到内存;进行外部定义符号的重定位重定位。重定位是程序连接中一个重要概念。我们知道,一个可执行...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

确认删除?