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

Linux 是否可以绕过已编译的可执行文件所需的共享库依赖项?,linux,shared-libraries,Linux,Shared Libraries,我知道在编译Linux中使用的可执行文件之前,有很多方法可以删除/添加报告的库依赖项。然而,经过一段时间的搜索,当只提供可执行文件而没有二进制文件时,我无法找到绕过这些依赖关系的方法。例如,如果我在可执行文件上运行ldd,但没有找到一个共享库,并且我认为程序不需要运行 多谢各位 例如,如果我在可执行文件上运行ldd,但没有找到一个共享库,并且我认为程序不需要运行 您可以简单地测试您的信念是否正确:创建一个名为ldd的空“存根”共享库,并测试使用该存根时可执行文件是否正确运行(例如,通过LD\u

我知道在编译Linux中使用的可执行文件之前,有很多方法可以删除/添加报告的库依赖项。然而,经过一段时间的搜索,当只提供可执行文件而没有二进制文件时,我无法找到绕过这些依赖关系的方法。例如,如果我在可执行文件上运行ldd,但没有找到一个共享库,并且我认为程序不需要运行

多谢各位

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

您可以简单地测试您的信念是否正确:创建一个名为
ldd
的空“存根”共享库,并测试使用该存根时可执行文件是否正确运行(例如,通过
LD\u library\u PATH


如果可执行文件确实有效(这有点不太可能),您可以对可执行文件的
.dynamic
部分进行二进制修补,以删除不必要的依赖关系--
.dynamic
只是一个固定大小的
Elf{32,64}\u Dyn
记录表,由
.d\u tag==DT\u NULL
的记录终止(所需的库由带有
.d_tag==DT_needed
的记录表示。因此,您可以找到不必要的记录,只需将以下所有记录“滑动”到表中的一个插槽中即可。

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

主页:。
github repository:

如果ldd报告了一个库依赖项,那么该可执行文件需要来自该库的符号。您可以自己制作“假”解析这些符号的库,并使用
LD_library_PATH
将可执行文件指向它,但您确实需要知道自己在做什么。此外,您还可以使用弱链接(但随后需要在启用弱链接的情况下编译可执行文件)。@JoeZ“如果ldd报告了库依赖关系,则该可执行文件需要来自该库的符号。“--这句话不正确。@EmployeedRussian:好的,库有可能出现在
ldd
列表中而不被需要。根据我的经验,我还没有见过这种情况发生。不过,您下面的回答确实提供了一种测试方法。我如何实际编辑.dynamic部分?您有什么建议吗?这个“存根”方法不一定有效-在我的例子中,二进制文件仍然抱怨库之后“太短了”。但是当使用
readelf
删除它时,正如Chaim在下面建议的那样,一切都很好。