shayne's blog

Unknown-symbol-__aeabi_uldivmod 解決方式

2019/03/01 Share

Module無法載入,debug message出現Unknown-symbol-__aeabi_uldivmod的解決方式


問題

在Ubuntu桌電上cross compile給bananapi image時,並沒有出現編譯錯誤
然而bananapi開機時出現某個module載入失敗,並出現Unknown-symbol-__aeabi_uldivmod

發生原因

在32-bit CPU上進行64-bit變數的除法運算,例如:

1
2
3
u64 a1 = 1000;
u32 a2 = 10;
u64 res = a1 / a2;

解決方式

使用do_div()進行除法運算(定義於<asm/div64.h>)

1
2
3
4
5
6
7
8
9
10
11
#include <asm/div64.h>

u64 a1 = 1000;
u32 a2 = 10;

u64 tmp = a1;
u32 rem; /* remainder */

/* a1/a2 and store result in tmp *
* store remainder in rem */
rem = do_div(tmp, a2);

do_div()的回傳值是餘數,相除的結果會被保存到被除數(當作指標傳入,如下所示),故如果不想原本的值被取代掉,要使用一個暫存變數。

1
#define do_div(n, base) __div64_32(&(n), base)

Reference

CATALOG
  1. 1. 問題
  2. 2. 發生原因
  3. 3. 解決方式
  4. 4. Reference