1

我试图将一个简单的 hello 程序交叉编译为独立的应用程序,它将在 arm 板上作为二进制文件运行,但是在 arm 板上运行 hello 二进制文件时遇到了问题。

以下是我遵循的步骤: -

使 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-你好

现在,当我使用文件命令检查 hello 的文件类型时,hello已成功构建:-

$file hello hello:ELF 32 位 LSB 可执行文件,ARM,版本 1 (SYSV),静态链接,适用于 GNU/Linux 2.6.31,BuildID[sha1]=0x68edccf6dba1057774e3d7853914578e53889a75,未剥离

当我在 /data 文件夹下的 Android Linux 手机中推送此二进制文件时

1-亚行推你好/数据

2-chmod 777 /数据/你好

3- ./hello (但这里 hello 无法运行)

有人可以提示我在手机上编译或运行二进制文件时犯了什么错误。

我在运行程序时收到奇怪的错误消息,如下所示:-

root@xxx:/data # ./你好

。/你好

打开失败:没有这样的文件或目录

1|root@xxx:/data #你好

你好

你好[1]:语法错误:'☺üê4┤¡♣☻♣4'意外

1|root@xxx:/数据#

4

1 回答 1

3

Android 需要本地库的位置无关代码。尝试将-pie -fpie标志添加到编译器。另一个问题可能是@Joe 描述的问题。在 Android 上,有一个仿生标准库。如果您的“hello”程序不使用任何标准调用,您可以尝试不使用标准库进行编译(使用 NDK 中提供的工具链):

arm-linux-androideabi-g++ -pie -fpie -nostdlib hello.c -o hello

然而,更好的选择是创建一个简单的Android.mk文件:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS) 
LOCAL_SRC_FILES:= hello.c
LOCAL_MODULE_TAGS:= test
LOCAL_MODULE:= hello
include $(BUILD_EXECUTABLE)

并通过发出mm命令在已经设置好的 Android SDK中使用它。

但是,如果您想使用标准库并且由于某种原因不想使用 Android.mk,那么您可以下载(并构建)所有 Android 源并将包含路径传递给 gcc(示例):

arm-linux-androideabi-g++ -pie -fpie --sysroot=<path_to_android_sources>/out/target/product/<product>/obj/
-I<path_to_android_sources>/bionic/libc/arch-arm/include/ -I<path_to_android_sources>/bionic/libc/include/
-<path_to_android_sources>/bionic/libstdc++/include/
于 2015-12-18T16:31:31.993 回答