我试图交叉编译一个简单的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#
答案 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/