为啥在尝试运行此可执行文件时出现错误?
Posted
技术标签:
【中文标题】为啥在尝试运行此可执行文件时出现错误?【英文标题】:Why do I get an error when trying to run this executable file?为什么在尝试运行此可执行文件时出现错误? 【发布时间】:2015-08-24 16:59:25 【问题描述】:我正在尝试将 python 3 应用程序部署到具有 armv7 架构的嵌入式 linux (Yocto) 机器。由于软件包有限,我在我的树莓派(具有相同的 armv7 架构)上创建了一个带有 cx-freeze 的独立文件。现在,如果我尝试在目标机器上运行创建的二进制文件,我会收到一个错误,表明源代码是为另一个平台编译的:
root@target:/media/sda/dist# ./helloworld
-sh: ./helloworld: No such file or directory
这个可执行文件在构建机器上工作。
我已经将文件命令的输出与在目标机器上运行的另一个应用程序进行了比较:
这是不起作用的文件:
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输出:
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命令的输出(用nuitka创建的exe):
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 复制到嵌入式系统,它显示了一个不同的错误(缺少另一个库)。我认为另一个问题是树莓派使用 hardfloat (armhf) 而嵌入式系统使用 softfloat.. 我认为我不能让它以这种方式工作。
编辑 4 我现在正在使用另一个平台和操作系统,一切正常,所以这个问题与我不再相关。
【问题讨论】:
如果你在二进制文件上运行 ldd 命令,输出是什么? @ojblass 它说:root@target:/media/sda/dist# ldd helloworld -sh: ldd: command not found
@ojblass 编辑了我的问题
sda是什么样的分区?分机(2,3,4),NTFS?如果是 NTFS,它将无法正常工作
@cookiesoft 当我尝试从 root-home 运行它时出现同样的错误:root@target:~/dist# ./helloworld -sh: ./helloworld: No such file or directory
【参考方案1】:
在你的目标机器上运行这个命令:
chmod +x helloworld
它使您的文件可执行。
【讨论】:
以上是关于为啥在尝试运行此可执行文件时出现错误?的主要内容,如果未能解决你的问题,请参考以下文章
尝试运行可执行 Python 脚本时出现致命的 Python 错误