виконання двійкового файлу: файл не знайдено


9

Я знаю, що там є подібні питання, але я не знайшов рішення, ані цього конкретного випадку. Бінарний файл був побудований на Arch Linux, використовуючи його GCC 4.7. Пакет чудово працює в системі збірки. Команди нижче виконуються:

Linux vbox-ubuntu 3.2.0-29-generic # 46-Ubuntu SMP Пт 27 липня 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux

Розглянутий файл знаходиться тут . Це 64-бітний Linux 64-розрядний крос-компілятор Windows. Розпакувавши його, ~/дає єдиний ~/mingw64каталог, який містить усе необхідне.

Коли я намагаюся запустити ~/mingw64/x86_64-w64-mingw32/bin/asце те, що я отримую:

bash: /home/ruben/mingw64/x86_64-w64-mingw32/bin/as: No such file or directory

Біг file ~/mingw64/x86_64-w64-mingw32/bin/asдає мені:

/home/ruben/mingw64/x86_64-w64-mingw32/bin/as: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x0b8e50955e7919b76967bac042f49c5876804248, not stripped

Біг ldd ~/mingw64/x86_64-w64-mingw32/bin/asдає мені:

    linux-vdso.so.1 =>  (0x00007fff3e367000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2ceae7e000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2ceaac1000)
    /lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f2ceb0a8000)

Я справді в збитку. Будь-яка допомога дуже цінується.

EDIT : Ще кілька деталей: Система збірки - це Arch Linux (на даний момент glibc 2.16). Вихід ls -l:

-rwxr-xr-x 2 ruben users 1506464 11 aug 23:49 /home/ruben/mingw64/bin/x86_64-w64-mingw32-as

Вихід objdump -p:

Version References:
  required from libz.so.1:
    0x0827e5c0 0x00 05 ZLIB_1.2.0
  required from libc.so.6:
    0x0d696917 0x00 06 GLIBC_2.7
    0x06969194 0x00 04 GLIBC_2.14
    0x0d696913 0x00 03 GLIBC_2.3
    0x09691a75 0x00 02 GLIBC_2.2.5

Вихід ldd -vна Ubuntu 12.04:

    linux-vdso.so.1 =>  (0x00007fff225ff000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fd525c71000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd5258b4000)
/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fd525e9b000)

Version information:
/home/ruben/mingw64/x86_64-w64-mingw32/bin/as:
    libz.so.1 (ZLIB_1.2.0) => /lib/x86_64-linux-gnu/libz.so.1
    libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libz.so.1:
    libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6:
    ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
    ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2

Інші тестовані ОС - Fedora 17 (glibc 2.15) та Ubuntu 12.04 (eglibc 2.15). Вимоги до версії zlib та glibc виконуються.


це просто помилка друку чи ви насправді намагаєтеся запустити '~ / mingw64 / x86_64-w64-mingw32 / як' ... у ньому відсутня папка 'bin'.
трипледи

@tripledes тип та виправлено.
rubenvb

дивно, щойно намагався завантажити, untar під моїм ~ і я отримую очікуваний результат. Чи можете ви надати ls -l ~ / mingw64 / x86_64-w64-mingw32 / bin / як?
трипледи

1
Можливо, це невідповідність версії libc? Спробуйте запустити "objdump -p <шлях / до / як>" та перегляньте розділ "Посилання на версію". Це може виглядати так, що це залежить від GLIBC_2.14, що можна вважати досить новим. Яка версія вашої системи? "readelf -a <шлях / до / як> | менше" та grep для GLIBC, ви побачите, що він використовує memcpy від 2.14. Я не знаю, чому версія так сильно відрізняється між різними викликами бібліотеки.
svenx

Відповіді:


8

Якщо я працюю ldd -v asна своїй системі, я отримую:

./as: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./as)
        linux-vdso.so.1 =>  (0x00007fff89ab1000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f1e4c81f000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1e4c498000)
        /lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f1e4ca6d000)

Так, так, схоже, ці бінарні файли шукають GLIBC_2.14символ, якого, напевно, вам не вистачає у вашій системі. Як зазначав svenx, схоже, що він шукає memcpy@@GLIBC_2.14символ. Ще деякі відомості про те, чому memcpyотримали нову версію, описані в цьому звіті про помилки .

Встановлення нової версії glibcна вашій цільовій системі має виправити це. Якщо ви хочете спробувати відновити бінарний файл, щоб він все ще працював на старій версії glibc, ви можете спробувати хитрощі, як перелічена тут . Ви, можливо, також зможете обійтись із штрихом, який просто надає конкретну версію memcpyсимволу, який вам потрібен, але це може бути трохи покірним.


Прочитавши ваше оновлення : ви праві, це не була вашою проблемою. Але я думаю, що я знайшов це: ваш двійковий файл вимагає інтерпретатора /lib/ld-linux-x86-64.so.2, якого немає в системах Ubuntu 12.04:

$ readelf -a ./as | grep interpreter
      [Requesting program interpreter: /lib/ld-linux-x86-64.so.2]

Хоча lddзнав, що знайти його /lib64замість цього, я вважаю, що ядро ​​не знає, що коли він намагається запустити бінарний файл і не може знайти запитуваного інтерпретатора файлу. Ви можете спробувати просто запустити його через інтерпретатор вручну:

$ pwd
/home/jim/mingw64/x86_64-w64-mingw32/bin
$ ./as --version
-bash: ./as: No such file or directory
$ /lib64/ld-linux-x86-64.so.2 ./as --version
GNU assembler (rubenvb-4.7.1-1-release) 2.23.51.20120808
Copyright 2012 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `x86_64-w64-mingw32'.

Я не на 100% впевнений, що це працює правильно - у моїй системі gccтакий спосіб дає помилку в сегментації. Але це хоча б інша проблема.


1
Це було б добре, якби це було так. Дивіться оновлення:(
rubenvb

Я оновив свою відповідь.
Джим Париж

Нічого, добре. Цей вид смокче. Я не можу придумати гідного способу подолати цю проблему (і продовжувати будувати на Arch). Чи є у вас геніальні ідеї?
rubenvb

1
Не зовсім. Arch просто дурний - стандарт Filesystem Heirarchy Standard чітко говорить про те, що бібліотеки повинні працювати /lib64на amd64, і, очевидно, Arch вручну виправляє свої джерела gcc, щоб змінити це, тим самим гарантуючи несумісність з усіма іншими дистрибутивами Linux там. Дивіться коментарі цього звіту про помилку, щоб отримати їх химерні міркування. Для мене це було б явним попереджувальним знаком триматися подалі від Arch Linux.
Джим Париж

1
Однак, ви можете змінити місце перекладача за допомогою patchelf . Перегляньте цю публікацію для іншої людини, яка стикається з цією проблемою, яка стверджувала, що patchelfпрацює на них.
Джим Париж

0

Ваша проблема - це варіант отримання повідомлення "Не знайдено" під час запуску 32-розрядного бінарного файлу в 64-бітній системі : у вас є виконавчий файл, який згадує динамічний завантажувач, якого немає.

У вашому випадку динамічний завантажувач /lib/ld-linux-x86-64.so.2існує, але в іншому місці /lib64/ld-linux-x86-64.so.2. Найпростіший спосіб, щоб ваші програми працювали, було б створити символічне посилання:

ln -s ../lib64/ld-linux-x86-64.so.2 /lib/

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