关闭

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

标签: androidcndk字节对齐armebai-v7a
981人阅读 评论(0) 收藏 举报
分类:

一直都是编译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;
}

是的,很奇怪,只有在循环的时候非4字节对齐才会crash,我测试了for和while都是这样。


故事的结局是,我确实有for循环非4字节对齐的赋值代码,修改掉之后,运行就没有问题了。




1
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:227806次
    • 积分:3718
    • 等级:
    • 排名:第8626名
    • 原创:138篇
    • 转载:4篇
    • 译文:0篇
    • 评论:98条
    文章分类