Я знаю, что есть похожие вопросы, но я не нашел ни решения, ни этого точного случая. Двоичный файл был построен на 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-битный кросс-компилятор с 64-битной операционной системы Linux. Распаковка ~/
дает один ~/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)
Я действительно в растерянности. Буду признателен за любую оказанную помощь.
РЕДАКТИРОВАТЬ : Еще несколько деталей: Система сборки - 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 выполнены.
Ответы:
Если я запускаю
ldd -v as
свою систему, я получаю:Так что да, похоже, что эти двоичные файлы ищут
GLIBC_2.14
символ, который, по-видимому, вам не хватает в вашей системе. Как указывал svenx, похоже, что он ищетmemcpy@@GLIBC_2.14
символ. Еще немного информации о том, почемуmemcpy
была дана новая версия, описано в этом отчете об ошибках .Установка новой версии в
glibc
вашей целевой системе должна исправить это. Если вы хотите попытаться перестроить двоичный файл, чтобы он по-прежнему работал на старой версииglibc
, вы можете попробовать трюки, подобные перечисленным здесь . Возможно, вы также можете обойтись с прокладкой, которая просто предоставляет конкретную версиюmemcpy
символа, которая вам нужна, но это становится немного хакерским.Прочитав ваше обновление : вы правы, это не было вашей проблемой. Но я думаю, что нашел: ваш бинарный файл запрашивает интерпретатор
/lib/ld-linux-x86-64.so.2
, которого нет в системах Ubuntu 12.04:Хотя я
ldd
знал, что найти его/lib64
вместо этого, я предполагаю, что ядро не знает об этом, когда пытается запустить двоичный файл, и не может найти требуемый интерпретатор файла. Вы можете попробовать запустить его через интерпретатор вручную:Я не уверен на 100%, что это работает правильно - в моей системе
gcc
такой способ дает ошибку сегментации. Но это как минимум другая проблема.источник
:(
/lib64
на amd64, и, очевидно, Arch вручную исправляет свои исходные коды gcc, чтобы изменить это, гарантируя тем самым несовместимость с любым другим дистрибутивом Linux. См. Комментарии к этому сообщению об ошибке для их причудливых рассуждений. Для меня это было бы явным предупреждением, чтобы держаться подальше от Arch Linux.patchelf
работал на них.Ваша проблема - вариант получения сообщения «Не найдено» при запуске 32-разрядного двоичного файла в 64-разрядной системе : у вас есть исполняемый файл, в котором упоминается динамический загрузчик, которого там нет.
В вашем случае динамический загрузчик
/lib/ld-linux-x86-64.so.2
существует, но в другом месте/lib64/ld-linux-x86-64.so.2
. Самый простой способ заставить ваши программы работать - создать символическую ссылку:источник