一直都是編譯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字節對齊的賦值代碼,改動掉之后,執行就沒有問題了。