相关疑难解决方法(0)

在Android L上运行本机库错误:仅支持位置独立可执行文件(PIE)

当我在Android L(Nexus 5)上运行本机代码时,我收到错误.

错误:仅支持位置独立可执行文件(PIE).

在我的三星Galaxy S3(Android 4.3)上正确执行相同的代码.

这是我的Application.mk

APP_PROJECT_PATH := $(call my-dir)/..
APP_ABI := armeabi
NDK_TOOLCHAIN_VERSION := 4.7
APP_PLATFORM := android-9
APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti
Run Code Online (Sandbox Code Playgroud)

但是,当我替换APP_PLATFORM := android-9APP_PLATFORM := android-16(正如我在这里阅读,PIE支持出现在Jelly Been(API级别16)),相同的可执行文件在Android L上正常工作.

有没有办法APP_PLATFORM := android-9在Android L上使用并运行它来编译本机代码?

android android-ndk

52
推荐指数
3
解决办法
8万
查看次数

想要编译本机Android二进制文件我可以在手机终端上运行

我已经尝试了几天来编译一个本机ARM Android二进制文件,它将使用终端应用程序在我的手机上执行.我想生成与手机上安装的标准Posix二进制文件相同类型的二进制文件,如ls,mkdir等.我已经在Mac OS X下载了Android NDK,并且能够无错误地编译简单的ELF二进制文件.但是,当我将它们转移到手机时,它们总是会出现段错误.也就是说,在GCC中使用-static编译时会出现段错误.如果我不使用-static,他们会抱怨没有链接等等.简单来说,它们不起作用.

我的假设是它们没有正确链接到Android标准C库.即使我将我的二进制文件与NDK提供的libc链接,它们仍然无法正常工作.我读到Android使用Bionic C库,并尝试下载它的源代码,但我不知道如何从它构建一个库(它似乎是所有ARM程序集).

手机上的Android C库是否与Android NDK提供的库不同?包含在NDK中的那个不允许我编译我可以通过终端执行的本机二进制文件吗?非常感谢任何指导!

更新:

我终于在Mac OS X上使用GCC 4.7.0了解它.我下载了Bionic标头,然后使用Android NDK附带的C库编译了一个动态链接的二进制文件.我能够使用手机的C lib(二进制为33K)获得一个测试应用程序在手机上工作.我还尝试静态链接NDK的C库,这也很有用.

为了使这一切正常工作,我必须将-nostdlib传递给GCC,然后手动将crtbegin_dynamic.o和crtend_android.o添加到GCC的命令行.它的工作原理如下:

$CC \
$NDK_PATH/usr/lib/crtbegin_dynamic.o \
hello.c -o hello \
$CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o
Run Code Online (Sandbox Code Playgroud)

对于静态二进制文件,请使用"crtbegin_static.o".这在crtbegin_dynamic.S/crtbegin_static.S源中进行了解释.

对于这个实验,我只使用普通的'ol GCC 4.7.0和Binutils 2.22.我还使用newlib编译了GCC,但我实际上并没有将我的ARM二进制文件与newlib链接起来.我强迫GCC/ld直接链接到随Android NDK提供的libc,或者在动态二进制文件的情况下,链接到手机上的libc.

c android gcc arm android-ndk

32
推荐指数
2
解决办法
3万
查看次数

Android上的可写和可执行位置

我使用Android NDK工具链编译了二进制文件,并尝试将其部署到设备上.使用JNI使用NDK构建的应用程序将通过本机代码执行此二进制文件.我希望避免生根设备.

二进制文件将由多个应用程序使用,因此我希望将其存储在共享位置,而不是每个应用程序存储一次.

我找不到合适的位置来部署这个二进制文件 - 这些是我尝试过的地方:

  1. / mnt/sdcard - 使用SDK中的getExternalStoragePublicDirectory(),但SD卡安装为noexec,这意味着我无法运行它.

  2. / system/bin - 只读文件系统,因此无法复制.如果我使用以下方法在模拟器上重新安装/系统,我可以使用adb push推送文件:

    mount -o rw,remount -t yaffs2 /dev/block/mtd3 /system
    
    Run Code Online (Sandbox Code Playgroud)

    但是我想避免这种情况,因为设备需要植根.

  3. / data/local - 使用adb push,我可以将二进制文件推送到此位置.但是,我似乎无法在代码中找到一种方法(使用Android SDK).内部存储机制指向/ data/data/package.

我使用NDK工具链附带的arm-linux-androideabi-g ++编译了调用此可执行文件的本机代码.这适用于/ system/bin/ data/local中的二进制文件.

总之,我正在寻找Android文件系统中的一个位置,我可以从project/assets文件夹中复制文件,这可以使用世界上可执行的权限.

filesystems android android-ndk

15
推荐指数
3
解决办法
1万
查看次数

如何为Android shell构建可执行文件

有时我需要在我的设备上运行命令或脚本,但它们不可用或不存在.

我们可以向Android设备添加一些额外的命令shell,除了那些已经可用的命令吗?

例如,将screenrecord命令添加到我的设备(我的设备的AndroidAPI低于19),这是不可用的.

我知道如何获取设备上的可用命令列表 adb shell

adb shell ls /system/bin 
Run Code Online (Sandbox Code Playgroud)

但我想添加更多的自定义命令和脚本,做一些特殊的工作.

有什么办法吗?或者这不可能?

c shell executable android android-ndk

7
推荐指数
1
解决办法
7367
查看次数

无法从adb shell运行可执行文件

我已经使用这个命令将tcpdump二进制文件添加到我的android设备中

./adb push ~/tcpdump-4.2.1/tcpdump /data/local
Run Code Online (Sandbox Code Playgroud)

二进制文件成功添加到Android设备.但是,当我尝试从adb shell执行tcpdump文件时,使用以下命令

./adb shell
cd data/local
./tcpdump
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误

/system/bin/sh: ./tcpdump: not executable: magic 7F45
Run Code Online (Sandbox Code Playgroud)

我也尝试使用chmod 777 tcpdump但是徒劳地更改权限.我该如何克服这个问题?谢谢.

shell android tcpdump adb

5
推荐指数
1
解决办法
3万
查看次数

标签 统计

android ×5

android-ndk ×4

c ×2

shell ×2

adb ×1

arm ×1

executable ×1

filesystems ×1

gcc ×1

tcpdump ×1