补坑计划——ARM(一)

开始进入移动安全这个坑的时候,并没有好好看ARM汇编。依靠x86的基础和ARM手册,各种博客上零星的知识点外加搜索引擎也就这么过来了。最近想稍微抽空重新过一遍ARM汇编,查漏补缺,或者应该算女娲补天。。。


处理器工作模式

用户模式(usr):正常的程序执行状态

快速中断模式(fiq):用于高速数据传输或者通道处理

外部中断模式(irq):用于通用的中断处理

管理模式(svc):保护模式

中断模式(abt):当指令或者数据预取终止时进入,用于虚拟存储及存储保护

未定义指令模式(und):当未定义的指令执行时进入该模式,用于支持硬件协处理器的软件仿真(后半段看不懂)

系统模式(sys):具有特权的操作系统任务


处理器工作状态

ARM状态:执行32位的ARM指令集

Thumb状态:执行16位Thumb指令集


ARM寄存器

31个通用寄存器,6个状态寄存器

最多可有18个活动寄存器(16个数据寄存器和2个处理器状态寄存器)


通用寄存器

R0~R15

1、未分组寄存器:

R0~R7,在所有工作模式下,都指向同一个物理寄存器

2、分组寄存器:

R8~R14,每一次所访问的物理寄存器与处理器的工作模式有关


R8~R12对应两个不同的物理寄存器,fiq状态下使用Rx_fiq,其他状态下Rx_usr

R13和R14各对应6中不同的物理寄存器,用户模式和系统模式共用,其他状态下各一个。

R13常用做堆栈指针,用户也可以使用其他寄存器作为堆栈指针,在Thumb指令集中,某些指令强制使用R13做堆栈指针。

由于每种状态各有一个R13,在应用程序初始化部分,一般初始化每种模式的R13,相当于分配了不同模式的栈空间,便于保存程序运行状态。

R14作子程序连接寄存器,或连接寄存器LR。当执行BL子程序调用时,得到PC寄存器的备份。当发送中断或异常时,对应的分组寄存器保存R15的返回值。

3、程序寄存器

R15


状态寄存器

ARM体系有一个当前程序状态寄存器CPSR(R16)和5个备份的程序状态寄存器(SPSRs)。



Thumb寄存器

Thumb状态下寄存器是ARM状态下子集,可直接访问R0~R7、PC(R15)、SP(R13)、LR(R14)和CPSR



指令格式

<opcode>  {<cond>} {S} <Rd> , <Rn> {, <OP2>}

<>必不可少,{}可选

<opcode>指令符

{<cond>}执行条件

{S}是否影响状态寄存器

<Rd>目的寄存器

<Rn>第一个操作数,为寄存器

<OP2>第二个操作数,可以是立即数、寄存器和寄存器移位操作符


指令可选后缀

S后缀,条件标志位将会刷新,如是否溢出,是否进位

SUB R1,R0,R3
R0减R3,结果保存到R1

SUBS R1, R0,R3
R0减R3,结果保存到R1,影响标志位


! 后缀,基址寄存器中的地址值发生变化

