我已经在运行CentOS 7.1的64位VPS上成功安装了一个32位软件。 我不得不安装32位库之前,它会安装,但现在当我尝试启动它,我得到这个错误:
[root@001 bin]# bash ./nre ./nre: ./nre: cannot execute binary file
如果我查阅文件要求,得到:
[root@001 bin]# file nre nre: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked (uses shared libs), stripped
我所有的阅读都指出这个错误可能是一个32位的二进制问题,但是因为我已经安装了这个库,所以我有点困惑,为什么我收到这个错误。 我如何去诊断我是否确实错过了一个图书馆,如果我是,哪一个?
好吧,使用string-a命令,我想我能够产生一个依赖列表。 有没有一种简单的方法来确定我失踪?
/lib/ld-linux.so.2 libnre.so __gmon_start__ _Jv_RegisterClasses _init _ZN11NreLauncher11getInstanceEv _fini _ZN11NreLauncher3nreEPKciPPc libdl.so.2 libstdc++.so.6 __gxx_personality_v0 libm.so.6 libgcc_s.so.1 libpthread.so.0 libc.so.6 _IO_stdin_used umask stderr getuid fwrite geteuid __libc_start_main _edata __bss_start _end CXXABI_1.3 GLIBC_2.0 PTRh QVhp
这可能是你正在尝试使用Bash来执行一个二进制文件。
相反,请尝试简单地运行以下内容:
./nre
尝试使用linux32 nre来运行32位。
此外,如果执行二进制文件时遇到问题,可以安装strace软件包并运行strace nre或strace linux32 nre以获得更详细的系统调用跟踪,这可能会让您更好地了解在哪里查找问题。
你可以用objdump得到更多关于这个文件的信息…
objdump -xRTW nre
有几个objdump选项可供select,包括反汇编查看指令。
您的“文件”命令的原始输出显示它是静态链接的,即它不是dynamic链接的。 静态链接意味着库代码在链接时被复制到可执行文件中,然后运行它所需的一切,包括系统调用(32位linux中的int 0x80指令)。 dynamic链接将意味着库代码不会被复制到可执行文件中,因此在运行时库调用实际上是调用运行程序的计算机上的共享库中的代码。
简而言之,如果一个可执行文件是静态链接的,它没有库依赖关系(检查出来,你应该在其中findint 0x80指令;只要看看正在进行的mov eax指令来找出哪个系统调用正在被做)。
您的文件命令输出表示在创build可执行文件之后,可执行文件被strip命令剥离。 strip可以从可执行文件中删除很多信息,包括符号。
您的seg故障必须与您的CentOS 7.1机器上运行的程序有关。
CentOS 7说它支持32位程序…
https://access.redhat.com/solutions/509373
有趣的是我; 应用程序正在执行不受支持的特定事情,或者环境需要进行一些configuration更改以使应用程序能够运行。 如果您有关于应用程序的文档,也就是说,它需要以自己的configuration方式,这可能会有所帮助。 谁知道,它自己的configuration文件可能有些问题(大概是使用一个,就像一个nre.conf等)