[問題記錄]編譯AArch64平臺的sigar源碼遇到的問題

因爲平臺使用了sigar來獲取系統信息,在國產化平臺下(華爲鯤鵬CPU、UOS系統)需要重新編譯得到aarch64對應的so依賴文件[libsigar-aarch64-linux.so]。以下是編譯中遇到的問題,這些問題在sigar源碼的Issues裏都有回答,只是源碼沒有再維護更新了而已。

編譯環境

/home/sigar# uname -a
Linux xxx-PC 4.19.0-arm64-desktop #1705 SMP Wed Mar 25 18:04:38 CST 2020 aarch64 GNU/Linux

/home/sigar#java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b01-1~deb9u1-b01)
OpenJDK 64-Bit Server VM (build 25.212-b01, mixed mode)

(一)編譯

編譯的命令是在sigar源碼的bindings/java路徑下使用ant命令編譯

/home/sigar# cd bindings/java/
/home/sigar/bindings/java# ant

(二)編譯失敗

使用ant編譯後報錯,報錯信息截取如下:

jni-cc:
    [mkdir] Created dir: /home/sigar/bindings/java/build/obj/aarch64-linux/lib
     [echo] jni libname=sigar-aarch64-linux
       [cc] 13 total files to be compiled.
       [cc] gcc: error: unrecognized command line option ‘-m64’

BUILD FAILED
/home/sigar/bindings/java/hyperic_jni/jni-build.xml:224: The following error occurred while executing this line:
/home/sigar/bindings/java/hyperic_jni/jni-build.xml:270: gcc failed with return code 1

Total time: 3 seconds

解決方案
參照Issuse 104中vielmetti 提供的修改內容
修改sigar/bindings/java/hyperic_jni/src/org/hyperic/jni/ArchNameTask.java78行的代碼

if (ArchLoader.IS_LINUX) {
    if (!osArch.equals("ia64") 
        && !osArch.equals("aarch64")) {
        getProject().setProperty("jni.gccm", "-m64");
    }
}

避免在aarch64中引入-m64參數

再次使用ant命令編譯,至此應該編譯成功。so文件生成在sigar/bindings/java/sigar-bin/lib文件夾下,但是在使用時仍然有些問題。

(三)版本不匹配

運行時提示

minor version mismatch: (6!=7) java=1.6.6.0, native=1.7.0.0
org.hyperic.sigar.SigarException: minor version mismatch: (6!=7) java=1.6.6.0, native=1.7.0.0
        at org.hyperic.sigar.Sigar.checkVersion(Sigar.java:147)
        at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:106)
        at com.grgbanking.hyi9.listenerdemo.FileTest.f19(FileTest.java:82)
        at com.grgbanking.hyi9.listenerdemo.FileTest.main(FileTest.java:51)

使用sigar的master分支編譯出的libsigar-aarch64-linux.so文件對應的sigar版本是1.7。而我們下載的編譯好的sigar一般是1.6。
如果要使用已有的1.6版本,則需要使用sigar1.6分支源碼進行編譯得到的libsigar-aarch64-linux.so文件。
如果想要使用master分支編譯的so文件,則需要上一步編譯成功後sigar/bindings/java/sigar-bin/lib文件夾下的sigar.jar文件。

(四)運行異常

運行時提示

java: symbol lookup error: /xxx/xxx/libsigar-aarch64-linux.so: undefined symbol: sigar_skip_token

參照Issuse 60中提供的解決方案,在https://github.com/hyperic/sigar/blob/sigar-1.6/bindings/java/hyperic_jni/jni-build.xml326行後插入

<compilerarg value="-fgnu89-inline"/>

(五)其他

在最初編譯時可能因爲系統環境問題,出現了"error: called object ‘XXXX’ is not a function or function pointer"異常,錯誤提示如下:

/home/sigar/src/os/linux/linux_sigar.c:1177:22: error: called object ‘major’ is not a function or function pointer
 #define ST_MAJOR(sb) major((sb).st_rdev)
                      ^~~~~
/home/sigar/src/os/linux/linux_sigar.c:1266:23: note: in expansion of macro ‘ST_MAJOR’
         if ((major == ST_MAJOR(sb)) &&
                       ^~~~~~~~
/home/sigar/src/os/linux/linux_sigar.c:1261:23: note: declared here
         unsigned long major, minor;
                       ^~~~~
/home/sigar/src/os/linux/linux_sigar.c:1178:22: error: called object ‘minor’ is not a function or function pointer
 #define ST_MINOR(sb) minor((sb).st_rdev)
                      ^~~~~

這部分可能與編譯方式以及編譯環境有關,最開始使用的是cmake編譯,java版本也感覺不大正常,換了一臺機器並且使用ant編譯後就沒有遇到這個問題,有點奇怪。

編譯使用的系統及CPU信息如下

操作系統內核信息

xxx@xxx-PC:~$ uname -a
Linux xxx-PC 4.19.0-arm64-desktop #1705 SMP Wed Mar 25 18:04:38 CST 2020 aarch64 GNU/Linux

顯示發行版本信息

xxx@xxx-PC:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Uos
Description:    uos 20 SP1
Release:        20 SP1
Codename:       n/a

操作系統版本信息

xxx@xxx-PC:~$ cat /proc/version
Linux version 4.19.0-arm64-desktop (deepin@deepin-PC) (gcc version 8.3.0 (Debian 8.3.0-6)) #1705 SMP Wed Mar 25 18:04:38 CST 2020

CPU信息

xxx@xxx-PC:~$ cat /proc/cpuinfo
processor       : 0
model name      : HUAWEI Kunpeng 920 1229K
BogoMIPS        : 200.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm
CPU implementer : 0x48
CPU architecture: aarch64
CPU variant     : 0x1
CPU part        : 0xd01
CPU revision    : 0

processor       : 1
model name      : HUAWEI Kunpeng 920 1229K
BogoMIPS        : 200.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm
CPU implementer : 0x48
CPU architecture: aarch64
CPU variant     : 0x1
CPU part        : 0xd01
CPU revision    : 0

processor       : 2
model name      : HUAWEI Kunpeng 920 1229K
BogoMIPS        : 200.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm
CPU implementer : 0x48
CPU architecture: aarch64
CPU variant     : 0x1
CPU part        : 0xd01
CPU revision    : 0

processor       : 3
model name      : HUAWEI Kunpeng 920 1229K
BogoMIPS        : 200.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm
CPU implementer : 0x48
CPU architecture: aarch64
CPU variant     : 0x1
CPU part        : 0xd01
CPU revision    : 0

重新編譯後,使用得到的so文件,在系統裏已經能夠獲取硬件信息。
修改後的源碼放在https://github.com/theodore26/sigar,編譯後的libsigar-aarch64-linux.so和sigar.jar在https://download.csdn.net/download/theodore26/12411082
如果缺少aarch64平臺的編譯環境,可以在華爲雲上註冊新賬號然後申請1個月的雲服務器試用,我之前申請到的就是aarch64平臺的環境(購買的1年華爲雲反而是X86架構的),也可以編譯成功,不過之後沒有測試編譯出的結果,理論上應該是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章