2015-12-18 298 views
1

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

下面是步骤我都遵循: -

使ARCH =手臂CROSS_COMPILE = ARM-Linux的gnueabi-你好

现在你好是成功打造,当我使用检查打招呼的文件类型文件命令: -

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

当我的Android Linux的电话推该二进制下/数据文件夹

1- ADB推你好/数据

2- CHMOD 777 /数据/你好

3- ./hello(但这里你好是不能运行)

有人可以给我提示,当我在电话上编译或运行二进制文件时,我正在犯什么错误。

我得到奇怪的错误信息,同时运行的程序如下图所示: -

根@ XXX:/数据#./hello

./hello

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

1 |根@ XXX:/数据#SH你好

SH你好

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

1 |根@ XXX:/数据#

+0

你有arm编译的libc吗? – Joe

+0

@Joe我无法理解你的观点 –

回答

3

的Android需要Position Independent Code为本地库。尝试将-pie -fpie标志添加到编译器。另一个问题可能是@Joe描述的问题。在Android上,有一个Bionic标准库。如果你的“你好”的程序不使用任何标准电话,你可以尝试没有标准库编译(使用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命令使用它里面已经set up 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/