【问题标题】:Cross compiling static C hello world for Android using arm-linux-gnueabi-gcc使用 arm-linux-gnueabi-gcc 为 Android 交叉编译静态 C hello world
【发布时间】:2012-03-08 15:32:25
【问题描述】:

我想使用 arm-linux-gnueabi-gcc 从 C 构建一个静态的 hello world,而不是使用 NDK 独立工具链或 Codesourcery。

在 Ubuntu 中...

我做了以下事情:

sudo apt-get install gcc-arm-linux-gnueabi

我创建了一个这样的 hi.c:

#include <stdio.h>

int main(int argc, char** argv) {
   printf("hello world\n");
   return 0;
}

我是这样编译的:

arm-linux-gnueabi-gcc -static hi.c -o hi 

我在这样的模拟器上运行它:

adb push hi /data/hi
adb shell /data/hi

但是,我明白了:

[1]   Illegal instruction     /data/hi

我忘记了哪一步?根据过去的经验,这个“应该”是有效的,但我显然搞砸了。

【问题讨论】:

  • 顺便说一句.. 在 Ubuntu Oneiric Ocelot 上执行此操作。另外,arm-linux-gnueabi-gcc 是 gnueabi-gcc 4.6 版本的链接。
  • 你的 Ubuntu 版本是多少? SDK 版本或其他模拟器详细信息是什么?

标签: android c android-ndk arm cross-compiling


【解决方案1】:

据我所知,您不能在未使用某种形式的 gcc-arm-linux-androideabi 编译的 Android 中运行用户级应用程序。

【讨论】:

  • 这是使用相同的工具链、代码源等完成的。只是寻找缺少的步骤。
  • 错了。例如,与 armv5tel-redhat-linux-gnueabi-gcc 一起使用。只要您编译静态二进制文件并且架构正确,它就可以工作。
【解决方案2】:

尝试指定架构/cpu。听起来编译器正在创建架构版本高于模拟器可以处理的代码。

这可能有效:

arm-linux-gnueabi-gcc -static -march=armv5 hi.c -o hi

【讨论】:

  • 感谢您的回复。立即结果(将挖掘更多),得到警告:目标 CPU 不支持 THUMB 指令[默认启用]。但它仍然会产生结果。然后,如果我将其推送到设备上,我会收到相同的非法指令。
  • 如果我使用 -march=armv5te 我没有收到警告,但仍然收到非法指令错误。如果我使用 -march=armv5te -mthumb 类似。
  • 可能是 arm-linux-gnueabi-gcc 的标准库使用了比模拟器更高的架构(虽然这听起来很奇怪)。使用 CodeSourcery 为具有 ARMv4 cpu 的设备进行编译时,我们遇到了同样的错误。显然 CodeSourcery 库都是 ARMv5。
  • 我们的“解决方案”不是与 CodeSourcery 交叉编译,而是在设备上编译(运行某种 Linux 并安装了 gcc)。可能对您没有太大帮助,因为我们并没有真正解决问题,并且不确定如何确认这是否是问题。
  • 你是对的,linaro 工具链附带的 libc 是为 v7.0 构建的。因此,它将使用您请求的架构编译您的代码,但是当它链接时,它将使用任何库或您的代码使用的最高架构。
【解决方案3】:

您是否检查过数据文件夹的权限?尝试使用本地代替!您可以只使用 adb shell,然后 cd 进入推送可执行文件的文件夹并尝试 ./hi。我想这只是一个权限问题

【讨论】:

  • 难道不应该抱怨权限被拒绝而不是非法指令吗?我认为我从来没有收到过“非法指令”,除非它确实是二进制文件的某种问题。
【解决方案4】:

如果我在 Debian 机器(在我的例子中是虚拟机)上执行此操作,一切似乎都很好。我不确定在 ubuntu 上做类似的事情有什么问题。可能就像 Leo 建议的那样,但我无法确认。不过这应该对你有用。

http://www.cnx-software.com/2012/01/16/installing-emdebian-arm-cross-toolchain-in-debian/

有人添加了这个链接,但它没有使用我在描述中提到的工具链。留下它以防万一有人感兴趣。

http://tariqzubairy.wordpress.com/2012/03/09/arm-binaries-static-library-for-android/

【讨论】:

    【解决方案5】:

    它在 ubuntu 桌面上使用 CodeBench 编译器对我有用。 https://sourcery.mentor.com/sgpp/lite/arm/portal/release2029

    只需使用以下命令创建一个静态二进制文件:

    arm-none-linux-gnueabi-gcc -o hello -static hello.c
    

    然后推送到手机

    adb push hello /data/local/tmp
    

    去运行它:

    adb shell
    $ chmod 755 /data/local/tmp/hello
    $ /data/local/tmp/hello
    

    这将在终端上打印 Hello World。同样可以通过电话完成。使用终端模拟器或 SL4A bash shell 执行。

    【讨论】:

    • 这应该是公认的答案,尽管请解释命令及其参数。
    【解决方案6】:

    您的代码实际上对我有用。

    我在 Ubuntu 上编译并推送到 /data/local/tmp

    然后 chmod 777 hi

    终于成功了。

    【讨论】:

    • 我发现(不确定这是否仍然正确)ubuntu 默认抓取的交叉编译器仅支持硬浮点,而我的设备是旧的,无法使用。
    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多