一、准备工作

1、交叉编译工具

下载/生成android ndk,我使用的是android-ndk-r12b,平台支持从android-9到android-24

二、编译过程

1、指定编译工具链

CC_HOME=/home/waitor/tool/android-ndk-r12b
BIN_PATH=$(CC_HOME)/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/binCC=${BIN_PATH}/aarch64-linux-android-gcc
CXX=${BIN_PATH}/aarch64-linux-android-g++
AS=${BIN_PATH}/aarch64-linux-android-as

2、汇编选项

CFLAGS=-O3 -Wall -I ${CC_HOME}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/lib/gcc/aarch64-linux-android/4.9.x/include -I ${CC_HOME}/sources/cxx-stl/system/include -I ${CC_HOME}/sources/cxx-stl/stlport/stlport  --sysroot=${NDK_HOME}/platforms/android-21/arch-arm64

注:由于从android-21才开始支持arm64,所以低版本有可能不兼容。

3、链接选项

LFLAGS=--sysroot=${NDK_HOME}/platforms/android-21/arch-arm64 -lsupc++ -L $(CC_HOME)/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a

若还需要链接其他库,需要在ndk中寻找;在ndk中找不到libxxx.so时应更新ndk版本,或者自己编译好后直接动态链接。

4、编译与链接

src=test.c tool.c src.c
objs=test.o tool.o src.o
out=libtest.so#=========================
%.o: %.c$(CC) -fPIC -share $(CFLAGS) -c -o $@ $<$(out): $(objs)$(CC) $(CFLAGS) -share -fPIC $(out) $(objs) $(LFLAGS)

5、验证

对生成的%.o 和libxx.so用file命令查看

ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), not stripped

可以看到生成的是64位ELF文件。

三、问题总结

1、unknown mnemonic `xxxx'

原因为目标架构不支持该汇编指令,需要手动调整汇编代码,或者重新生成汇编代码。某些框架编译时其文件目录就包含有多种架构多种指令集,如armv4、x86、x86_64、v8-armx-64、ia64等命名文件,只需要在编译时指定编译该文件即可。

aarch64-linux-android-gcc交叉编译android 64位动态库相关推荐

  1. Android 11中对于64位应用arm执行MTE导致crash的问题

    前言 App 64位包在Android 11上crash,崩溃堆栈也很诡异,报了一个native的空指针,代码中一个函数参数为int64_t类型的指针,并且确定不为空! 分析 在仔细调试时,发现函数中 ...

  2. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  3. linux内核学习之三:linux中的32位与64位

    linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...

  4. kali debian 安装mysql_在Kali Linux和Debian 8/9 64位上安装Wine的方法

    本文介绍在Kali Linux和Debian 8/9 64位系统上安装Wine的简单方法,其它系统参考在Ubuntu 18.04/Linux Mint 19中安装Wine 4的方法. 在Kali Li ...

  5. Sublime Text 2 - 性感无比的代码编辑器!程序员必备神器!跨平台支持Win/Mac/Linux,支持32与64位,支持各种流行编程语言的语法高亮、代码补全等...

    Sublime Text 2 - 性感无比的代码编辑器!程序员必备神器!跨平台支持Win/Mac/Linux,支持32与64位,支持各种流行编程语言的语法高亮.代码补全等-- 语法高亮.代码提示补全. ...

  6. XCTF-攻防世界CTF平台-Reverse逆向类——56、tar-tar-binks(Mac平台下的64位动态链接共享库.dylib逆向)

    目录标题 一.解压缩 二.查看文件 三.分析程序 四.程序主要逻辑: 五.逆向思路: 步骤一: 步骤二: 六.解密代码: 题目提供了两个文件flag.tar和libarchive.dylib 一.解压 ...

  7. Irvine64链接库过程的使用说明 Microsoft x64 调用规范 添加Irvine64.obj 64位链接库错误及解决方法

    Irvine64链接库 Crlf 向控制台写一个行结束的序列 Random64 在0到264−12^64-1264−1内,生成一个64位的伪随机整数.用rax返回值 Randomize 随机种子 Re ...

  8. linux系统gcc编译.c文件没有标准库解决

    linux系统gcc编译.c文件没有标准库解决 现象描述 解决过程 总结 现象描述 当安装好linux系统后(比如ubuntu),通过gcc -v 查看gcc编译器版本已经是最新的了,然后gcc a. ...

  9. Android编译32或64位程序

    ★★★ 个人博客导读首页-点击此处 ★★★ 1.查看一个程序是32位还是64位: $ readelf -h tee-supplicant ELF Header: Magic: 7f 45 4c 46 ...

最新文章

  1. ContentProvider是如何实现数据共享的
  2. Python、Unicode和中文
  3. springboot配置内部配置类
  4. 显示设备不属于微型计算机的外部设备,微型计算机常用外部设备试题解析
  5. [SDOI2015]约数个数和
  6. 详解 QT 主要类 QWidget
  7. 中国互联网史是一部流氓史
  8. 远程控制篇:抓取远程屏幕图像
  9. PADS 管脚编号全部修改方式
  10. 怎么用数学绘图软件制作正方体展开动画?
  11. 5 个关键点!优化你的 UI 原型设计
  12. guid主分区表损坏如何处理_guid主分区表损坏如何处理_windows10系统硬盘分区表损坏修复教程...
  13. c语言赋值语句逗号,C++中赋值运算符与逗号运算符的用法详解
  14. 产品狗的Python之路(1):按照行数将excel表格拆分成多个
  15. [python] ​python-pinyin库
  16. 与世界对话丨预康可瘦品牌发布暨全国招商会隆重举行
  17. 印度人的1919乘法
  18. C#输入三条边判断是否为三角形
  19. 使用Webcam完成拍照功能
  20. 华中科技大学有计算机科学与技术学院导师,华中科技大学计算机科学与技术学院导师简介-徐鹏...

热门文章

  1. 数据分析面试题最全攻略
  2. 中兴管理层换血 5G时代复兴静待爆发
  3. 从苏宁电器到卡巴斯基第23篇:难忘的三年硕士时光 I
  4. c# XML反序列化 修改前缀
  5. apap图像全景拼接
  6. adams如何保存_ADAMS后处理
  7. 产品 电信nb接口调用_艾礼安NB—IoT产品通过中国电信物联网开放平台接入认证...
  8. 那个爆火的“梦中修炼”AI,你也能用Keras搭一个了
  9. 如果你看不懂别人画的 UML 类图,看这一篇文章就够了
  10. html用文本档案设置表格,phpspreadsheet 中文文档(四) 建立电子表格+档案格式