ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

如何获取指向动态库(Linux ELF)特定部分的指针?

2019-06-20 18:39:25  阅读:355  来源: 互联网

标签:c-3 linux memory elf dynamic-library


second answer for this question中可以看出,使用节的名称从内部获取指向程序特定部分的指针非常简单.使用libelf,只需打开程序自己的文件,遍历其中的所有部分(由Elf64_Shdr结构表示),当部分名称与您想要的部分匹配时停止,并使用存储在Elf64_Shdr结构的sh_addr元素中的指针.在这种情况下,获取所需指针非常简单,因为它是在ELF可执行文件中定义的.

但是,假设您有一个使用动态库的程序,您需要获取指向该动态库的一部分的指针.由于其部分的地址是在运行时定义的,因此如何获取指向动态库部分的指针?

顺便说一句,动态库和主程序本身都有一个具有相同名称的部分(这是我需要获取指针的部分).因此,在这种情况下,这两个具有相同名称的部分是否可能相邻存储在内存中,因此我只需要获取指向主文件部分的指针(如我在第一段中所述)并添加偏移量到达动态库部分?

解决方法:

it’s quite simple to get a pointer to an specific section of a program from within itself

不必要.部分表在运行时实际上并不需要,并且可以完全剥离(只有段很重要,而不是段).

Since the addresses of its sections are defined in runtime, how is it possible to get pointers to sections of a dynamic library?

该库与主可执行文件完全不同.主要区别在于库通常链接在地址0(主可执行文件不是),并由运行时加载程序重定位到其他常量偏移量.

一旦你知道了这个偏移,只需将它添加到section start(你可以从readelf -S foo.so或libelf中找到),并且瞧:你已经得到了该部分的运行时地址.

那么如何找到给定共享库的重定位?

不太优雅的解决方案(已经由Nick建议)是解析/ proc / self / maps.

更好的解决方案是使用(glibc特定的)dl_iterate_phdr.文档here.您将要使用dlpi_addr.

标签:c-3,linux,memory,elf,dynamic-library
来源: https://codeday.me/bug/20190620/1246930.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有