【问题标题】:If the file is executable, why do I need to install some dependencies?如果文件是可执行的,为什么我需要安装一些依赖项?
【发布时间】:2016-01-09 16:18:07
【问题描述】:

我有一个 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`

【问题讨论】:

  • 如果汽车有轮子,为什么还需要引擎来驱动?
  • 因为你的可执行文件使用了它们
  • 您的程序是动态链接的事实正是您必须安装这些库的原因。如果它们不存在,您的程序如何链接到它们?
  • 误解太多,时间太少

标签: c++ linux gcc glibc elf


【解决方案1】:

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

一个原因是当一个动态链接(这是一个用词不当,因为它还没有完全链接 - 它应该被称为“需要动态链接的可执行文件”)ELF要被执行时,它并没有真正开始执行,它得到了将被执行的所谓解释器。这个解释器实际上是执行实际链接的动态链接器。如果解释器丢失或不是有效程序,则无法执行可执行文件(与第一行的 shebang 未命名有效解释器的脚本相比)。

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

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

从您的结果来看,您似乎遇到了前两个问题。

【讨论】:

    【解决方案2】:

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

    更多详情见What do 'statically linked' and 'dynamically linked' mean?

    【讨论】:

    • @Lightness Races in Orbit 谢谢。我已经确定了答案。
    【解决方案3】:
    1. 您尝试在 64 位系统上运行 32 位可执行文件。这就是为什么您的初始运行以“错误的 ELF 解释器”结束的原因。
    2. 典型的 Linux x86-64 系统没有安装 32 位库,因此您需要在运行 32 位动态链接可执行文件之前提供它们。

    尝试使用ldd &lt;your binary&gt;查看哪些库找不到,并一一安装。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-16
      • 2020-06-01
      • 2020-02-12
      • 1970-01-01
      • 2018-09-06
      • 2017-07-15
      • 1970-01-01
      • 2021-03-30
      相关资源
      最近更新 更多