Если файл исполняемый, зачем мне устанавливать некоторые зависимости?

У меня есть один 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`

3 ответа

Решение
  1. вы пытаетесь запустить 32-битный исполняемый файл в 64-битной системе. Вот почему ваш первый запуск закончился "плохим переводчиком ELF".
  2. типичная система Linux x86-64 не имеет 32-битных библиотек, поэтому вам необходимо предоставить их до запуска 32-битного динамически связанного исполняемого файла.

Попробуй использовать ldd <your binary> чтобы увидеть, какие библиотеки не могут быть найдены, и установите эти библиотеки одну за другой.

Может быть несколько причин, по которым вам нужно установить зависимости.

Одна из причин заключается в том, что когда динамически скомпонован (это неправильное название, потому что он еще не был полностью скомпонован - его следует называть "исполняемый файл, для которого требуется динамическое связывание"), должен выполняться ELF, который на самом деле не выполняется, он получает то, что называется переводчиком, который будет казнен. Этот интерпретатор на самом деле является динамическим компоновщиком, который выполняет фактическое связывание. Если интерпретатор отсутствует или не является допустимой программой, исполняемый файл не может быть выполнен (сравните со сценарием, в котором шебанг в первой строке не называет допустимого интерпретатора).

Другое заключается в том, что динамические ссылки при загрузке должны быть связаны с определенными динамическими библиотеками. Это, конечно, означает, что вам нужны динамические библиотеки, с которыми должен быть связан исполняемый файл.

Третья причина может заключаться в том, что исполняемый файл использует файлы или другие зависимости во время работы. Например, может потребоваться вызвать какую-то другую программу, динамически загрузить библиотеки или даже открыть файлы, которые, как ожидается, будут присутствовать.

Судя по вашему результату, вы столкнулись с двумя первыми проблемами.

Исполняемый файл может использовать некоторые динамически связанные библиотеки. Это означает, что библиотека загружается во время выполнения. Вы можете попробовать запустить ваш файл (почему бы и нет?), Но вы получите ошибку при запуске.

Для получения более подробной информации смотрите Что означают "статически связанные" и "динамически связанные"?

Другие вопросы по тегам