显示错误:仅支持位置无关的可执行文件(PIE)。
但它在4.4上运作良好。
即使我像这样更改NDK的Application.mk:
APP_PLATFORM:= android-16
APP_ABI := armeabi
我将文件推送到“system / bin”并运行,但它仍然失败。
有人知道如何通过NDK工具构建可执行文件并且可以在Android L上运行吗?
答案 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。