了解在Linux下可执行文件格式
- 格式:doc
- 大小:29.50 KB
- 文档页数:5
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 .o,.a,.so文件解析来源: ChinaUnix博客日期:2007.04.18 08:18(共有0条评论) 我要评论/yanyulou类型是不依赖于其后缀名的,但一般来讲:,相当于windows中的.obj文件是shared object,用于动态连接的,和dll差不多好多个.o合在一起,用于静态连接自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息。
可以用如下命令查看*.la文件的格式 $file *.la CII English text来查看其内容。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@和.o库文件:host perl_c2]$ pwdperl_c2host perl_c2]$ cat mylib.c"success call from perl to c library\n");host perl_c2]$ cat mylib.hello();host perl_c2]$ gcc -c mylib.chost perl_c2]$ dirb.h mylib.ohost perl_c2]$ ar -r mylib.a mylib.omylib.ahost perl_c2]$ dirb.c mylib.h mylib.o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1111111111111111111111111111111111111111111111111111111111111111111111111111111 so的编译与使用- -linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。
译例子来介绍如何生成一个动态库。
这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,个动态库:libtest.so。
linux基本命令格式一、Linux基本命令格式在Linux系统中,命令是用户与操作系统进行交互的主要方式。
了解和掌握Linux基本命令格式,对于日常的系统管理和操作是非常重要的。
本文将介绍Linux基本命令的格式,以帮助读者更好地理解和使用Linux系统。
二、命令的基本格式在Linux中,命令的基本格式为:命令 [选项] [参数]。
其中,命令是要执行的操作,选项是可选的,用于修改命令的行为,参数是命令的操作对象。
1. 命令命令是Linux系统中的操作指令,用于执行特定的功能。
例如,ls 命令用于列出当前目录下的文件和文件夹,cd命令用于切换当前所在的目录。
2. 选项选项是命令的修饰符,用于修改命令的行为。
选项通常以"-"或"--"开头,可以单个使用,也可以组合使用。
例如,ls命令的"-l"选项用于以长格式显示文件信息,"-a"选项用于显示所有文件,包括隐藏文件。
3. 参数参数是命令的操作对象,用于指定命令要操作的文件、目录或其他对象。
参数可以是单个的,也可以是多个的。
例如,cp命令用于复制文件,其参数包括源文件和目标文件。
三、示例为了更好地理解和运用Linux基本命令格式,我们来看一些实际的例子。
1. ls命令ls命令用于列出当前目录下的文件和文件夹。
我们可以使用不同的选项和参数来修改和定制ls命令的输出。
例如,使用"-l"选项可以以长格式显示文件信息,使用"-a"选项可以显示所有文件。
2. cd命令cd命令用于切换当前所在的目录。
我们可以使用不同的参数来切换到不同的目录。
例如,使用"cd /"命令可以切换到根目录,使用"cd ~"命令可以切换到当前用户的主目录。
3. mkdir命令mkdir命令用于创建新的目录。
我们可以使用不同的选项和参数来指定新目录的名称和路径。
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使用标准的目录结构,在安装的时候,安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式,并指定了每个目录的作用和其中的文件类型。
/根目录┃┏━━┳━━━┳━━━┳━━━╋━━━┳━━━┳━━━┳━━━┓┃┃┃┃┃┃┃┃┃bin home dev etc lib sbin tmp usr var┃┃┏━┻━┓┏━━┳━━┳━━┳━┻━┳━━┓┃┃┃┃┃┃┃┃rc.d cron.d X11R6 src lib local man bin┃┏━━━┳━━┳━┻━┳━━━┓┃┃┃┃┃init.d rc0.d rc1.d rc2.d …… linux bin lib srcLinux采用的是树型结构。
最上层是根目录,其他的所有目录都是从根目录出发而生成的。
微软的DOS和windows也是采用树型结构,但是在DOS和windows中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构,他们之间的关系是并列的。
但是在linux中,无论操作系统管理几个磁盘分区,这样的目录树只有一个。
从结构上讲,各个磁盘分区上的树型目录不一定是并列的。
如果这样讲不好理解的话,我来举个例子:有一块硬盘,分成了4个分区,分别是/;/boot;/usr和windows下的fat 对于/和/boot或者/和/usr,它们是从属关系;对于/boot和/usr,它们是并列关系。
如果我把windows下的fat分区挂载到/mnt/winc下,(挂载??哦,别急,呵呵,一会就讲,一会就讲。
)那么对于/mnt/winc和/usr或/mnt/winc和/boot 来说,它们是从属于目录树上没有任何关系的两个分支。
因为linux是一个多用户系统,制定一个固定的目录规划有助于对系统文件和不同的用户文件进行统一管理。
elf函数ELF是英文Executable and Linkable Format的缩写,即可执行和可链接格式。
它是一种通用的二进制文件格式,常用于Linux和UNIX类操作系统以及其他一些嵌入式系统中。
对于Linux来说,ELF格式的可执行文件是Linux系统下常见的一种可执行文件格式。
ELF文件由多个节(Section)组成。
每个节都有一个唯一的名称,用来描述程序中的一种特定类型的数据。
主要的节类型包括.text、.data、.bss以及.symtab等。
每种节类型都有自己的作用和特定的内容。
.text节是可执行文件中最重要的节,它包含了程序的代码。
在Linux系统中,函数的执行是由.text节中的代码驱动的。
.data节用于存储一些静态的全局变量,.bss节则用于存储一些未初始化的全局变量。
.symtab节是符号表,用于记录程序中的所有符号,包括函数和变量等等。
在ELF文件中,函数的定义和调用是通过符号表来实现的。
符号表中记录了所有的符号信息,包括符号名称、符号类型、符号值等等。
函数被定义时,在符号表中会被记录一个符号类型为函数的符号。
而函数被调用时,程序会在符号表中查找该函数的符号信息,并跳转到该函数的代码地址开始执行。
在ELF文件中,具体的函数实现是由函数的代码段来实现的。
函数的执行流程是先把函数的参数压入栈中,然后通过调用指令跳转到函数代码段的入口处开始执行。
在函数执行过程中,栈用于存储函数的局部变量、临时变量以及一些返回值等等。
函数的返回是通过返回指令来实现的。
在函数执行完成后,程序会使用返回指令返回到函数调用点的下一条指令处。
如果函数有返回值,那么返回值也会存储在寄存器或者栈中,并在返回时传递给函数调用点。
ELF文件不仅可以包含可执行代码,还可以包含动态链接库和静态链接库。
动态链接库在程序运行时才会被加载,而静态链接库是在编译时被链接到程序中的。
使用静态链接库可以使程序的可执行文件更小,但动态链接库可以使多个程序共享库中的代码,从而减少程序运行时的内存占用。
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中的⽂件和⽬录结构详解 对于每⼀个Linux学习者来说,了解Linux⽂件系统的⽬录结构,是学好Linux的⾄关重要的⼀步.,深⼊了解linux⽂件⽬录结构的标准和每个⽬录的详细功能,对于我们⽤好linux系统只管重要,下⾯我们就开始了解⼀下linux⽬录结构的相关知识。
当在使⽤Linux的时候,如果您通过ls –l / 就会发现,在/下包涵很多的⽬录,⽐如etc、usr、var、bin ... ... 等⽬录,⽽在这些⽬录中,我们进去看看,发现也有很多的⽬录或⽂件。
⽂件系统在Linux下看上去就象树形结构,所以我们可以把⽂件系统的结构形象的称为树形结构。
⽂件系统的是⽤来组织和排列⽂件存取的,所以它是可见的,在Linux中,我们可以通过ls等⼯具来查看其结构,在Linux系统中,我们见到的都是树形结构;⽐如操作系统安装在⼀个⽂件系统中,它表现为由/ 起始的树形结构。
linux⽂件系统的最顶端是/,我们称/为Linux的root,也就是 Linux操作系统的⽂件系统。
Linux的⽂件系统的⼊⼝就是/,所有的⽬录、⽂件、设备都在/之下,/就是Linux⽂件系统的组织者,也是最上级的领导者。
由于linux是开放源代码,各⼤公司和团体根据linux的核⼼代码做各⾃的操作,编程。
这样就造成在根下的⽬录的不同。
这样就造成个⼈不能使⽤他⼈的linux系统的PC。
因为你根本不知道⼀些基本的配置,⽂件在哪⾥。
这就造成了混乱。
这就是FHS(Filesystem Hierarchy Standard )机构诞⽣的原因。
该机构是linux爱好者⾃发的组成的⼀个团体,主要是是对linux做⼀些基本的要求,不⾄于是操作者换⼀台主机就成了linux的‘⽂盲’。
事实上,FHS是根据过去的经验⼀直再持续的改版的,FHS依据⽂件系统使⽤的频繁与否与是否允许使⽤者随意更动,⽽将⽬录定义成为四种交互作⽤的形态,⽤表格来说有点像底下这样:可分享的(shareable)不可分享的(unshareable)不变的(static)/usr (软件放置处)/etc (配置⽂件)/opt (第三⽅协⼒软件)/boot (开机与核⼼档)可变动的(variable)/var/mail (使⽤者邮件信箱)/var/run (程序相关) /var/spool/news (新闻组)/var/lock (程序相关)四中类型:1.可分享的: 可以分享给其他系统挂载使⽤的⽬录,所以包括执⾏⽂件与⽤户的邮件等数据,是能够分享给⽹络上其他主机挂载⽤的⽬录;2.不可分享的: ⾃⼰机器上⾯运作的装置⽂件或者是与程序有关的socket⽂件等,由于仅与⾃⾝机器有关,所以当然就不适合分享给其他主机了。
可执行目标文件详解可执行目标文件是计算机程序经过编译后生成的文件,在操作系统中直接可以执行的文件格式。
可执行目标文件是由机器指令、数据和符号表组成的。
机器指令是代码段中的指令,数据是数据段中的数据。
符号表中记录了程序中的各个符号的地址信息,用于链接时进行符号解析。
可执行目标文件的格式有多种,常见的有 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下可执行文件格式
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, ... );。