为什么elf程序有导出函数

为什么elf程序有导出函数,第1张

ELF(Executable and Linkable Format)是一种可执行文件和可链接目标文件的格式,常见于UNIX和Linux系统中。在ELF程序中,可以包含导出函数,这是因为ELF格式支持动态链接库(shared library)的机制,而导出函数是动态链接库的一部分。

动态链接库是一种以动态方式加载和链接的库,它可以在运行时被加载到应用程序中,并被多个应用程序共享。在ELF程序中,如果使用了动态链接库,那么该库中的导出函数可以被其他应用程序调用,因此需要在ELF程序中进行导出。而对于静态链接库(static library)而言,因为它是直接链接到应用程序中的,所以不需要导出函数。

需要注意的是,ELF程序中的导出函数是在编译时就确定好的,因此无法在运行时添加或删除导出函数。

姓名:罗学元    学号:21181214375     学院:广州研究院

【嵌牛导读】什么是ELF文件

【嵌牛鼻子】什么是ELF文件

【嵌牛提问】什么是ELF文件,它有哪些部分组成、每部分包含哪些信息

          ELF文件分为四个部分:elf header,program header table,section header table,dynamic symbol table。其中节头表(section header  table) 和 段头表(program header table) 中用到的数据相同,只是组织方式不同。

一、ELF header

每个ELF文件都必须存在一个ELF_Header,这里存放了很多重要的信息用来描述整个文件的组织,如: 版本信息,入口信息,偏移信息等,程序执行也必须依靠其提供的信息:

数据结构如下:

e_xxx 和上面对应表如下图:

其中数据类型如下:

二、Program header table 程序头表

        存储so文件运行时所需要的信息,这部分信息会直接被linker使用,用于加载so文件,告诉系统如何在内存中创建映像,在图中也可以看出来,有程序头部表才有段,有段就必须有程序头部表,其中存放各个段的基本信息(包括地址指针)

节到段的映射:

    链接视图是以节(section)为单位,执行视图是以段(segment)为单位。链接视图就是在链接时用到的视图,而执行视图则是在执行时用到的视图。上图左侧的视角是从链接来看的,右侧的视角是执行来看的。

段(Segment): 就是将文件分成一段一段映射到内存中,段中通常包括一个或多个节区。

       那么为什么需要节和段两种视图? 当ELF文件被加载到内存中后,系统会将多个具有相同权限(flg值)section合并一个segment。 *** 作系统往往以页为基本单位来管理内存分配,一般页的大小为4096B,即4KB的大小。同时,内存的权限管理的粒度也是以页为单位,页内的内存是具有同样的权限等属性,并且 *** 作系统对内存的管理往往追求高效和高利用率这样的目标。ELF文件在被映射时,是以系统的页长度为单位的,那么每个section在映射时的长度都是系统页长度的整数倍,如果section的长度不是其整数倍,则导致多余部分也将占用一个页。而我们从上面的例子中知道,一个ELF文件具有很多的section,那么会导致内存浪费严重。这样可以减少页面内部的碎片,节省了空间,显著提高内存利用率。

readelf -S xxx # 用来查看可执行文件中有哪些section,如下图:

readelf --segments xxx # 可以查看该文件的执行视图,下图红框部分为上图的节信息在段中的显示:

    最后加载进内存的只有program header table 程序头表里的load段,其他都只是描述信息,加载过程中用到,但是最后加载进去内存的只有load段。

三、Section header table 节头部表

           类似与程序头部表,但与其相对应的是节区(Section);节区(Section): 将文件分成一个个节区,每个节区都有其对应的功能,如符号表,哈         希 表 等。

.relname和.relaname: 010Editor打开so,展现形式为下图,.rel.dyn 和 .rel.plt ,是用来重定向dyn和plt的,也就是静态情况下,存放偏移值,如果进行动态调试的时候,就会加上基址变成绝对地址(重定向)。

下面第二张图中,左边红框就是偏移值,右边红框只要把基址加进来,就是绝对地址,把基址加进来的过程就是重定向的过程:

.plt 程序链接表,用于做映射关系,拿到依赖so的绝对地址,做重定向的:

四、Dynamic symbol table

     这里是符号表,也就是会用到的所有函数名称表,包括自己写的函数和依赖的系统so中的函数,到时候.plt会对这部分重定向 。

您好,现在我来为大家解答以上的问题。elf文件怎么打开,eln文件怎么打开相信很多小伙伴还不知道,现在让我们一起来看看吧!1、Linux ELF...

您好,现在我来为大家解答以上的问题。elf文件怎么打开,eln文件怎么打开相信很多小伙伴还不知道,现在让我们一起来看看吧!

1、Linux ELF ELF = Executable and Linkable Format,可执行连接格式,是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的。

2、扩展名为elf。

3、工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同 *** 作系统之间可移植的二进制文件格式。

4、假定开发者定义了一个二进制接口集合,ELF标准用它来支持流线型的软件发展。

5、应该减少不同执行接口的数量。

6、因此可以减少重新编程重新编译的代码。

7、编辑本段文件格式Linking View Elf headerProgram header table optionalsection1……section nsection header tableExection View Elf headerProgram header table segment 1section 2……segment header table一个ELF头在文件的开始,保存了路线图(road map),描述了该文件的组织情况。

8、sections保存着object 文件的信息,从连接角度看:包括指令,数据,符号表,重定位信息等等。

9、特别sections的描述会出项在以后的第一部分。

10、第二部分讨论了段和从程序的执行角度看文件。

11、 假如一个程序头表(program header table)存在,那么它告诉系统如何来创建一个进程的内存映象。

12、被用来建立进程映象(执行一个程序)的文件必须要有一个程序头表(program header table);可重定位文件不需要这个头表。

13、一个section头表(section header table)包含了描述文件sections的信息。

14、每个section在这个表中有一个入口;每个入口给出了该section的名字,大小,等等信息。

15、在联接过程中的文件必须有一个section头表;其他object文件可要可不要这个section头表。

16、 注意: 虽然图显示出程序头表立刻出现在一个ELF头后,section头表跟着其他section部分出现,事实是的文件是可以不同的。

17、此外,sections和段(segments)没有特别的顺序。

18、只有ELF头(elf header)是在文件的固定位置。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7758562.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存