点击“嵌入式大杂烩”在顶部,然后选择“顶部公共帐户”第一次查看嵌入的注释!几个常见的ELF文件在Linux下,我们在gcc编译后生成的可执行文件是ELF文件:ELF是一种文件,而不是带有特定后缀的文件。 ELF(可执行和可链接格式,可执行和可链接格式)文件格式,在Linux下主要有三种文件类型:可执行文件(.out):可执行文件,包含代码和数据,是可以直接运行的程序。代码和数据具有固定的地址(或相对于基地址的偏移量),并且系统可以基于这些地址信息将程序加载到内存中以执行。可重定位文件(.o文件):可重定位文件包含基本代码和数据,但是其代码和数据未指定绝对地址,因此适合与其他目标文件链接以创建可执行文件或共享目标文件。共享库文件(.so):共享库文件,也称为动态库文件,包含代码和数据。这些数据由链接器(ld)和运行时动态链接器(ld.so.l,libc)链接。 .so.l,ld-linux.so.l)。 ELF格式的结构大致如下:(图片来源:百度百科)ELF文件由4部分组成,即ELF头,程序头表,Section和Section头表)。实际上,文件可能不包含所有内容,并且它们的位置可能未如图所示。只有ELF标头的位置是固定的,其余部分的位置和大小由ELF标头中的值确定。决定。使用readelf工具在Linux下,我们可以使用readelf命令工具查看ELF格式文件的某些信息。让我们首先准备一个与动态链接有关的演示,并带我们之前共享的文章:静态链接和动态链接补充(Linux)演示,以演示:文件1(main.c):#include& nbsp;“ test.h” int& nbsp; main(void){& nbsp; print_hello();& nbsp; return& nbsp; 0;}文件2(test.c):#include& nbsp;“ test.h” void ; print_hello(void){& nbsp; printf(“ hello& nbsp; world
");}文件3(test.h):#ifndef& nbsp; __ TEST_H#define& nbsp; __ TEST_H#include& nbsp;< stdio.h& gt; void& nbsp; print_hello(void);# endif执行相关命令以生成相关文件:.out文件。 o文件,.so文件。例如:在下面,我们使用readelf命令查看这三种文件的某些信息。 readelf命令的格式为:readelf& lt; option& gt;& nbsp; elf-file查看可执行文件的标头信息:查看可执行文件的标头信息,我们发现标题信息中的类型原来是共享库文件,并且我们正在查看可执行文件,这是矛盾的吗?检查了一些信息:https://blog.csdn.net/cclethe/article/details/83387685发现:gcc编译了默认的--enable-default-pie选项:Position-Independent-Executable是Binutils,glibc和gcc,可以用来在共享库和通常的可执行代码之间创建代码-可以像共享库一样重新分配地址的程序,这种程序必须连接到Scrt1.o。标准可执行程序需要一个固定地址,并且只有在将该程序加载到该地址后,才能正确执行该程序。 PIE使得程序可以像共享库一样被加载到主存储器中的任何位置,这要求将程序编译为与位置无关并作为ELF共享对象进行链接。引入PIE的原因是让程序可以将其加载到随机地址中。通常,内核在固定地址运行。如果可以切换到与位置无关的位置,则攻击者将很难使用系统中的可执行代码来进行攻击。与缓冲区溢出类似,将不会实施攻击。而且,此安全性改进的成本非常小。换句话说,派是保护我们的可执行程序的一种手段。在这里我们只是在做实验,我们可以先添加-no-pie参数。关闭Pie:如您所见,类型最终匹配。 ELF头信息还包含入口点地址(入口地址),程序头的开始(程序头的开始),节头的开始(节头的开始字节)和其他信息。查看可重定位文件的头信息:查看共享目标文件的头信息:类似地,readelf可以与其他参数一起使用以查看ELF文件的其他信息:objdump工具的使用objdump工具用于显示以下信息:一个或多个目标文件。 objdump命令的格式:objdump& lt; option(s)& gt; & lt;文件& gt;可执行文件,可重定位文件和共享目标文件都是目标文件,因此您可以使用此命令查看一些信息。观看