ldd каже мені, що моя програма "не є динамічним виконуваним"


17

У мене є 32-розрядна програма (звана uclsyn), яку я отримав від професора астрономії. Мені вдалося запустити його на CentOS рік тому, але тепер, коли я налаштовую новий CentOS VM, він не запуститься, і я не можу зрозуміти, чому. Він продовжує повертатися із "Убитими".

Це обмін у командному рядку:

$ ./uclsyn_linux
Killed

$ ldd ./uclsyn_linux
not a dynamic executable

$ file ./uclsyn_linux
uclsyn_linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

На машині, на якій працює, "ldd ./uclsyn_linux" повертає цілий список залежностей. Я знайшов пакунки, які надають ці спільні бібліотеки, і всі вони, здається, встановлені.

Потрібні пакети

  • libSM-1.1.0-7.1.el6.i686
  • libX11-1.3-2.el6.i686
  • libgcc-4.4.6-3.el6.i386
  • glibc-2.12-1.47.el6_2.9.i686
  • libuuid-2.17.2-12.4.el6.i686
  • libXau-1.0.5-1.el6.i686
  • Також є купа бібліотек локальної програми, яку я перевірив і вже встановлений.

Моє оточення

CentOS працює під VirtualBox

uname -a: Linux localhost.localdomain 2.6.32-358.el6.i686 # 1 SMP Чт 21 лютого 12:50:49 UTC 2013 i686 i686 i386 GNU / Linux


1
дивна здогадка: ви намагаєтеся запустити 32-бітний бінарний файл на 64-бітній ОС без встановлення 32-бітних бібліотек.
michas

Це 32-бітний бінарний, але ОС, яку я встановив, - це 32-бітна версія CentOS. Принаймні, це те, що команда unme-командує мені так?
Карл

3
@Carl З цікавості, що дає strace ./uclsynрезультат? Це може дати нам підказку про те, чого не вистачає спочатку.
lgeorget

@lgeorget, Він повертає: execve ("./ uclsyn_linux", ["./uclsyn_linux"], [/ * 56 vars * /] <незакінчений ...> +++ вбитий SIGKILL +++
Карл

@Carl Добре, тому він навіть не переходить до того моменту, коли намагається завантажити деякі бібліотеки. Я ніколи раніше не пробував, щоб straceпрограма не була зв’язана правильно.
lgeorget

Відповіді:


13

У мене просто була проблема з 32-розрядним бінарним рішенням, рішення було:

apt-get install gcc-multilib

$ uname -a
Linux bla 2.6.32-028stab094.3 #1 SMP Thu Sep 22 12:47:37 MSD 2011 x86_64 GNU/Linux

3
як ти виявив, що ця губа відсутня?
yehudahs

1
Це рішення спрацювало на мене. +1
FractalSpace

@yehudahs Я досить багато запускаю 32-бітові додатки на Linux у Linux, а також Reverse Engineering їх, тому я зібрав певний досвід зйомки. : D
lama12345

1
приємно, що це працювало для мене, а також я чухав голову, що я робив не так
Marvin Effing

1
Працює і для мене: ldd щось не знайшов, тоді як це працює ^^
jy95

8

Помилка тут була через те, що на VirtualMachine недостатньо оперативної пам’яті. Запуск strace ./programnameвказував на те, що програму вбивали так само, як вона почала працювати, перед завантаженням будь-якої з бібліотек. Збільшення обсягу доступної оперативної пам’яті забезпечило роботу програми.

Корисні відповіді

Були корисні відповіді інших, а саме @slm, які надали корисні команди, щоб перевірити наявність кожної з бібліотек, і @lgeorget, які пропонують спробувати straceкоманду.


5

Чи можете ви розмістити деякі бібліотеки, на які вона посилається (з оригінальної системи)? Можливо, вам просто знадобиться встановити деякі відсутні бібліотеки.

Зазвичай для системи CentOS це лише питання запуску команди yum на зразок:

yum install <package name>

Ви можете працювати назад від початкової системи так:

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff519ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00000034e8e00000)
    librt.so.1 => /lib64/librt.so.1 (0x00000034e8a00000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003d6fe00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00000034fae00000)
    libc.so.6 => /lib64/libc.so.6 (0x00000034e7200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000034e7a00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000034e6e00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034e7e00000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00000034f7600000)

