解決uboot編譯問題__aeabi_uidivmod'和o `__aeabi_uidiv'沒定義的錯誤

迷霧綠洲發表於2014-05-27

undefined reference to `__aeabi_uidivmod'和undefined reference to `__aeabi_uidiv' 這個錯誤在uboot的編譯過程中很容易出現

先分析這個原因 :

這兩個函式算是lib函式 具體應用在除法應用 如果程式中使用了 ‘/’ ‘%’這些運算 那就要用到這兩個函式了

最簡單的解決辦法就是將程式中的除法都改用移位運算避免使用底層庫

這裡增加一個討論為什麼有些程式同樣有除運算卻沒有這個錯誤提示

這就是編譯器的深層問題了:

Uboot是個非GNU/Linux的程式,不是一個系統 而是一個裸機程式

而交叉編譯器arm-XXX-linux-gnueabi是GNU/Linux工具鏈,是可以正常編譯Linux核心等東西的,市區編譯系統的    系統裡面就帶有了libc  ulibc 這些庫函式

但是去編譯非GNU/Linux的Uboot的話,就會出現:

當出現被0除的情況時,會呼叫__aeabi_ldiv0(即eabi版本的__div0),當在GNU/Linux系統中時,其會去觸發系統的SIGFPE,進而呼叫到對應的raise(3)函式。

而此處,由於Uboot不是Linux類程式,沒有對應的raise()函式,所以報錯找不到。

這裡提供另一種的解決方法就是在 對應的lowlevelinit.s中增加需要呼叫的那個raise()函式

這個raise()直接寫個空的就可以了

這裡提供一個例子:




相關文章