zoukankan      html  css  js  c++  java
  • NDK 编译armebai-v7a的非4字节对齐crash Fatal signal 7 (SIGSEGV) 错误解决

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




  • 相关阅读:
    正交矩阵(部分转载)
    向量的点乘和叉乘
    随机森林
    PCA和LDA
    SIFT和SURF特征(草稿)
    12-赵志勇机器学习-Label_Propagation
    11-赵志勇机器学习-DBSCAN聚类
    09-赵志勇机器学习-k-means
    10-赵志勇机器学习-meanshift
    09-numpy-笔记-repeat
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6757925.html
Copyright © 2011-2022 走看看