我有一个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`
答案 0 :(得分:4)
可能有几个原因需要安装依赖项。
一个原因是,当一个动态链接(它是一个用词不当,因为它尚未完全链接 - 它应该被称为“需要动态链接的可执行文件”)ELF将被执行它并不是真正执行开始,它得到了所谓的解释器,将被执行。这个解释器实际上是将进行实际链接的动态链接器。如果解释器丢失或者没有有效程序,则无法执行可执行文件(与第一行上的shebang没有命名有效解释器的脚本相比)。
另一个是加载时动态链接需要与某些动态库链接。这当然意味着您需要与可执行文件链接的动态库。
第三个原因可能是可执行文件在运行时使用文件或其他依赖项。例如,它可能需要调用其他程序,动态加载库,甚至打开它预期存在的文件。
从你的结果来看,你似乎遇到了两个第一个问题。
答案 1 :(得分:3)
可执行文件可以使用一些动态链接的库。这意味着库在运行时加载。你可以尝试运行你的文件(为什么不呢?),但是你的启动失败了。
有关详细信息,请参阅What do 'statically linked' and 'dynamically linked' mean?
答案 2 :(得分:1)
尝试使用ldd <your binary>
查看无法找到的库,并逐个安装这些库。