我已成功在运行 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 二进制问题,但由于我已经安装了库,所以我有点困惑为什么会收到此错误。我该如何诊断我是否确实缺少库,如果是,缺少哪个库?
好吧,使用 strings -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
答案1
您可能正在尝试使用 Bash 执行二进制文件。
相反,请尝试简单地运行以下命令:
./nre
答案2
尝试使用linux32 nre
32 位运行。
此外,如果您在执行二进制文件时遇到问题,您可以安装 strace 包并运行strace nre
或strace linux32 nre
获取相当详细的系统调用跟踪,这可能会让您更好地了解在哪里寻找问题。
答案3
您可以使用 objdump 获取有关该文件的更多信息...
objdump -xRTW nre
有几个 objdump 选项可以使用,包括反汇编来查看说明。
“file”命令的原始输出显示它是静态链接的,即它不是动态链接的。静态链接意味着库代码在链接时被复制到可执行文件中,然后可执行文件就拥有了运行所需的一切,包括系统调用(32 位 Linux 中的 int 0x80 指令)。动态链接意味着库代码不会被复制到可执行文件中,因此在运行时,库调用实际上是对程序正在运行的机器上的共享库内代码的调用。
简而言之,如果可执行文件是静态链接的,它就没有库依赖关系(检查它,你应该在其中找到 int 0x80 指令;只需查看前面的 mov eax 指令即可找出在哪里进行哪个系统调用)。
您的文件命令输出表明在创建可执行文件后,使用 strip 命令剥离了可执行文件。strip 可以从可执行文件中删除大量信息,包括符号。
您的段错误与在 CentOS 7.1 机器上运行的程序有关。
CentOS 7 表示它支持 32 位程序......
https://access.redhat.com/solutions/509373
我觉得这很有趣;要么应用程序正在执行一些不受支持的特定操作,要么环境需要进行一些配置更改才能使应用程序运行。如果您有应用程序的文档,即它需要什么配置方式,这可能会有所帮助。谁知道呢,它自己的配置文件可能有问题(可能它使用了一个,如 nre.conf 等)。