Я скомпилировал двоичные файлы на своем компьютере с помощью GCC 4.9.1 и перенес их на сервер, на котором я хочу их запустить (на котором у меня нет необходимых прав для установки пакетов, поэтому я не могу установить gcc-multilib чтобы попробовать и посмотреть, как это предлагается в этом ответе). На обеих машинах установлена ​​64-разрядная версия Ubuntu 14.04, и полученные двоичные файлы прекрасно работают на обеих.

Но когда я пытаюсь использовать ldd на компьютере, на котором я его скомпилировал, ldd возвращает ожидаемый результат (библиотеки, необходимые для двоичного файла). Но когда я запускаю на сервере:

me@server:ldd /home/me/test
          not a dynamic executable

Что может быть причиной этого, зная, что исполняемые файлы работают нормально?

-1
user9128 29 Авг 2021 в 20:31
Посмотрите, что говорит file /home/me/test, и прояснит ли это ситуацию
 – 
ilkkachu
29 Авг 2021 в 21:30
См. также вывод bash -x ldd /home/me/test (при условии, что ldd является скриптом bash, как в системах GNU)
 – 
Stéphane Chazelas
30 Авг 2021 в 08:48
Приложение было динамически построено на машине x86-64 и предназначено для работы на машине x86-64. Вот что файл говорит об исполняемом файле: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32.
 – 
user9128
30 Авг 2021 в 13:15

2 ответа

Он статически построен. Он не использует общие библиотеки. При построении ему будет передан переключатель -static.

0
Bib 29 Авг 2021 в 00:40
Нет, он был построен динамически.
 – 
user9128
29 Авг 2021 в 20:29
1
Вывод команды ldd показывает, что вы ошибаетесь, или это неправильная архитектура, и в этом случае она не будет работать.
 – 
Bib
29 Авг 2021 в 20:33
Ну, ldd на машине, на которой был скомпилирован исполняемый файл, возвращает ожидаемый результат (то есть общие библиотеки, которые он загружает во время выполнения). А вот на удаленном сервере его нет, отсюда и вопрос. Кроме того, file говорит, что он был построен динамически.
 – 
user9128
30 Авг 2021 в 13:06
Все, что вы делаете, это даете нам соответствующую информацию по крупицам, как будто вы намеренно пытаетесь досадить людям. Я ухожу...
 – 
Bib
30 Авг 2021 в 14:45

Я могу придумать две альтернативы:

  • Либо приложение было создано статически, как упомянул @Bib

Или

  • Система, на которой работает ldd, не поддерживает архитектуру двоичного файла.

Например, приложение могло быть скомпилировано как двоичный файл i686 при работе ldd в чистой системе x86-64. ldd в этом случае сообщит об этом как not a dynamic executable. Очень маловероятно, что вы сможете запустить его, но, вероятно, это можно сделать.

И вот еще одна возможность: -objdump-and">ldd возвращает "не динамический исполняемый файл" для 64-битного ELF, хотя objdump и readelf расходятся во мнениях

0
Artem S. Tashkinov 29 Авг 2021 в 20:56
Приложение было динамически построено на машине x86-64 и предназначено для работы на машине x86-64. Вот что file говорит об исполняемом файле: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32.
 – 
user9128
30 Авг 2021 в 13:14