尝试在Android设备上执行Linux二进制文件时出现“没有这样的文件或目录”错误。

29

我使用Android GCC工具链(纯Linux,没有Android或NDK)构建了一个本地的Linux ARM二进制文件。

我通过adb shell从我的PC连接到运行Android 4的平板电脑。我"adb push"这个二进制文件到该设备的/system/bin目录下,希望能够在那里执行它。我使用chmod 777进行标记为可执行文件。

如果我尝试执行它,我会收到“没有这样的文件或目录”的错误提示。

更多信息: 这个小程序使用fc和fm库。由于ARM工具链似乎没有crt1(根据我找到的一个示例,crt1通常包含启动代码),我们在包含它的文件中搜索,在android构建中找到了crtbegin_dynamic和crtend_dynamic,但对于_static等效项,一对中缺少了一个,因此我没有将-static传递给GCC。它是使用“-nostdlib”构建的。

问题可能是什么?


4
要查找可执行文件的依赖项,您需要使用“nm”或类似工具,但实际上,除非您坚持采用较困难的方式,否则应仅使用NDK gcc构建Android。请注意,尽管莫名其妙地吸引了一个完全不同主题的热门答案,但此问题与开发机器缺少库无关。 - Chris Stratton
2个回答

48

如果您在类似Ubuntu 64的64位平台上工作,那么这个提示可能会帮助您解决问题。只需尝试使用apt-get安装i386 32位兼容性库:

sudo apt-get install ia32-libs

对我非常有效。如果您遇到同样的麻烦,请告诉我。

适用于Ubuntu 13.10或更高版本

如aditya在这个答案的评论中所说:

从Ubuntu 13.10开始,现在必须运行以下命令: sudo apt-get install lib32z1,你可能还需要获取C++ stdlibs,使用以下命令:sudo apt-get install lib32ncurses5 lib32stdc++6


11
在 Ubuntu 13.10 及以后的版本中,看起来 ia32-libs 已经被以下软件包替代了。现在必须运行以下命令:sudo apt-get install lib32z1我还需要获取 C++ stdlibs,使用以下命令:sudo apt-get install lib32ncurses5 lib32stdc++6 - aditya
5
虽然这可能有助于其他人在Ubuntu Linux系统上运行adb可执行文件,但它似乎与所问的问题没有任何关系,该问题涉及在Android本身下运行二进制文件。毋庸置疑,Android不使用debian风格的打包系统。 - Chris Stratton

2
为了补充aditya上面的评论,你也可以在Ubuntu 13.10中使用以下内容来处理C++ stdlibs:
sudo apt-get install lib32ncurses5 libstdc++6:i386

2
这与所提问的问题无关,该问题涉及在Android本身上运行可执行文件 - 这是一个不使用debian包装系统的Linux。 - Chris Stratton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接