ARM板的交叉编译?

时间:2015-12-18 11:06:14

标签: linux arm cross-compiling android-kernel

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

以下是我遵循的步骤: -

make ARCH = arm CROSS_COMPILE = arm-linux-gnueabi- hello

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

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

当我在/ Linux文件夹

下的Android Linux手机中推送此二进制文件时

1- adb push hello / data

2-chmod 777 / data / hello

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

有人可以告诉我在电话上编译或运行二进制文件时我犯的错误。

运行程序时出现奇怪的错误消息,如下所示: -

root @ xxx:/ data#。/ hello

./你好

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

1 | root @ xxx:/ data #sh hello

你好

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

1 | root @ xxx:/ data#

1 个答案:

答案 0 :(得分:3)

Android需要Position Independent Code本机库。尝试将 -pie -fpie 标志添加到编译器。另一个问题可能是@Joe所描述的问题。在Android上,有一个Bionic标准库。如果你的“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)

通过发出set up Android SDK命令在mm内部使用它。

如果您想使用标准库并且出于某种原因不想使用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/