一直都是编译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字节对齐的赋值代码,改动掉之后,执行就没有问题了。

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

  1. levmar ndk 编译

         levmar是一个强大的和高效率的C/C++库,采用Levenberg - 马奎德(LM)优化算法, 主要是为了解决非线性最小二乘问题.官网是:http://users.ics.forth. ...

  2. C语言字节对齐问题详解

    引言 考虑下面的结构体定义: typedef struct{ char c1; short s; char c2; int i; }T_FOO; 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始 ...

  3. C语言字节对齐问题详解(对齐、字节序、网络序等)

    首先说明一下,本文是转载自: http://www.cnblogs.com/clover-toeic/p/3853132.html 博客园用的少,不知道怎么发布转载文章,只能暂时这样了. 引言 考虑下 ...

  4. C语言字节对齐问题详解【转】

    引言 转自:http://www.cnblogs.com/clover-toeic/p/3853132.html 考虑下面的结构体定义: 1 typedef struct{ 2 char c1; 3 ...

  5. [转]C语言字节对齐问题详解

    C语言字节对齐问题详解 转载:https://www.cnblogs.com/clover-toeic/p/3853132.html 引言 考虑下面的结构体定义: typedef struct{ ch ...

  6. delphi的字节对齐

    如果不改编译选项Delphi的Record默认也是4字节对齐的. 可以用编译开关指定 {$A4+}就是4字节对齐.同理{$A2+}.{$A1+}等.{$A1+}等同于Packed Record 主要容 ...

  7. 在非NDK编译条件下使用Android Log函数

    解决的需求 有些时候不能在NDK环境编译,或者使用NDK编译会颇费周折,然后又想使用Android系统自带的Log类方法,那么我们就可以使用dlopen来实现我们的目的.比如在OpenCV中添加And ...

  8. arm 及ndk编译

        首页  »   Android android的armeabi跟armeabi-v7a 网友分享于:2014-03-16  浏览:867次 android的armeabi和armeabi-v7 ...

  9. 使用ndk编译c可执行程序

    1.创建工程目录  在ubuntu系统下搭建好ndk编译环境,创建test目录 mkdir test 在test目录下创建jni目录 cd test mkdir jni 2.编写源代码 vim hel ...

随机推荐

  1. [Visual Studio] 重置默认设置 还原默认设置

    恢复默认设置的2种方法 如果VS出现问题或设置变乱,可以通过恢复默认设置使之回到安装成功时的状态,从而解决出现的问题.VS恢复默认设置的方法有2种,分别是:通过“导入和导出设置”实现和通过命令实现. ...

  2. SyncTrayzor -- Windows tray utility / filesystem watcher / launcher for syncthing

    SyncTrayzor is a little tray utility for Syncthing on Windows. It hosts and wraps Syncthing, making ...

  3. Linux系统优势六大方面

    Linux系统越来越受到电脑用户的欢迎,于是很多人开始学习Linux.Linux系统之所以会成为目前最受关注的系统之一,主要原因是它的免费,以及系统的开放性,可以随时取得程序的原代码,这对于程序开发人 ...

  4. cocos2d0基础篇笔记一

    1.了解了基本的几个类:Director(导演),Scene(场景),Layer(层),Sprite(精灵): 2.创建精灵: CCSize visiblesize=CCDirector::share ...

  5. 如何使用C#关键字const,readonly,static

    如果有一个值不太会变化,我们经常使用const和readonly,这2者有何不同呢?有时候,我们也会在readonly之前加上关键字static,这又意味着什么呢? const ● const默认是静 ...

  6. 撤销正在审核的app

    一个app还未通过审核,但是新版本已经出来了,怎样才能撤销正在审核的app呢? 方法:在 是binary deatils里用 reject this binary.之后,即可以重新上传代码了.

  7. 【docker】docker部署spring boot项目在服务器上

    IDE:idea 工具:docker spring boot:2.0.1 ======================================== 简单记录一下流程,以供参考: 第一步:首先得 ...

  8. cocos2d-x avdrid 试例

    今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2d-x ...

  9. idea打包可执行文件

    背景: 有时候,我们会用IDEA来开发一些小工具,需要打成可运行的JAR 包:或者某些项目不是WEB应用,纯粹是后台应用,发布时,也需要打成可运行的JAR包.并且,如果依赖第三方jar时,又不希望第三 ...

  10. 使用Artful MySQL模块出错

    总是报错: root@gitlab:/opt# newlisp newLISP v.10.6.0 64-bit on Linux IPv4/6 UTF-8 libffi, options: newli ...