如果文件是可执行的,为什么还需要安装一些依赖?

If the file is executable, why do I need to install some dependencies?

我有一个 32 位可执行二进制文件,我需要 运行 在我的 x86_64 机器上。如果文件是可执行的(甚至是动态链接的),为什么我需要安装一些与二进制文件编程的编程语言的库相关的依赖项?

[root@server]# file TcpServer
TcpServer: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x20fc1da672a6ba3632123abc654f9ea88b34259, not stripped

[root@server]# ./TcpServer</b>
 -bash: ./TcpServer: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory`

[root@server]# yum install glibc.i686
[root@server]# ./TcpServer
./TcpServer: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory`

可执行文件可以使用一些动态链接库。这意味着库在 运行 时间加载。您可以尝试 运行 您的文件(为什么不呢?),但是启动失败。

有关详细信息,请参阅 What do 'statically linked' and 'dynamically linked' mean?

您需要安装依赖项的原因可能有多种。

一个原因是,当一个动态链接(这是一个误称,因为它还没有完全链接 - 它应该被称为 "executable that needs dynamic linking")ELF 将被执行时,它并没有真正开始执行,它得到了将被执行的所谓的解释器。该解释器实际上是将进行实际链接的动态链接器。如果解释器缺失或不是有效程序,则可执行文件无法执行(与第一行的 shebang 未指定有效解释器的脚本相比)。

还有一个是动态链接在加载的时候需要链接到某些动态库。这当然意味着您需要与可执行文件链接的动态库。

第三个原因可能是可执行文件在 运行 时使用了文件或其他依赖项。例如,它可能需要调用一些其他程序、动态加载库甚至打开它希望存在的文件。

从你的结果看来你已经 运行 解决了前两个问题。

  1. 您试图在 64 位系统上 运行 32 位可执行文件。这就是为什么您的初始 运行 以 "bad ELF interpreter" 结束。
  2. 典型的 Linux x86-64 系统没有安装 32 位库,因此您需要在 运行 32 位动态链接可执行文件之前提供它们。

尝试使用ldd <your binary>,看看有哪些库找不到,然后一一安装。