jav*_*ved 9 c linux elf openonload
我有一个静态链接到libc的精灵二进制文件.我无法访问其C代码.我想使用OpenOnload库,它在用户空间中实现了套接字,因此与标准libc版本相比可以提供更低的延迟.OpenOnload实现标准套接字api,并使用LD_PRELOAD覆盖libc版本.但是,由于此elf二进制文件是静态链接的,因此无法使用套接字API的OpenOnload版本.
我相信可以通过以下步骤将此二进制文件转换为与OpenOnload动态链接:
作为第一个剪辑,我尝试添加3个PT_LOAD段.在现有PT_LOAD段标头之后添加了新的段标头.此外,未修改现有段的vm_addr.基于p_align将现有段的文件偏移量下移到下一个对齐的地址.在文件末尾的文件中添加了新的PT_LOAD段.
在重新编写文件之后,当我运行它时,它被内核正确加载,但随后它立即发生了故障.
我的问题是:
您无法以任何自动化的方式进行尝试。在静态链接时,已解决并删除了将对libc的调用标识为对libc的调用的所有重定位信息。如果二进制文件中存在调试符号,则可以识别“该文本段中的字节范围对应于某某类libc函数”,但无法识别对该函数的引用,该引用将嵌入到没有标记的指令字节流来标识它们。您可以使用基于反汇编的启发式方法,但是它们将是不完整且不可靠的(可能出现误报和误报)。
至于偏移量,您绝对不能更改静态链接二进制文件的加载地址的任何内容。如果您需要在加载段之前插入标头,则必须插入整个页面,并更新程序标头表中的文件偏移量(向其添加1页),同时使虚拟地址的加载偏移量保持不变。但是,由于您尝试做的事情总体上是不可能的,因此偏移移位问题是您的后顾之忧最少。
也许,如果该程序不需要高性能,则可以在qemu应用程序级仿真下运行它,而qemu则通过套接字仿真/包装器运行。