是否可以绕过已编译的可执行文件所需的共享库依赖项?

时间:2013-12-25 23:23:32

标签: linux shared-libraries

我知道在编译可执行文件以供在Linux中使用之前,有很多方法可以删除/添加库依赖项。但是,经过一些搜索后,我只能在只给出可执行文件而没有二进制文件的情况下找不到绕过这些依赖项的方法。例如,如果我在可执行文件上运行ldd并且找不到共享库,我认为该程序不需要运行。

谢谢

2 个答案:

答案 0 :(得分:1)

  

例如,如果我在可执行文件上运行ldd并且找不到共享库,我认为该程序不需要运行。

您可以平凡地测试您的信念是否正确:创建一个空的“存根”共享库,其名称ldd报告为未找到,并测试可执行文件是否正确运行时你使用那个存根(例如通过LD_LIBRARY_PATH)。

如果可执行文件实际上工作(这有点不太可能),您可以对可执行文件的.dynamic部分进行二进制修补以删除不必要的依赖项 - .dynamic只是一个固定大小的Elf{32,64}_Dyn记录表,由.d_tag == DT_NULL的记录终止(所需的库由.d_tag == DT_NEEDED的记录表示。因此,您可以找到不必要的记录,只需“滑动”所有后续记录表中有一个插槽。

答案 1 :(得分:0)

您可以尝试patchElf,它被声称是“修改ELF可执行文件的动态链接器和RPATH的小实用程序”

主页:http://nixos.org/patchelf.html。 github存储库:https://github.com/NixOS/patchelf