Android,Cmdline工具,NDK => SIGBUS

时间:2015-03-25 09:08:23

标签: android linux assembly android-ndk arm

环境

  • Android 5
  • 三星Galaxy S5(ARM)
  • C ++ ADB命令行工具

对于以下代码,我在执行" fCapacity / =(float)100.0f; "

时获得SIGBUS
                HRESULT getBatteryCapacity(OUT OUT float& fCapacity) {
                FILE* fp = fopen("/sys/class/power_supply/battery/capacity", "rt");
                if (0 == fp)
                    return HRESULT_FROM_ERRNO(errno);
                char pText[16] = { 0 };
                char* pRet = fgets(pText, sizeof(pText), fp);
                int iLastErr = errno;
                fclose(fp);
                if (0 == pRet)
                    return HRESULT_FROM_ERRNO(iLastErr);
                pRet = 0;
                fCapacity = strtof(pText, &pRet);
                if (pRet == pText)
                    return HRESULT_FROM_ERRNO(iLastErr);
                fCapacity /= (float)100.0f; // Causing SIGBUS
                return S_OK;
            }

通过汇编我可以看到执行" vldr s15,[r3] " (将存储器地址加载到32位浮点寄存器)

    ...
        return HRESULT_FROM_ERRNO(iLastErr);
    0xb6ef7ba0  ldr r3, [r11, # - 36]; 0x24
    0xb6ef7ba4  orr r3, r3, # - 2147483648; 0x80000000
    0xb6ef7ba8  orr r3, r3, #49152; 0xc000
    0xb6ef7bac  b 0xb6ef7bcc <Mobile::Android::Device::Utility::getBatteryCapacity(float&) + 344>
        fCapacity /= (float)100.0f;
    0xb6ef7bb0  ldr r3, [r11, # - 48]; 0x30
    0xb6ef7bb4  vldr s15, [r3] // <== Breaks here
    0xb6ef7bb8  vldr s14, [pc, #52]; 0xb6ef7bf4 <Mobile::Android::Device::Utility::getBatteryCapacity(float&) + 384>
    0xb6ef7bbc  vdiv.f32 s15, s15, s14
    0xb6ef7bc0  ldr r3, [r11, # - 48]; 0x30
    0xb6ef7bc4  vstr s15, [r3]
        return S_OK;
    0xb6ef7bc8  mov r3, #0
}

加载到32位浮点寄存器中的数据必须有任何内存地址对齐吗?

更新
以下(memcpy)解决了问题,但为什么????

float fCap = strtof(pText, &pRet);
if (pRet == pText)
    return HRESULT_FROM_ERRNO(iLastErr);
fCap /= (float)100.0f;
memcpy(&fCapacity, &fCap, sizeof(fCap));

0 个答案:

没有答案