因为平台使用了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.(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行后插入
在最初编译时可能因为系统环境问题,出现了"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编译后就没有遇到这个问题,有点奇怪。
操作系统内核信息
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架构的),也可以编译成功,不过之后没有测试编译出的结果,理论上应该是一样的。