基于Android arm64 可执行程序的编译运行

Android默认编译的应用程序动态链接的一般都是PIE,前文“基于Android arm64 Linux got 调试”,每次调试都要查看加载地址,于是就想能否编译生成非PIE的应用程序。

/opt/android-6.0.1_r9/external/hello$ mmm ./ showcommands 2>&1 | tee build.log

查看build.log

prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-g++ -pie -nostdlib -Bdynamic -Wl,-dynamic-linker,/system/bin/linker64 -Wl,--gc-sections -Wl,-z,nocopyreloc  -Lout/target/product/generic_arm64/obj/lib -Wl,-rpath-link=out/target/product/generic_arm64/obj/lib out/target/product/generic_arm64/obj/lib/crtbegin_dynamic.o             out/target/product/generic_arm64/obj/EXECUTABLES/hello_intermediates/hello.o          -Wl,--whole-archive   -Wl,--no-whole-archive   out/target/product/generic_arm64/obj/STATIC_LIBRARIES/libcompiler_rt-extras_intermediates/libcompiler_rt-extras.a    prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/../lib/gcc/aarch64-linux-android/4.9.x-google/../../../../aarch64-linux-android/lib/../lib64/libatomic.a prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/../lib/gcc/aarch64-linux-android/4.9.x-google/libgcc.a -lutils -lcutils -lc++ -ldl -lc -lm  -o out/target/product/generic_arm64/obj/EXECUTABLES/hello_intermediates/LINKED/hello  -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--build-id=md5 -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,-maarch64linux -Wl,--hash-style=gnu -Wl,--fix-cortex-a53-843419  -Wl,--allow-shlib-undefined    -Wl,--no-undefined out/target/product/generic_arm64/obj/lib/crtend_android.o 

果然有-pie参数。在android编译根路径输入去除-pie参数的命令:

/opt/android-6.0.1_r9$ prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-g++  -nostdlib -Bdynamic -Wl,-dynamic-linker,/system/bin/linker64 -Wl,--gc-sections -Wl,-z,nocopyreloc  -Lout/target/product/generic_arm64/obj/lib -Wl,-rpath-link=out/target/product/generic_arm64/obj/lib out/target/product/generic_arm64/obj/lib/crtbegin_dynamic.o             out/target/product/generic_arm64/obj/EXECUTABLES/hello_intermediates/hello.o          -Wl,--whole-archive   -Wl,--no-whole-archive   out/target/product/generic_arm64/obj/STATIC_LIBRARIES/libcompiler_rt-extras_intermediates/libcompiler_rt-extras.a    prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/../lib/gcc/aarch64-linux-android/4.9.x-google/../../../../aarch64-linux-android/lib/../lib64/libatomic.a prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/../lib/gcc/aarch64-linux-android/4.9.x-google/libgcc.a -lutils -lcutils -lc++ -ldl -lc -lm  -o out/target/product/generic_arm64/obj/EXECUTABLES/hello_intermediates/LINKED/hello  -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--build-id=md5 -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,-maarch64linux -Wl,--hash-style=gnu -Wl,--fix-cortex-a53-843419  -Wl,--allow-shlib-undefined    -Wl,--no-undefined out/target/product/generic_arm64/obj/lib/crtend_android.o 

查看编译结果
这里写图片描述

模拟器运行试试:
这里写图片描述
够狠,不支持。反正只是调试,不做产品。看看改改链接源程序行不行。

修改bionic/linker/linker.cpp

#if 0
  if (elf_hdr->e_type != ET_DYN) {
    __libc_format_fd(2, "error: only position independent executables (PIE) are supported.\n");
    exit(EXIT_FAILURE);
  }
#else
 if (elf_hdr->e_type != ET_DYN) {
    __libc_format_fd(2, "warnning: only position independent executables (PIE) are supported. Just ignore temporarily.\n");
  }
#endif

编译重新运行:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值