最近調程序,出現illegal instruction問題,沒有頭緒。 索性把illegal instruction好好窺探一下。php
當執行一段程序時,發生錯誤,並報」illegal instruction」錯html
typedef void(*FUNC)(void); int main(void) { const static unsigned char insn[4] = { 0xff, 0xff, 0xff, 0xff }; FUNC function = (FUNC) insn; function(); }
編譯執行之:linux
$ gcc -o sigill illegal_instruction.c $ ./sigill Illegal instruction
illegal instruction,即SIGILL, 是POSIX標準中提供的一類錯誤。從名字上看,SIGILL是啓動的某個進程中的某一句不能被CPU識別成正確的指令。此類錯誤是由操做系統發送給進程的,在進程試圖執行一些形式錯誤、未知或者特權指令時操做系統會使用SIGILL信號終止程序。 SIGILL對應的常數是4.安全
進程在代碼段中的數據是要被做爲一個指令執行的。 若不當心覆蓋了已有的代碼段,可能會獲得錯誤格式的指令。這種錯誤尤爲在Just-In-Time即時編譯器中最可能出現。工具
一樣,若是不當心覆蓋了棧上活躍記錄中的返回地址,程序就可能根據這個錯誤地址,執行沒有意義的內存中的數據,進而操做。測試
進一步能夠認爲,任何致使數據錯誤的問題均可能帶來illegal instruction問題。好比硬盤發生故障。this
好比SIMD指令,自從奔騰4開始有MMX,X86的芯片就開始不停的增長和拓寬SIMD支持,SSE、SSE二、SSE三、SSE4二、AVX、AVX2。默認狀況下,不少編譯器都在O2或者O3中開了自動向量化,這就致使不少在新體系結構中編譯的可執行程序,在老機器上運行時會有illegal instruction問題。spa
對於普通C語言經過編譯器生成的可執行程序。通常都已經經過嚴格的測試,不會隨便發生這種問題。因此若是你遇到這種錯,而且試過了靜態鏈,並且程序中沒有嵌入式彙編,基本能夠判定是工具鏈出了問題。 編譯器?彙編器或者連接器。操作系統
根據Heiher的經驗,請注意出現錯誤的指令可能和訪存地址指令有關。 另外,浮點數的格式是否符合IEEE的標準也可能會有影響。.net