标签:linux memory-management process elf shared-libraries
我正在开发一个项目来加载和运行Linux平台上的自定义二进制格式可执行文件(在我的例子中是PE).到目前为止,我已经成功地完成了这项工作,首先加载可执行文件,然后加载一个调用可执行文件起始地址然后安全退出的小型ELF共享库.
不过,出于某些原因,我真的不想自己装ELF.首先,我使用的共享库是用汇编语言编写的(我不能使用任何其他东西,因为我没有链接到libc等),这将是非常特定于平台的,我想摆脱它并使用C所以我可以编译任何平台.此外,使用Linux的本机ELF加载程序而不是我自己的简化版本将更容易,更安全.
我想知道是否有办法使用我的binfmt处理程序,一个已安装的内核模块来加载我的可执行文件,然后让Linux将我的共享库(及其依赖项)加载到同一地址空间而不覆盖我的可执行代码.我首先想到uselib系统调用可能有用,但是手册页上的描述不清楚这是否符合我的目的:
From libc 4.4.4 on only the library “/lib/ld.so” is loaded, so that
this dynamic library can load the remaining libraries needed (again
using this call). This is also the state of affairs in libc5.glibc2 does not use this call.
我也从未见过它的使用示例,我总是担心使用我不理解的系统调用.
有没有一个很好的方法来实现我所描述的?我是否可以使用Linux的现有功能将共享库(用C编写)加载到已包含可执行代码的地址空间中,如果是这样,我如何使用该库而不知道它已被加载到何处?
解决方法:
已经有一个名为binfmt_pe(由我来做)的项目,它是一个内核模块,并且拥有自己的链接器(类似于/ lib / ld). check it out here.
至于你关于制作模块和加载器/链接器的问题,下面有链接.我还包括有关ELF和PE可执行文件的信息的链接.
我希望这有帮助.
标签:linux,memory-management,process,elf,shared-libraries 来源: https://codeday.me/bug/20190725/1536919.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。