Android 关于NDK Clang3.4 编译可执行文件无法启动的问题

1. 发现问题

今天遇到一个奇怪的问题:编写了一个C 的可执行二进制文件,利用ndk-build 编译后,调用如下代码执行该文件:

        public void run() {
            Process process = null;
            try {
                process = Runtime.getRuntime().exec(“/data/data/package-name/files/myBinFile”);
                if (process != null) {
                    exit = process.waitFor();
                }
            } catch (Throwable t) {
 
            }
        }

发现在较老的机器上(Android OS <= ANDROID2.3)总是会失败:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'qcom/msm7627a/msm7627a:4.0.4/IMM76I/apkhot_xiumu_V0310:user/test-keys'
pid: 11987, tid: 11987 >>> ./myBinFile <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00003e5c
r0 70000001 r1 b00094fc r2 00000000 r3 00003e5c
r4 b000a078 r5 ffffffff r6 00003e5c r7 be8a7b98
r8 b0009910 r9 00000000 10 00000000 fp b0006e2b
ip 00003001 sp be8a7b58 lr 00002ce2 pc b00042c0 cpsr 00000030
d0 0000000000000000 d1 0000000000000000
d2 0000000000000000 d3 0000000000000000
d4 0000000000000000 d5 0000000000000000
d6 0000000000000000 d7 0000000000000000
d8 0000000000000000 d9 0000000000000000
d10 0000000000000000 d11 0000000000000000
d12 0000000000000000 d13 0000000000000000
d14 0000000000000000 d15 0000000000000000
d16 0000000000000000 d17 0000000000000000
d18 0000000000000000 d19 0000000000000000
d20 0000000000000000 d21 0000000000000000
d22 0000000000000000 d23 0000000000000000
d24 0000000000000000 d25 0000000000000000
d26 0000000000000000 d27 0000000000000000
d28 0000000000000000 d29 0000000000000000
d30 0000000000000000 d31 0000000000000000
scr 00000000

#00 pc b00042c0 /system/bin/linker
#01 lr 00002ce2 <unknown>
而在高版本的机器上(Android OS > ANDROID2.3)却可以成功执行。百思不得其解,但怀疑肯定跟 android ndk 的编译环境有关。

于是将代码copy到同事的机器上用ndk 编译,奇迹发生了:同事的机器编译出来的BIN 文件却可以在ANDROID2.3 成功运行,为什么我的机器上编译出来的就不能运行呢?

后来发现我本地机器安装的NDK 版本是 ndk-r10d 而同事机器上安装的NDK 版本是 ndk-r9d。那么这两个版本的NDK编译出来的BIN文件到底有什么区别呢?

2. 分析问题

经过上面的对比分析,初步排除是BIN自身代码的问题,确定是跟编译器编译相关。接着用010 EDITOR打开ALIROOT_BIN文件,用ELF模板解析,发现其格式为:

天啊,三观崩溃,这是一个SO文件,但在高版本(Android OS > ANDROID2.3)的机器上可以直接执行。终于找到问题所在了,但仍有两个问题不解:

1. 明明指定编译输出为include $(BUILD_EXECUTABLE),怎么最终却编译生成Shared Library SO文件呢?ndk-r9d版toolchain 中的 Clang3.4 编译器没有这个问题,而ndk-r10d 版的toolchain 中的 Clang3.4 编译器存在这个问题。(Android NDK 这是要逆天了!)

2. 为什么SO格式的文件在Android 高版本(Android OS > ANDROID2.3)的机器上仍然可以直接执行?按理说是不能执行的才对啊,看来是我太孤陋寡闻了!

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog -ldl 
LOCAL_CFLAGS += -DHAVE_PTHREADS -DANDROID
LOCAL_ARM_MODE := arm
LOCAL_SRC_FILES := myBinFile.c
LOCAL_MODULE := myBinFile
include $(BUILD_EXECUTABLE)
Application.mk

APP_PLATFORM := android-8
NDK_TOOLCHAIN_VERSION=clang3.4

3. 解决问题

通过将Application.mk里的NDK_TOOLCHAIN_VERSION=clang3.4一行去掉,使得NDK采用默认GCC编译器编译,问题解决!

Application.mk

APP_PLATFORM := android-8
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值