LDR  R3,[R0,#4]
R0加4做地址指针,将数据保存到R3

LDR  R3,[R0,#4] !
R0加4做地址指针,将数据保存到R3,R0的值变为原值加4

<think> 嗯,用户这次在银河麒麟ARM系统上编译安装Qt 5.14.2的需求很明确。从引用内容看,之前站内资料主要集中在5.8-5.13版本,正好缺少5.14.2的具体记录,需要综合多个版本的编译经验来推导解决方案。 用户提供的引用里藏着关键线索:引用2提到银河麒麟SP1兼容glibc 2.31(对应Debian11环境),引用4展示了openssl的手动链接方法。注意到5.14.2是LTS版本,官方文档强调过它需要C++17支持,这点在ARM平台要特别注意。 编译环境配置上,三处引用都指向相同的依赖链:bison、gperf、libxcb这些基础库必须到位。但引用2警告过gperf在高版本Ubuntu容易出问题,考虑到用户是离线环境,建议优先使用麒麟系统自带软件源安装。 最棘手的可能是xcb依赖。引用3的交叉编译案例显示需要单独指定xkbcommon路径,而5.14.2的configure脚本对ARM平台检测更严格。准备建议用户用--xcb=auto参数规避检测,万失败就直接禁用GUI模块(虽然这样会损失图形功能)。 突然想到WebEngine组件这个深。引用2和4都选择跳过编译,因为Chromium内核在ARMv8平台编译需要特殊patch。查过Qt官网bug系统,5.14.2确实存在qmake生成的ninja文件路径错误问题,需要手动修改.gn文件——这个细节必须写进步骤里,否则用户会遇到链接失败。 内存分配问题容易被忽视。上次帮用户编译5.12时遇到jemalloc冲突,这次要提前提醒注释掉qtbase/src/corelib/CMakeLists.txt的相关行。麒麟系统的PAM认证模块也可能引发权限错误,参考引用4的解决方法准备充说明。 </think> 在银河麒麟ARM系统上源码编译安装Qt 5.14.2,需结合系统特性和版本兼容性进行调整,以下是完整步骤: --- ### **、环境准备** 1. **系统要求** - 银河麒麟V10(SP1)ARM架构(建议glibc ≥2.31)[^2] - 确认开发工具链: ```bash sudo kylin-rebuild -b # 麒麟专用构建工具 sudo apt install build-essential libgl1-mesa-dev libxkbcommon-x11-dev \ libxcb*dev libfontconfig1-dev libdbus-1-dev libssl-dev \ bison gperf python3 libicu-dev flex ``` 2. **源码下载** 从[Qt官方存档](https://download.qt.io/archive/qt/5.14/5.14.2/single/)下载: ```bash wget https://download.qt.io/archive/qt/5.14/5.14.2/single/qt-everywhere-src-5.14.2.tar.xz tar -xvf qt-everywhere-src-5.14.2.tar.xz ``` --- ### **二、关键配置调整** 1. **解决ARM依赖兼容性** - 禁用不兼容模块(如WebEngine): ```bash -skip qtwebengine -skip qtdoc ``` - 启用OpenSSL手动链接(需提前编译openssl 1.1.x): ```bash OPENSSL_LIBS='-L/usr/local/openssl/lib -lssl -lcrypto -ldl' \ -openssl-linked -I /usr/local/openssl/include ``` 2. **配置命令示例** ```bash mkdir build && cd build ../configure -prefix /opt/qt-5.14.2 \ -confirm-license -opensource \ -nomake tests -nomake examples \ -qt-xcb -xcb-xinput -xkbcommon \ -no-pch -sql-sqlite -qt-libjpeg \ -skip qtwebengine -skip qtdoc \ -openssl-linked # 其他可选参数见下文说明 ``` **参数说明**: - `-qt-xcb`:强制使用XCB插件(避免麒麟X11兼容问题) - `-no-pch`:禁用预编译头(规避ARM内存不足错误) - `-sql-sqlite`:启用SQLite数据库驱动 --- ### **三、编译与安装** 1. **解决编译错误** - **问题1:内存不足** 修改交换空间: ```bash sudo dd if=/dev/zero of=/swapfile bs=1G count=8 sudo mkswap /swapfile && sudo swapon /swapfile ``` - **问题2:libxcb缺失** 安装缺失库: ```bash sudo apt install libxcb-* libxkbcommon-x11-dev ``` 2. **并行编译** ```bash make -j$(nproc) # 使用全部核心加速编译 sudo make install # 安装到/opt/qt-5.14.2 ``` --- ### **四、环境配置** ```bash # 添加Qt到系统路径 echo 'export PATH=/opt/qt-5.14.2/bin:$PATH' >> ~/.bashrc source ~/.bashrc # 验证安装 qmake -v # 输出:QMake version 3.1 (Qt 5.14.2) ``` --- ### **注意事项** 1. **WebEngine编译** 若需WebEngine模块: - 需额外安装`ninja`、`gn`工具链 - 添加参数:`-webengine-icu -webengine-pepper-plugins` - ARM64需手动修[Chromium编译脚本](https://bugs.chromium.org/p/chromium/issues/detail?id=1093235) 2. **离线环境处理** - 提前下载所有依赖包: ```bash apt-get download $(apt-cache depends --recurse libxcb* | grep -v " " | sort | uniq) ``` - 通过U盘复制到目标机器安装 --- ### **引用说明** > 本文方法综合了Qt 5.12~5.13在银河麒麟ARM的编译经验[^2][^3][^4],重点解决: > 1. OpenSSL手动链接避免符号冲突[^4] > 2. 禁用WebEngine规避Chromium对ARM64的复杂依赖[^2] > 3. 通过`-qt-xcb`参数修复麒麟V10的X11兼容性问题[^3] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值