Я успешно установил 32-битное программное обеспечение на 64-битный VPS под управлением CentOS 7.1. Мне пришлось установить 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
Попробуйте использовать linux32 nre
запустить 32-битный.
Кроме того, если у вас возникли проблемы с запуском двоичного файла, вы можете установить пакет strace и запустить strace nre
или strace linux32 nre
чтобы получить довольно подробную трассировку системных вызовов, которая может дать вам лучшее представление о том, где искать проблемы.
Возможно, вы пытаетесь использовать Bash для выполнения двоичного файла.
Вместо этого попробуйте просто запустить следующее:
./nre
Вы можете получить дополнительную информацию о файле с помощью objdump ...
objdump -xRTW nre
Есть несколько параметров objdump, с которыми можно поиграть, включая разборку для просмотра инструкций.
Исходный вывод команды "file" показывает, что она статически связана, то есть не связана динамически. Статическая компоновка означает, что код библиотеки копируется в исполняемый файл во время компоновки, который затем имеет все необходимое для запуска, включая системные вызовы (инструкция int 0x80 в 32-битном Linux). Динамическое связывание означало бы, что код библиотеки не копируется в исполняемый файл, поэтому вызовы библиотеки во время выполнения фактически являются вызовом кода внутри разделяемых библиотек на машине, на которой выполняется программа.
Проще говоря, если исполняемый файл статически связан, у него нет библиотечных зависимостей (проверьте его, и вы должны найти в нем инструкции int 0x80; просто посмотрите на последующую инструкцию mov eax, чтобы узнать, где выполняется системный вызов).
Выходные данные вашей файловой команды показали, что исполняемый файл был удален с помощью команды strip после создания исполняемого файла. strip может удалить из исполняемого файла много информации, включая символы.
Ваша ошибка сегмента связана с этой программой, запущенной на вашем компьютере с CentOS 7.1.
CentOS 7 говорит, что поддерживает 32-битные программы ...
https://access.redhat.com/solutions/509373
Мне интересно; либо приложение делает что-то конкретное, что не поддерживается, либо, возможно, в среду требуются некоторые изменения конфигурации, чтобы приложение могло работать. Если у вас есть документация по приложению, то есть то, что ему нужно в плане настройки, это может помочь. Кто знает, может быть что-то не так с его собственным файлом конфигурации (предположительно, он использует его, например, nre.conf и т. Д.)