linux可执行文件格式
- 格式:pdf
- 大小:197.36 KB
- 文档页数:10
linux elf执行流程Linux ELF 执行流程ELF(Executable and Linkable Format)是Linux系统中可执行文件的一种格式。
在Linux下,当我们执行一个可执行文件时,操作系统会按照一定的流程解析和执行该文件。
本文将介绍Linux ELF 的执行流程。
1. ELF文件格式ELF文件由多个段(section)组成,每个段都有特定的作用。
常见的段包括.text段(包含程序的指令)、.data段(包含程序的全局变量和静态变量)、.bss段(包含未初始化的全局变量和静态变量)等。
2. 加载可执行文件当用户在终端输入可执行文件名并按下回车键时,操作系统会通过解析文件头判断该文件是否为有效的ELF文件。
如果是有效的ELF 文件,操作系统会为该进程分配一块内存空间,并将ELF文件中的各个段加载到相应的内存地址上。
3. 解析程序入口操作系统会根据ELF文件中的程序入口地址(Entry Point)来确定程序的入口点。
程序入口地址通常位于.text段的起始位置。
操作系统将程序计数器(PC)设置为程序入口地址,从而开始执行程序。
4. 执行程序指令程序从程序入口地址开始执行,按照顺序执行.text段中的指令。
每条指令都会被解码和执行,直到程序结束或者遇到跳转指令。
5. 解析跳转指令在程序执行过程中,可能会遇到跳转指令(如条件跳转、无条件跳转、函数调用等)。
当遇到跳转指令时,操作系统会根据指令中的目标地址重新设置程序计数器,从而改变程序的执行流程。
6. 处理函数调用当程序执行到函数调用指令时,操作系统会将函数的返回地址和参数等信息保存到栈中,并跳转到函数的入口地址执行。
函数执行完毕后,操作系统会从栈中恢复返回地址,继续执行函数调用指令后面的指令。
7. 处理系统调用程序中可能会包含系统调用指令,用于请求操作系统提供各种服务。
当遇到系统调用指令时,操作系统会切换到内核态,执行相应的系统调用处理程序,并返回结果给用户程序。
了解在Linux下可执行文件格式
Linux下面,目标文件、共享对象文件、可执行文件都是使用ELF文件格式来存储的。
程序经过编译之后会输出目标文件,然后经过链接可以产生可执行文件或者共享对象文件。
linux下面使用的ELF文件和Windows操作系统使用的PE文件都是从Unix 系统的COFF文件格式演化来的。
我们先来了解一些基本的想法。
首先,最重要的思路是一个程序从人能读懂的格式转换为供操作系统执行的二进制格式之后,代码和数据是分开存放的,之所以这样设计有这么几个原因:
1、程序执行之后,代码和数据可以被映射到不同属性的虚拟内存中。
因为代码一般是只读的,而数据是可读可写的;
2、现代CPU有强大的缓存体系。
程序和代码分离可以提高程序的局部性,增加缓存命中的概率;
3、还有最重要的一个原因是当有多个程序副本在运行的时候,只读部分可以只在内存中保留一份,这样大大节省了内存。
在ELF的定义中,把他们分开存放的地方称为一个Section ,就是一个段。
一个ELF文件中重要的段包括:
.text 段:存储只读程序
.data 段:存储已经初始化的全局变量和静态变量
.bss 段:存储未初始化的全局变量和静态变量,因为这些变量的值为0,所以这个段在文件当中不占据空间
.rodata 段:存储只读数据,比如字符串常量
我们用一个例子来看一下ELF文件的格式到底是什么。
首先,在Linux下编写一个C程序:SimpleSecTIon.c
[cpp] view plain copy
int printf(const char *format, ... );。
linux读取文件默认编码格式Linux是一种开源的操作系统,广泛应用于服务器和嵌入式设备中。
在Linux中,读取文件的默认编码格式是UTF-8。
UTF-8是一种可变长度的编码方式,它可以表示世界上几乎所有的字符。
相比于其他编码方式,UTF-8具有以下优势:1. 兼容性强:UTF-8可以兼容ASCII编码,也就是说,ASCII编码的字符在UTF-8中可以直接表示,不需要进行转换。
这使得在Linux中读取ASCII编码的文件非常方便。
2. 多语言支持:UTF-8可以表示世界上几乎所有的语言字符,包括中文、日文、韩文等。
这使得在Linux中读取不同语言的文件时,不需要考虑编码转换的问题。
3. 空间效率高:UTF-8采用可变长度的编码方式,对于ASCII字符只需要一个字节表示,而对于其他字符则需要多个字节表示。
这使得在Linux中读取文件时,可以节省存储空间。
在Linux中,读取文件的默认编码格式是由系统的locale设置决定的。
locale是一种用于描述特定地区和语言环境的配置文件,它包含了字符集、日期格式、货币符号等信息。
可以通过以下命令查看当前系统的locale设置:```$ locale```输出结果中的LC_CTYPE字段即为当前系统的字符集设置。
如果LC_CTYPE字段的值为UTF-8,则表示系统的默认编码格式为UTF-8。
在Linux中,可以使用各种文本编辑器来读取文件。
无论是使用vi、nano还是gedit等编辑器,它们都会自动根据文件的编码格式来解析文件内容。
如果要读取其他编码格式的文件,可以使用iconv命令进行转换。
iconv是一个用于字符编码转换的工具,可以将文件从一种编码格式转换为另一种编码格式。
例如,要将一个GBK编码的文件转换为UTF-8编码,可以使用以下命令:```$ iconv -f gbk -t utf-8 input.txt > output.txt```上述命令将输入文件input.txt的编码格式从GBK转换为UTF-8,并将转换后的内容输出到output.txt文件中。
Linux下如何查找可执⾏⽂件Linux下的可执⾏⽂件Linux下如何查找可执⾏⽂件,作为⼀个Linux⼩菜刚刚有了这个问题,在windows中,可以通过后缀名判断是否是可执⾏⽂件,⽐如.exe,.bat等是可执⾏⽂件,但是在Linux下呢?Linux下不能简单根据⽂件后缀判断是否可执⾏。
linux下判断⼀个⽂件是否可执⾏,关键看是否有可执⾏权限,⽐如:在终端中输⼊:,会列出类似于下的列表:-rwxrwxr-x 1 bingyue bingyue 48141 Jul 17 02:50 redis-trib.rb*-rw-rw-r-- 1 bingyue bingyue 2163 Aug 5 23:34 release.cdrwxrwxr-x 2 bingyue bingyue 4096 Jul 22 20:03 Documents以下⾯输出为例,下划线区域说明了⽂件的权限,包括可读、可写、可执⾏等等。
10个字符确定不同⽤户能对⽂件⼲什么:第⼀个字符代表⽂件(-)、⽬录(d),链接(l)其余字符每3个⼀组(rwx),读(r)、写(w)、执⾏(x),分别说明⽂件所有者(User)、⽂件所有者所在的⽤户组其他⽤户(Group)、其他组⽤户(Others)对该⽂件拥有的权限。
第⼀组rwx:⽂件所有者的权限是读、写和执⾏第⼆组rwx:与⽂件所有者同⼀组的⽤户的权限是读、写和执⾏第三组r-x:不与⽂件所有者同组的其他⽤户的权限是读和执⾏,不能写另外有部分⽂件也可以通过后缀名判断,⽐如redhat中,凡是.rpm格式的都能在redhat中执⾏,debian中.deb格式的在debianlinux中能直接执⾏。
如何查找可执⾏⽂件使⽤ls -F|grep "*"Ubuntu下也可以使⽤ll | grep "*"ll不是linux下⼀个基本的命令,可以认为是ls -l的⼀个别名。
简述linux文件的类型Linux文件的类型在Linux系统中,文件是存储和组织数据的基本单位。
在Linux中,文件的类型可以通过文件的扩展名、文件的权限、文件的内容等多种方式来确定。
本文将从不同的角度来描述Linux文件的类型。
一、常见的文件类型1. 普通文件:普通文件是最常见的文件类型,用于存储文本、图像、音频等数据。
普通文件可以分为纯文本文件和二进制文件两种类型。
纯文本文件是由可读的字符组成的文件,可以使用文本编辑器打开查看和编辑。
而二进制文件则包含了非文本的数据,无法直接阅读,通常需要特定的软件或工具来解析和处理。
2. 目录文件:目录文件是用于组织和管理其他文件和目录的文件。
在Linux系统中,目录文件类似于文件夹,可以包含其他文件和目录。
用户可以使用命令来创建、删除、复制、移动和重命名目录文件。
3. 设备文件:设备文件用于与硬件设备进行通信和交互。
在Linux 系统中,设备文件被视为特殊文件,可以访问和操作硬件设备,例如键盘、鼠标、打印机等。
设备文件可以分为字符设备文件和块设备文件两种类型。
字符设备文件以字符为单位进行读写操作,而块设备文件以块为单位进行读写操作。
4. 符号链接文件:符号链接文件是指向其他文件或目录的文件,类似于快捷方式。
符号链接文件可以跨文件系统,可以方便地引用其他位置的文件或目录。
在Linux系统中,可以使用ln命令创建符号链接文件。
二、根据文件权限来确定文件类型在Linux系统中,每个文件都有相应的权限,用于控制对文件的访问和操作。
根据文件的权限,可以判断文件的类型。
1. 可执行文件:可执行文件具有执行权限,可以直接运行。
通常,可执行文件是二进制文件,包含了可执行的机器代码。
2. 可读文件:可读文件具有读取权限,可以被打开和读取。
大多数普通文件都属于可读文件。
3. 可写文件:可写文件具有写入权限,可以被修改和编辑。
用户可以向可写文件中写入数据。
4. 可执行和可读文件:拥有执行和读取权限的文件既可以运行,又可以被读取。
linux下的三种可执⾏⽂件格式的⽐较linux下的三种可执⾏⽂件格式的⽐较本⽂讨论了 UNIX/LINUX 平台下三种主要的可执⾏⽂件格式:a.out(assembler and link editor output 汇编器和链接编辑器的输出)、COFF(Common Object File Format 通⽤对象⽂件格式)、ELF(Executable and Linking Format 可执⾏和链接格式)。
⾸先是对可执⾏⽂件格式的⼀个综述,并通过描述 ELF ⽂件加载过程以揭⽰可执⾏⽂件内容与加载运⾏操作之间的关系。
随后依此讨论了此三种⽂件格式,并着重讨论 ELF ⽂件的动态连接机制,其间也穿插了对各种⽂件格式优缺点的评价。
最后对三种可执⾏⽂件格式有⼀个简单总结,并提出作者对可⽂件格式评价的⼀些感想。
可执⾏⽂件格式综述相对于其它⽂件类型,可执⾏⽂件可能是⼀个操作系统中最重要的⽂件类型,因为它们是完成操作的真正执⾏者。
可执⾏⽂件的⼤⼩、运⾏速度、资源占⽤情况以及可扩展性、可移植性等与⽂件格式的定义和⽂件加载过程紧密相关。
研究可执⾏⽂件的格式对编写⾼性能程序和⼀些⿊客技术的运⽤都是⾮常有意义的。
不管何种可执⾏⽂件格式,⼀些基本的要素是必须的,显⽽易见的,⽂件中应包含代码和数据。
因为⽂件可能引⽤外部⽂件定义的符号(变量和函数),因此重定位信息和符号信息也是需要的。
⼀些辅助信息是可选的,如调试信息、硬件信息等。
基本上任意⼀种可执⾏⽂件格式都是按区间保存上述信息,称为段(Segment)或节(Section)。
不同的⽂件格式中段和节的含义可能有细微区别,但根据上下⽂关系可以很清楚的理解,这不是关键问题。
最后,可执⾏⽂件通常都有⼀个⽂件头部以描述本⽂件的总体结构。
相对可执⾏⽂件有三个重要的概念:编译(compile)、连接(link,也可称为链接、联接)、加载(load)。
源程序⽂件被编译成⽬标⽂件,多个⽬标⽂件被连接成⼀个最终的可执⾏⽂件,可执⾏⽂件被加载到内存中运⾏。
linux,windows可执⾏⽂件(ELF、PE)现在PC平台流⾏的可执⾏⽂件格式(Executable)主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format),它们都是COFF(Common file format)格式的变种。
不光是可执⾏⽂件(Windows的.exe和Linux下的ELF可执⾏⽂件)按照可执⾏⽂件格式存储。
动态链接库(DLL,Dynamic Linking Library)(Windows的.dll和Linux的.so)及静态链接库(Static Linking Library)(Windows的.lib和Linux的.a)⽂件都按照可执⾏⽂件格式存储。
它们在Windows下都按照PE-COFF格式存储,Linux下按照ELF格式存储。
什么⼜是COFF格式呢?COFF是由Unix System V Release 3⾸先提出并且使⽤的格式规范,后来微软公司基于COFF格式,制定了PE格式标准,并将其⽤于当时的Windows NT系统。
System V Release 4在COFF的基础上引⼊了ELF格式,⽬前流⾏的Linux系统也以ELF作为基本可执⾏⽂件格式。
这也就是为什么⽬前PE和ELF如此相似的主要原因,因为它们都是源于同⼀种可执⾏⽂件格式COFF。
Unix最早的可执⾏⽂件格式为a.out格式,它的设计⾮常地简单,以⾄于后来共享库这个概念出现的时候,a.out格式就变得捉襟见肘了。
于是⼈们设计了COFF格式来解决这些问题,这个设计⾮常通⽤,以⾄于COFF的继承者到⽬前还在被⼴泛地使⽤。
COFF的主要贡献是在⽬标⽂件⾥⾯引⼊了“段”的机制,不同的⽬标⽂件可以拥有不同数量及不同类型的“段”。
另外,它还定义了调试数据格式。
⽬标⽂件有三种类型:1. 可重定位⽂件(Relocatable File)包含适合于与其他⽬标⽂件链接来创建可执⾏⽂件或者共享⽬标⽂件的代码和数据。
Linux⽂件系统--简述⼏种⽂件类型 Linux 中⼀切皆为⽂件,⽂件类型也有多种,使⽤ ls -l 命令可以查看⽂件的属性,所显⽰结果的第⼀列的第⼀个字符⽤来表明该⽂件的⽂件类型,如下:1、普通⽂件 使⽤ ls -l 命令后,第⼀列第⼀个字符为 "-" 的⽂件为普通⽂件,如上图所⽰,普通⽂件⼀般为灰⾊字体,绿⾊字体的是可执⾏⽂件,红⾊字体的是压缩⽂件。
⽂件的权限: 以普通⽂件为例,使⽤ ls -l 命令,可以看到结果的第⼀列是 -rwxrwxrwx 的形式,其中第⼀个字符 "-" 表⽰这个⽂件为普通⽂件,它也可以是其他的字符,不同的字符代表不同类型的⽂件。
其后的⼀串字符表明了该⽂件的权限,其中:1)r 表明该⽂件具有可读权限,若该位置为 "-" ,则表明⽂件不可读;2)w 表明该⽂件具有写权限,若该位置为 "-" ,则表明⽂件不可写;3)x 表明该⽂件具有可执⾏权限,若该位置为 "-" ,则表明⽂件不具有可执⾏权限;4)第⼀个 rwx 表⽰该⽂件的所有者对该⽂件的权限;第⼆个 rwx 表⽰该⽂件所属组对该⽂件的权限;第三个 rwx 表⽰其他⽤户对该⽂件的权限。
创建⼀个普通⽂件: 可以使⽤ touch 命令来创建⼀个⽂件:touch newfile删除⼀个普通⽂件: 可以使⽤ rm 命令来删除⼀个⽂件:rm newfile2、⽬录⽂件 Linux 中的⽬录也是⽂件,⽬录⽂件中保存着该⽬录下其他⽂件的 inode 号和⽂件名等信息,⽬录⽂件中的每个数据项都是指向某个⽂件 inode 号的链接,删除⽂件名就等于删除与之对应的链接。
⽬录⽂件的字体颜⾊是蓝⾊,使⽤ ls -l 命令查看,第⼀个字符为"d"(directory)。
⽬录⽂件的权限:1)r 表明该⽬录⽂件具有可读权限,即可以使⽤ ls 命令查看该⽬录的存储情况;2)w 表明该⽬录⽂件具有写权限,即可以往该⽬录下添加、修改、删除⽂件;3)x 表明该⽬录⽂件具有可执⾏⽂件,即可以使⽤ cd 命令进⼊到该⽬录下。
可执行目标文件详解可执行目标文件是计算机程序经过编译后生成的文件,在操作系统中直接可以执行的文件格式。
可执行目标文件是由机器指令、数据和符号表组成的。
机器指令是代码段中的指令,数据是数据段中的数据。
符号表中记录了程序中的各个符号的地址信息,用于链接时进行符号解析。
可执行目标文件的格式有多种,常见的有 ELF、PE、Mach-O 等。
这些不同的可执行目标文件格式在一些方面有所不同,但是它们都包含以下几个部分:1. 标头:包含了一些基本属性,如程序入口地址、段的数量、各段的偏移和大小等等。
2. 代码段:里面存储了程序的机器指令,是可执行程序的核心部分。
3. 数据段:里面存储了程序需要的数据,如字符串、数组、结构等等。
4. 符号表:记录程序中的符号,包括函数名、变量名称等等,用于链接时进行符号的解析。
5. 重定位表:记录程序中需要重定位的地址信息,是实现程序重定位的重要数据。
6. 调试信息:包含了程序的调试信息,如变量的值、函数的调用栈等等。
在 Linux 下,可执行目标文件的格式一般是 ELF (Executable and Linkable Format)。
ELF 文件的结构相对简单,易于使用,常用的工具有 objdump、nm、readelf 等等。
这些工具可以帮助开发者查看和调试可执行目标文件,对于检测程序中可能存在的安全漏洞、调试程序等等都是非常有用的工具。
在 Windows 下,可执行目标文件的格式一般是 PE (Portable Executable)格式。
PE 文件的结构相对复杂,但是它支持 Windows 下的多种可执行文件(如 .dll 文件等),是 Windows 下的主要可执行目标文件格式。
在 macOS 下,可执行目标文件的格式一般是 Mach-O (Mach object)格式。
Mach-O 文件的结构与 ELF 不同,但是它支持 macOS 下的各种可执行文件(如 .dylib 文件、.app 文件等),是 macOS 下的主要可执行目标文件格式。
Linux可执行文件格式•Elf “也就是Executable and Linking Format.”•Elf 起源于Unix,经改进应用于FreeBSD和Linux等现有类Unix操作系统。
•微软的PE格式也学习了ELF格式的优点。
•ELF文档服务于在不同的操作系统上目标文件的创建或者执行文件的开发。
它分以下三个部分:•“”目标文件描述了ELF目标文件格式三种主要的类型。
•“”程序装载和动态连接描述了目标文件的信息和系统在创建运行时程序的行为。
•“C ”语言库列出了所有包含在libsys中的符号、标准的ANSIC和libc的运行程序,还有libc运行程序所需的全局的数据符号。
三种主要类型:•一个可重定位文件(relocatable file)保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享文件。
•一个可执行文件(executable file)保存着一个用来执行的程序,该文件指出了exec(BA_OS)如何来创建程序进程映象。
•一个共享目标文件(shared object file)保存着代码和合适的数据,用来被下面的两个链接器链接。
第一个是链接编辑器,可以和其他的重定位和共享目标文件来创建另一个目标文件。
第二个是动态链接器,联合一个可执行文件和其他的共享目标文件来创建一个进程映象。
ELF头•#define EI_NIDENT 16• typedef struct {• unsigned char e_ident[EI_NIDENT];• Elf32_Half e_type;• Elf32_Half e_machine;• Elf32_Word e_version;• Elf32_Addr e_entry;• Elf32_Off e_phoff;• Elf32_Off e_shoff;• Elf32_Word e_flags;• Elf32_Half e_ehsize;• Elf32_Half e_phentsize;• Elf32_Half e_phnum;• Elf32_Half e_shentsize;• Elf32_Half e_shnum;• Elf32_Half e_shstrndx;•} Elf32_Ehdr;节•一个目标文件的节头表可以让我们定位所有的节。
节头表是一个Elf32_Shdr结构的数组。
一个节头表的索引是这个数组的下标。
•ELF头结构中的e_shoff成员给出了节头表的偏移量(从文件开始计数)。
•e_shnum告诉我们节头表中包含了多少个表项;•e_shentsize 给出了每个表项的长度。
某些节头表索引是保留的,这些索引在目标文件中没有与之对应的节。
•typedef struct {• Elf32_Word sh_name;• Elf32_Word sh_type;• Elf32_Word sh_flags;• Elf32_Addr sh_addr;• Elf32_Off sh_offset;• Elf32_Word sh_size;• Elf32_Word sh_link;• Elf32_Word sh_info;• Elf32_Word sh_addralign;• Elf32_Word sh_entsize;•} Elf32_Shdr;字符串表•字符串表节(String table sections)保存着以NULL终止的一系列字符,一般我们称为字符串。
目标文件使用这些字符串来表示符号和节名。
一个字符串的引用是一个字符串表节的索引。
字符表•一个目标文件的符号表(symbol table)保存了定位和重定位程序的定义和引用的信息。
一个符号表索引是相应的下标。
0表项特指了该表的第一个表项,就象未定义的符号索引一样。
重定位(Relocation)•重定位(Relocation)是链接符号引用和符号定义的过程。
比如,当一个程序调用一个函数的时候,相关的调用必须在执行时把控制传送到正确的目标地址。
换句话说重定位文件应当包含如何修改他们的节内容的信息,从而允许可执行文件或共享目标文件为一个进程的程序映像保存正确的信息。
程序头•一个可执行的或共享的目标文件的程序头表是一个结构数组,每一个结构描述一个段或其他系统准备执行该程序所需要的信息。
一个目标文件段包含一个或多个部分“”(就象下面的段目录所描述的那样)。
程序头仅仅对于可执行或共享的目标文件有意义。
•typedef struct {• Elf32_Word p_type;• Elf32_Off p_offset;• Elf32_Addr p_vaddr;• Elf32_Addr p_paddr;• Elf32_Word p_filesz;• Elf32_Word p_memsz;• Elf32_Word p_flags;• Elf32_Word p_align;• } Elf32_Phdr;段内容实例Text Segment Data Segment程序载入当创建或增加一个进程映像的时候,系统在逻辑上将拷贝一个文件的段到一个虚拟的内存段动态链接•程序解释器(Progam Interpreter)–“”系统为解释器编写了一个内存映像,而不是使用原始的可执行文件的段映像。
此时该解释器就负责接收来自系统的控制并且为应用程序提供一个环境变量。
•动态链接器(Dynamic Linker)–当使用动态链接方式建立一个可执行文件时,链接器把一个PT_INTERP类型的元素加到可执行文件中,告诉系统像该系统的解释器一样调用动态链接器。
•动态节(Dynamic Section)–如果一个目标文件参与动态的链接,它的程序头表将有一个类型为PT_DYNAMIC“”的元素。
该段包含了.dynamic节。
一个_DYNAMIC特别的符号,表明了该节包含了以下结构的一个数组。
•共享目标的依赖关系(Shared Object Dependencies)–当链接器处理一个文档库时,它取出库中成员并且把它们拷贝到一个输出的目标文件中。
当运行时没有包括一个动态链接器的时候,那些静态的链接服务是可用的。
共享目标也提供服务,动态链接器必须把正确的共享目标文件链接到要执行的进程映象中。
因此,可执行文件和共享的目标文件之间存在着明确的依赖性。
•全局偏移量表(Global Offset Table,GOT)–全局偏移量表在私有数据中保存着绝对地址,所以在不影响位置无关性和程序代码段共享能力的情况下应该使地址是可用的。
一个程序参考它的GOT(使用位置无关的地址)并提取绝对的地址,所以与重定向无关的位置定位到绝对的位置。
•PLT过程连接表(Procedure Linkage Table)–正如GOT重定位把位置无关的地址计算成绝对地址一样,PLT过程链接表重定向那些与位置无关的函数调用到绝对的地址。
简单的C程序及其ELF格式信息int xx, yy;main(){xx = 1;yy = 2;printf ("xx %d yy %d\n", xx, yy);}ELF头信息root# objdump -f a.outa.out: file format elf32-i386architecture: i386, flags 0x00000112:EXEC_P, HAS_SYMS, D_PAGEDstart address 0x080483dc程序头Program Header:PHDR off 0x00000034 vaddr 0x08048034 paddr 0x08048034 align 2**2filesz 0x000000c0 memsz 0x000000c0 flags r-xINTERP off 0x000000f4 vaddr 0x080480f4 paddr 0x080480f4 align 2**0filesz 0x00000019 memsz 0x00000019 flags r--LOAD off 0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12 filesz 0x00000564 memsz 0x00000564 flags r-xLOAD off 0x00000564 vaddr 0x08049564 paddr 0x08049564 align 2**12 filesz 0x000000a8 memsz 0x000000cc flags rw-DYNAMIC off 0x0000059c vaddr 0x0804959c paddr 0x0804959c align 2**2 filesz 0x00000070 memsz 0x00000070 flags rw-NOTE off 0x00000110 vaddr 0x08048110 paddr 0x08048110 align 2**2filesz 0x00000018 memsz 0x00000018 flags r--Dynamic节Dynamic Section:NEEDED libc.so.4INIT 0x8048390FINI 0x8048550HASH 0x8048128STRTAB 0x80482c8SYMTAB 0x80481b8STRSZ 0xadSYMENT 0x10DEBUG 0x0PLTGOT 0x8049584PLTRELSZ 0x18PLTREL 0x11JMPREL 0x8048378节头表Sections:Idx Name Size VMA LMA File off Algn0 .interp 00000019 080480f4 080480f4 000000f4 2**0CONTENTS, ALLOC, LOAD, READONLY, DA TA1 .note.ABI-tag 00000018 08048110 08048110 00000110 2**2CONTENTS, ALLOC, LOAD, READONLY, DA TA2 .hash 00000090 08048128 08048128 00000128 2**2CONTENTS, ALLOC, LOAD, READONLY, DA TA3 .dynsym 00000110 080481b8 080481b8 000001b8 2**2CONTENTS, ALLOC, LOAD, READONLY, DA TA4 .dynstr 000000ad 080482c8 080482c8 000002c8 2**0CONTENTS, ALLOC, LOAD, READONLY, DA TA5 .rel.plt 00000018 08048378 08048378 00000378 2**2CONTENTS, ALLOC, LOAD, READONLY, DA TA6 .init 0000000b 08048390 08048390 00000390 2**2CONTENTS, ALLOC, LOAD, READONLY, CODE7 .plt 00000040 0804839c 0804839c 0000039c 2**2CONTENTS, ALLOC, LOAD, READONLY, CODE8 .text 00000174 080483dc 080483dc 000003dc 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE9 .fini 00000006 08048550 08048550 00000550 2**2CONTENTS, ALLOC, LOAD, READONLY, CODE10 .rodata 0000000e 08048556 08048556 00000556 2**0CONTENTS, ALLOC, LOAD, READONLY, DA TA11 .data 0000000c 08049564 08049564 00000564 2**2CONTENTS, ALLOC, LOAD, DA TA12 .eh_frame 00000004 08049570 08049570 00000570 2**2CONTENTS, ALLOC, LOAD, DA TA13 .ctors 00000008 08049574 08049574 00000574 2**2CONTENTS, ALLOC, LOAD, DA TA14 .dtors 00000008 0804957c 0804957c 0000057c 2**2CONTENTS, ALLOC, LOAD, DA TA15 .got 00000018 08049584 08049584 00000584 2**2CONTENTS, ALLOC, LOAD, DA TA16 .dynamic 00000070 0804959c 0804959c 0000059c 2**2CONTENTS, ALLOC, LOAD, DA TA17 .bss 00000024 0804960c 0804960c 0000060c 2**2ALLOC18 .stab 000001bc 00000000 00000000 0000060c 2**2CONTENTS, READONLY, DEBUGGING19 .stabstr 00000388 00000000 00000000 000007c8 2**0CONTENTS, READONLY, DEBUGGING20 .comment 000000c8 00000000 00000000 00000b50 2**0符号表SYMBOL TABLE:080480f4 l d .interp 0000000008048110 l d .note.ABI-tag 0000000008048128 l d .hash 00000000080481b8 l d .dynsym 00000000080482c8 l d .dynstr 0000000008048378 l d .rel.plt 0000000008048390 l d .init 000000000804839c l d .plt 00000000080483dc l d .text 0000000008048550 l d .fini 0000000008048556 l d .rodata 0000000008049564 l d .data 0000000008049570 l d .eh_frame 0000000008049574 l d .ctors 000000000804957c l d .dtors 0000000008049584 l d .got 000000000804959c l d .dynamic 00000000•0804960c l d .bss 00000000•00000000 l d .stab 00000000•00000000 l d .stabstr 00000000•00000000 l d .comment 00000000•00000000 l d .note 00000000•00000000 l d *ABS* 00000000•00000000 l d *ABS* 00000000•00000000 l d *ABS* 00000000•00000000 l df *ABS* 00000000 crtstuff.c•08048460 l .text 00000000 gcc2_compiled.•08049568 l O .data 00000000 p.3•0804957c l O .dtors 00000000 __DTOR_LIST__•0804956c l O .data 00000000 completed.4•08048460 l F .text 00000000 __do_global_dtors_aux•08049570 l O .eh_frame 00000000 __EH_FRAME_BEGIN__ 080484b4 l F .text 00000000 fini_dummy0804960c l O .bss 00000018 object.11080484bc l F .text 00000000 frame_dummy080484e0 l F .text 00000000 init_dummy08049570 l O .data 00000000 force_to_data08049574 l O .ctors 00000000 __CTOR_LIST__00000000 l df *ABS* 00000000 crtstuff.c08048520 l .text 00000000 gcc2_compiled.08048520 l F .text 00000000 __do_global_ctors_aux08049578 l O .ctors 00000000 __CTOR_END__08048548 l F .text 00000000 init_dummy08049570 l O .data 00000000 force_to_data08049580 l O .dtors 00000000 __DTOR_END__08049570 l O .eh_frame 00000000 __FRAME_END__00000000 l df *ABS* 00000000 p10.c080483ac F *UND* 00000031 printf0804959c g O *ABS* 00000000 _DYNAMIC08048550 g O *ABS* 00000000 _etext08048390 g F .init 00000000 _init08049624 g O .bss 00000004 environ00000000 w *UND* 00000000 __deregister_frame_info08049630 g O *ABS* 00000000 end08049628 g O .bss 00000004 xx08049564 g O .data 00000004 __progname080483dc g F .text 00000083 _start0804960c g O *ABS* 00000000 __bss_start080484e8 g F .text 00000038 main08048550 g F .fini 00000000 _fini0804962c g O .bss 00000004 yy080483bc F *UND* 00000070 atexit0804960c g O *ABS* 00000000 _edata08049584 g O *ABS* 00000000 _GLOBAL_OFFSET_TABLE_ 08049630 g O *ABS* 00000000 _end080483cc F *UND* 0000005b exit00000000 w *UND* 00000000 __register_frame_info动态符号表DYNAMIC SYMBOL TABLE:080483ac DF *UND* 00000031 printf0804959c g DO *ABS* 00000000 _DYNAMIC08048550 g DO *ABS* 00000000 _etext08048390 g DF .init 00000000 _init08049624 g DO .bss 00000004 environ00000000 w D *UND* 00000000 __deregister_frame_info 08049630 g DO *ABS* 00000000 end08049564 g DO .data 00000004 __progname0804960c g DO *ABS* 00000000 __bss_start08048550 g DF .fini 00000000 _fini080483bc DF *UND* 00000070 atexit0804960c g DO *ABS* 00000000 _edata08049584 g DO *ABS* 00000000 _GLOBAL_OFFSET_TABLE_ 08049630 g DO *ABS* 00000000 _end080483cc DF *UND* 0000005b exit00000000 w D *UND* 00000000 __register_frame_infoDebugging Informationint main (){ /* 0x80484e8 */} /* 0x80484e8 */int main (){ /* 0x80484e8 *//* file /usr/home/shieyuan/test/p10.c line 3 addr 0x80484ee *//* file /usr/home/shieyuan/test/p10.c line 5 addr 0x80484ee *//* file /usr/home/shieyuan/test/p10.c line 6 addr 0x80484f8 *//* file /usr/home/shieyuan/test/p10.c line 7 addr 0x8048502 *//* file /usr/home/shieyuan/test/p10.c line 8 addr 0x804851e *//* file /usr/home/shieyuan/test/p10.c line 8 addr 0x804851e */ } /* 0x8048520 */int xx /* 0x8049628 */;int yy /* 0x804962c */;动态重定位表•DYNAMIC RELOCATION RECORDS•OFFSET TYPE V ALUE•08049590 R_386_JUMP_SLOT printf•08049594 R_386_JUMP_SLOT atexit•08049598 R_386_JUMP_SLOT exit。