Почему я получаю сообщение об ошибке при попытке запустить этот исполняемый файл?
Я пытаюсь развернуть приложение Python 3 на встроенной машине Linux (Yocto) с архитектурой armv7. Из-за ограниченных пакетов я создаю автономный файл с помощью cx-freeze на моем raspberry pi (который имеет ту же архитектуру armv7). Теперь, если я пытаюсь запустить созданный двоичный файл на целевой машине, я получаю сообщение об ошибке, которое указывает, что исходный код был скомпилирован для другой платформы:
root@target:/media/sda/dist# ./helloworld
-sh: ./helloworld: No such file or directory
Этот исполняемый файл работает на сборочной машине.
Я сравнил выходные данные команды file с другим приложением, которое работает на целевой машине:
Это файл, который не работает:
root@target:/media/sda/dist# file helloworld
helloworld: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=99b2ae19f1e65dc26b6fd7d8b1dbc83f974830bd, stripped
И это еще один двоичный файл, который работает на целевой машине:
root@target:/usr/bin# file demo-application
demo-application: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, BuildID[sha1]=bd6660c43d9e98c59dfa8b16eb26277aa4f19949, stripped
Похоже, единственное отличие заключается в минимальной требуемой версии ядра, но uname показывает, что фактическая версия - 3.0.35:
root@target:/media/sda/dist# uname -a
Linux Target-Machine 3.0.35-Yocto-21.0-r5061-0-svn2437 #1 PREEMPT Fri Jun 19 21:40:10 CEST 2015 armv7l GNU/Linux
Вывод uname на машине сборки Raspberry Pi:
pi@raspberrypi ~/py/helloworld $ uname -a
Linux raspberrypi 3.18.11-v7+ #781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015 armv7l GNU/Linux
Что я здесь не так делаю? Это не должно быть проблемой с реальным кодом или зависимостями Python, я попробовал это с очень простым приложением helloworld с одной строкой кода.
РЕДАКТИРОВАТЬ
Вывод команды ldd на сборочной машине (exe создан с помощью nuitka):
pi@raspberrypi ~/py/helloworld/helloworld.dist $ ldd helloworld.exe
/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0x76faf000)
libdl.so.2 => /home/pi/py/helloworld/helloworld.dist/./libdl.so.2 (0x76fa4000)
libpython3.2mu.so.1.0 => /home/pi/py/helloworld/helloworld.dist/./libpython3.2mu.so.1.0 (0x76ccf000)
libstdc++.so.6 => /home/pi/py/helloworld/helloworld.dist/./libstdc++.so.6 (0x76bfd000)
libm.so.6 => /home/pi/py/helloworld/helloworld.dist/./libm.so.6 (0x76b8c000)
libgcc_s.so.1 => /home/pi/py/helloworld/helloworld.dist/./libgcc_s.so.1 (0x76b64000)
libc.so.6 => /home/pi/py/helloworld/helloworld.dist/./libc.so.6 (0x76a33000)
/lib/ld-linux-armhf.so.3 (0x76fbc000)
libz.so.1 => /home/pi/py/helloworld/helloworld.dist/./libz.so.1 (0x76a15000)
libexpat.so.1 => /home/pi/py/helloworld/helloworld.dist/./libexpat.so.1 (0x769ec000)
libpthread.so.0 => /home/pi/py/helloworld/helloworld.dist/./libpthread.so.0 (0x769cd000)
libutil.so.1 => /home/pi/py/helloworld/helloworld.dist/./libutil.so.1 (0x769c2000)
РЕДАКТИРОВАТЬ 2
Я старался nuitka
скомпилировать код Python и создать отдельное приложение, используя:
nuitka --standalone --recurse-all helloworld.py
который создает исполняемый файл helloworld.exe вместе со всеми скомпилированными файлами библиотеки (.so). Тем не менее, на целевой машине, когда я пытаюсь запустить это, я все равно получаю:
root@target:~/helloworld/helloworld.dist# ./helloworld.exe
-sh: ./helloworld.exe: No such file or directory
К сожалению, я не могу запустить ldd
или же readelf
команда на целевом компьютере, потому что их пакеты отсутствуют.
РЕДАКТИРОВАТЬ 3
Кажется, что действительно не хватает некоторых библиотек. В экспериментальных целях я скопировал файл ld-linux-armhf.so.3 из raspi во встроенную систему, и он показал другую ошибку (отсутствует другая библиотека). Я думаю, что другая проблема заключается в том, что Raspberry Pi использует hardfloat (armhf), в то время как встроенная система использует softfloat... Я не думаю, что смогу заставить это работать таким образом.
РЕДАКТИРОВАТЬ 4 Я использую другую платформу и ОС сейчас, и все работает, поэтому вопрос больше не актуален для меня.
1 ответ
Запустите эту команду на вашей целевой машине:
chmod +x helloworld
Это делает ваш файл исполняемым.