NDK 编译armebai-v7a的非4字节对齐crash Fatal signal 7 (SIGSEGV) 错误解决

在从armabi迁移到armebai-v7a架构时,遇到编译后的SO文件运行时Crash问题,表现为Fatal signal 7 (SIGSEGV)错误。问题根源在于armebi-v7a的CPU需要4字节对齐的浮点指令。即使进行了内存分配,对浮点变量的指针偏移可能导致对齐问题,引发硬件错误。通过断言和测试,最终找到了导致Crash的确切代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直都是编译armabi的,没有任何问题,这个架构是软件模拟浮点运算的。

后来看到NDK文档上说armabi-v7a是针对有硬件处理浮点计算的arm cpu的。

于是就修改配置编译armebai-v7a的so文件。



结果是编译没问题,一运行就是crash掉,Fatal signal 7 (SIGSEGV)错误。

进过排查才发现,crash掉的仅仅是对一个浮点变量赋值而已。

只不过,这个浮点内存,是一个连续内存中的一部分。



经过排查才发现,这个so文件使用了浮点指令,需要指针4字节对齐。举个例子

char*  ptr = malloc(10);
float* f   = (float*) (ptr + 2);
f[0]       = 1.0f;

 这里f[0]就会crash掉,使用f指针的访问操作就报错。因为f指针没有4字节对齐。 

malloc可以保证返回的指针是对齐的,对指针的偏移操作,导致指针没有4字节对齐,是非常隐蔽的。

究其原因,是因为arm cpu的指令,要求内存访问是4字节的整数倍,否则就会发生硬件报错。

当我断言代码中一定是这样的错误原因的时候。我做了一个测试,在程序启动的时候,用了以上代码。

然而,然而,并没有crash掉, 我了个fuck啊~

进过我锲而不舍的各种测试和猜测,我找到了必定crash的代码。如下

char*  ptr = malloc(10);
float* f   = (float*) (ptr + 2);
for (int i = 0; i < 1; i++) {
     f[0]  = 1.0f;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值