【问题标题】:ndk can't get executable filendk 无法获取可执行文件
【发布时间】:2015-02-14 14:05:57
【问题描述】:

只需使用 android ndk 构建一个简单的“helloworld”,但我得到了我应该获取可执行文件的碎片对象。在我将此文件推送到我的手臂模拟器后,我遇到了分段错误,但真实设备是可以的。有什么问题? 这是我的操作系统版本:

Darwin avator 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64 i386 MacBookPro11,1 Darwin

这是我的Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := test-libstl
LOCAL_SRC_FILES := test-libstl.cpp
include $(BUILD_EXECUTABLE)

ndk-build之后,我得到了文件:

$file ../libs/arm64-v8a/test-libstl
../libs/arm64-v8a/test-libstl: ELF 64-bit LSB shared object, version 1 (SYSV), dynamically linked (uses shared libs), stripped

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    尝试使用 LOCAL_LDFLAGS := -static

    它帮助我获得一个ELF 64 位LSB 可执行文件

    【讨论】:

      【解决方案2】:

      这本身不是错误 - 它只是 file 实用程序将位置无关的可执行文件 (PIE) 解释为共享对象 - 您的可执行文件已经构建得很好。

      只有 Android 4.1 和更新版本支持 PIE 可执行文件,在 5.0 上,不再允许非 PIE 可执行文件 - 这可能是您无法在模拟器中运行它的原因。有关此问题的更多详细信息,请参阅Running a native library on Android L. error: only position independent executables (PIE) are supported。如果您在 NDK 中的目标平台是 Android 4.1 或更高版本 (android-16),则将在启用 PIE 的情况下构建可执行文件。

      【讨论】:

      • 这对我很有帮助,我的模拟器版本是 4.0,真实设备是 4.4。还有两个问题:1. PIE 在 android 4.1 及更高版本上是必须的吗? 2.我有另一个文件可以在我的模拟器 4.0 上运行,file 显示:ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped,我对此有点困惑。这个文件是 PIE 吗?谢谢。
      • 不,PIE 在 android 4.1 上不是必须的,但在 5.0 上是必须的。第二个文件,file 说是可执行文件,不是 PIE,不会在 5.0 上运行。
      • 如何构建可以在 Android 4.0 上运行的非 PIE 可执行文件?我尝试在 Application.mk 中设置 APP_PIE := falseAPP_PLATFORM := android-9,但它没有生效。而且我的 ndk 是 r10 .
      • 设置APP_PIE := false似乎没有任何作用-您只能在尚未启用的情况下使用APP_PIE := true启用它。但是Application.mk 中的APP_PLATFORM := android-9 确实应该有效——当我在本地尝试时它确实有效。您确定Application.mk 放置正确(在jni 子目录中)吗?尝试在您的 ndk-build 调用末尾添加 NDK_LOG=1 以获取更多日志记录,这可能会为正在发生的事情提供线索。
      • Application.mk 是它应该的位置,并添加 NDK_LOG=1 给出这样的相对值:Android NDK: APP_PIE is false Android NDK: Application local targets unknown platform 'android-9' Android NDK: Switching to android-L
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多