У цьому виході ви можете побачити , де моя копія /bin/lsнабирає загальний .so бібліотеки, наприклад , скажімо, librt.so.1, що трапляється, знаходиться тут: /lib64/librt.so.1.

Знаючи це, в оригінальній системі ви можете запустити цю команду, щоб визначити, який пакет надає цю бібліотеку:

$ rpm -qf /lib64/librt.so.1
glibc-2.13-2.x86_64

Так пакет називається glibc-2.13-2.x86_64. Отже, щоб встановити його, ви зробите це:

$ sudo yum install glibc-2.13-2.x86_64

Дякую за допомогу. Я йду далі. Я оновив моє запитання ще трохи інформації, якщо ви хочете оновити свою відповідь тим самим, було б дуже вдячно. :)
Карл

Чи були ви yum install <package>ті пакунки, на які ви посилалися у своєму запитанні?
slm

Так. Всі вони були встановлені за винятком libuuid.i686, який є зараз, але у мене все ще є та сама проблема.
Карл

2

Відповідь у вашому запитанні: ви намагаєтеся запустити програму, яка була складена для GNU / Linux рік тому, і ви намагаєтеся запустити її з новими бібліотеками, які можуть бути вже не сумісні або доступні.

На даний момент у вас є два варіанти. Якщо ви зможете перекомпілювати його (у чому я сумніваюся, якщо я добре розумію ваш випадок), він запуститься, оскільки він буде зв'язаний із сумісними бібліотеками. В іншому випадку ви можете спробувати створити своєрідну пісочницю, VM, що працює зі старою версією бібліотек GNU, наприклад, для запуску програми в.


1
Це неправильно. Програма є статично пов'язаною, жодна бібліотека в хост-системі не збирається посилатися. Хоча ABI все ще може викликати несумісність, між незначними оборотами ядра Linux (маючи на увазі ту ж архітектуру) навряд чи.
ckhan

1
Вона не пов'язана статично, дивіться вихід з file. І такі повідомлення, як No package xyz foundприпущення, потрібні бібліотеки більше не доступні (принаймні, не такими, якими вони були, в тих же пакунках). Ось чому я пропоную відновити програму, якщо це можливо, або запустити її в системі, в якій вона, як відомо, працювала, зі старими бібліотеками.
lgeorget

На жаль, перекомпіляція тут не є варіантом. У мене це працює в іншій системі саме так, як я намагаюся тут, але чомусь цього разу це не подобається.
Карл

Це неправильно. Зміна адрес не має значення взагалі. Функції, які видаляються або інші перерви ABI, трапляються при великих ревізіях бібліотеки (які рідкісні); у цьому випадку ви отримаєте помилку при завантаженні libfoo2, якщо у вас не встановлено libfoo2, незалежно від того, встановлений чи ні libfoo3.
psusi

Гаразд, добре знати. Я думав, що будь-яка зміна бібліотеки може порушити зв'язок. Наразі я працюю на gentoo, і мені часто доводиться перекомпілювати зворотні залежності, коли я оновлюю бібліотеку, тому я не вважав, що посилання є настільки стійкою до змін у бібліотеці.
lgeorget

0

спробуйте readelf -l uclsyn_linux Інтерпретатор програми-запиту підкаже, що вам не вистачає.


1
Я зіткнувся readelf -l <file>з файлом з такою ж lddповедінкою ( not a dynamic executable), але я не бачу нічого, що вказувало б на відсутність бібліотеки. Я бачу Elf file type is EXEC (Executable file), Entry point, Program Headersі Section to Segment mapping. Що саме я повинен шукати на виході?
StockB

0

У Arch Linux , якщо файл має 32-розрядний ельф, ви можете встановити lib32-gcc-libs (із сховища мультиліб) для вирішення проблеми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.