因爲平臺使用了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架構的),也可以編譯成功,不過之後沒有測試編譯出的結果,理論上應該是一樣的。