可执行文件无法在Android L上运行

时间:2014-09-17 06:19:23

标签: android android-ndk android-5.0-lollipop

显示错误:仅支持位置无关的可执行文件(PIE)。

但它在4.4上运作良好。

即使我像这样更改NDK的Application.mk:

APP_PLATFORM:= android-16
APP_ABI := armeabi

我将文件推送到“system / bin”并运行,但它仍然失败。

有人知道如何通过NDK工具构建可执行文件并且可以在Android L上运行吗?

3 个答案:

答案 0 :(得分:0)

错误表明二进制文件必须构建为PIE。因此,在Android.mk中添加以下标志:

LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE

答案 1 :(得分:0)

简单地忽略Application.mk中定义的LOCAL_XXX变量。 您必须在位于Android.mk文件中的模块定义中使用它们。

另一种方法是在Application.mk中使用APP_CFLAGS和APP_LDFLAGS,这些将影响由ndk-build编译的所有模块。

答案 2 :(得分:0)

是的,我几周前修好了。

如果您使用NDK,也许您可​​以发表评论,下载最新的NDK,我尝试下载10C。

From 4b673bc0e1f94c06d15ffc1c8ab8feeac4de5170 Mon Sep 17 00:00:00 2001
Date: Tue, 28 Oct 2014 14:38:00 +0800
Subject: [PATCH] 1 fPIE 2 APP_ABI enable forcely.

---
 android-ndk-r10c/build/core/build-binary.mk |    6 ++++--
 android-ndk-r10c/ndk-build                  |    5 ++++-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/android-ndk-r10c/build/core/build-binary.mk b/android-ndk-r10c/build/core/build-binary.mk
index 661ca98..59ff54a 100644
--- a/android-ndk-r10c/build/core/build-binary.mk
+++ b/android-ndk-r10c/build/core/build-binary.mk
@@ -206,15 +206,17 @@ else
   LOCAL_CFLAGS += $($(my)FORMAT_STRING_CFLAGS)
 endif

+#LOCAL_CFLAGS += -fPIE
+#LOCAL_LDFLAGS += -fPIE -pie
 # enable PIE for executable beyond certain API level, unless "-static"
-ifneq (,$(filter true,$(NDK_APP_PIE) $(TARGET_PIE)))
+#ifneq (,$(filter true,$(NDK_APP_PIE) $(TARGET_PIE)))
   ifeq ($(call module-get-class,$(LOCAL_MODULE)),EXECUTABLE)
     ifeq (,$(filter -static,$(TARGET_LDFLAGS) $(LOCAL_LDFLAGS) $(NDK_APP_LDFLAGS)))
       LOCAL_CFLAGS += -fPIE
       LOCAL_LDFLAGS += -fPIE -pie
     endif
   endif
-endif
+#endif

 #
 # The original Android build system allows you to use the .arm prefix
diff --git a/android-ndk-r10c/ndk-build b/android-ndk-r10c/ndk-build
index 62d6dc8..e3663da 100755
--- a/android-ndk-r10c/ndk-build
+++ b/android-ndk-r10c/ndk-build
@@ -243,7 +243,8 @@ if [ "$OSTYPE" = "cygwin" ] ; then
     log "Cygwin-compatible GNU make detected"
 fi

-if [ "$NDK_ANALYZE" = 1 ]; then
+if [ "$NDK_ANALYZE" != 1 ]; then
+echo "ndk analysis if"
     . $PROGDIR/build/tools/dev-defaults.sh  # for DEFAULT_LLVM_VERSION

     # Find perl.  If HOST_PERL is defined, check that it points to a valid file
@@ -311,6 +312,7 @@ if [ "$NDK_ANALYZE" = 1 ]; then
     }

     APP_ABIS=`get_build_var APP_ABI`
+    echo "app abis: ${APP_ABIS}"
     for ABI in $APP_ABIS; do
         TOOLCHAIN_PREFIX=`get_build_var_for_abi TOOLCHAIN_PREFIX $ABI`
         PERL5LIB="$HOST_PERL_LIB" "$HOST_PERL" $PROGDIR/prebuilt/common/scan-build/scan-build \
@@ -321,6 +323,7 @@ if [ "$NDK_ANALYZE" = 1 ]; then
             $GNUMAKE -f $PROGDIR/build/core/build-local.mk "$@" APP_ABI=$ABI
     done
 else
+    echo  "ndk analysis else"
     $GNUMAKE -f $PROGDIR/build/core/build-local.mk "$@"
 fi

-- 
1.7.9.5

编译完成后,获取二进制文件库或可执行文件。您可以使用readelf -all进行检查 通过检查精灵的HEAD,PIE是否有效。 http://blog.fpmurphy.com/2008/06/position-independent-executables.html